hc
2024-11-01 2f529f9b558ca1c1bd74be7437a84e4711743404
kernel/arch/x86/kernel/fpu/signal.c
....@@ -61,11 +61,12 @@
6161 struct xregs_state *xsave = &tsk->thread.fpu.state.xsave;
6262 struct user_i387_ia32_struct env;
6363 struct _fpstate_32 __user *fp = buf;
64
+ unsigned long flags;
6465
65
- fpregs_lock();
66
+ flags = fpregs_lock();
6667 if (!test_thread_flag(TIF_NEED_FPU_LOAD))
6768 copy_fxregs_to_kernel(&tsk->thread.fpu);
68
- fpregs_unlock();
69
+ fpregs_unlock(flags);
6970
7071 convert_from_fxsr(&env, tsk);
7172
....@@ -165,6 +166,7 @@
165166 {
166167 struct task_struct *tsk = current;
167168 int ia32_fxstate = (buf != buf_fx);
169
+ unsigned long flags;
168170 int ret;
169171
170172 ia32_fxstate &= (IS_ENABLED(CONFIG_X86_32) ||
....@@ -186,14 +188,14 @@
186188 * userland's stack frame which will likely succeed. If it does not,
187189 * resolve the fault in the user memory and try again.
188190 */
189
- fpregs_lock();
191
+ flags = fpregs_lock();
190192 if (test_thread_flag(TIF_NEED_FPU_LOAD))
191193 __fpregs_load_activate();
192194
193195 pagefault_disable();
194196 ret = copy_fpregs_to_sigframe(buf_fx);
195197 pagefault_enable();
196
- fpregs_unlock();
198
+ fpregs_unlock(flags);
197199
198200 if (ret) {
199201 if (!fault_in_pages_writeable(buf_fx, fpu_user_xstate_size))
....@@ -286,6 +288,7 @@
286288 struct fpu *fpu = &tsk->thread.fpu;
287289 struct user_i387_ia32_struct env;
288290 u64 user_xfeatures = 0;
291
+ unsigned long flags;
289292 int fx_only = 0;
290293 int ret = 0;
291294
....@@ -337,7 +340,7 @@
337340 * going through the kernel buffer with the enabled pagefault
338341 * handler.
339342 */
340
- fpregs_lock();
343
+ flags = fpregs_lock();
341344 pagefault_disable();
342345 ret = copy_user_to_fpregs_zeroing(buf_fx, user_xfeatures, fx_only);
343346 pagefault_enable();
....@@ -360,7 +363,7 @@
360363 copy_kernel_to_xregs(&fpu->state.xsave,
361364 xfeatures_mask_supervisor());
362365 fpregs_mark_activate();
363
- fpregs_unlock();
366
+ fpregs_unlock(flags);
364367 return 0;
365368 }
366369
....@@ -382,7 +385,7 @@
382385 if (test_thread_flag(TIF_NEED_FPU_LOAD))
383386 __cpu_invalidate_fpregs_state();
384387
385
- fpregs_unlock();
388
+ fpregs_unlock(flags);
386389 } else {
387390 /*
388391 * For 32-bit frames with fxstate, copy the fxstate so it can
....@@ -400,7 +403,7 @@
400403 * to be loaded again on return to userland (overriding last_cpu avoids
401404 * the optimisation).
402405 */
403
- fpregs_lock();
406
+ flags = fpregs_lock();
404407
405408 if (!test_thread_flag(TIF_NEED_FPU_LOAD)) {
406409
....@@ -413,7 +416,7 @@
413416 set_thread_flag(TIF_NEED_FPU_LOAD);
414417 }
415418 __fpu_invalidate_fpregs_state(fpu);
416
- fpregs_unlock();
419
+ fpregs_unlock(flags);
417420
418421 if (use_xsave() && !fx_only) {
419422 u64 init_bv = xfeatures_mask_user() & ~user_xfeatures;
....@@ -425,7 +428,7 @@
425428 sanitize_restored_user_xstate(&fpu->state, envp, user_xfeatures,
426429 fx_only);
427430
428
- fpregs_lock();
431
+ flags = fpregs_lock();
429432 if (unlikely(init_bv))
430433 copy_kernel_to_xregs(&init_fpstate.xsave, init_bv);
431434
....@@ -446,7 +449,7 @@
446449 sanitize_restored_user_xstate(&fpu->state, envp, user_xfeatures,
447450 fx_only);
448451
449
- fpregs_lock();
452
+ flags = fpregs_lock();
450453 if (use_xsave()) {
451454 u64 init_bv;
452455
....@@ -460,14 +463,14 @@
460463 if (ret)
461464 goto out;
462465
463
- fpregs_lock();
466
+ flags = fpregs_lock();
464467 ret = copy_kernel_to_fregs_err(&fpu->state.fsave);
465468 }
466469 if (!ret)
467470 fpregs_mark_activate();
468471 else
469472 fpregs_deactivate(fpu);
470
- fpregs_unlock();
473
+ fpregs_unlock(flags);
471474
472475 out:
473476 if (ret)