.. | .. |
---|
61 | 61 | struct xregs_state *xsave = &tsk->thread.fpu.state.xsave; |
---|
62 | 62 | struct user_i387_ia32_struct env; |
---|
63 | 63 | struct _fpstate_32 __user *fp = buf; |
---|
| 64 | + unsigned long flags; |
---|
64 | 65 | |
---|
65 | | - fpregs_lock(); |
---|
| 66 | + flags = fpregs_lock(); |
---|
66 | 67 | if (!test_thread_flag(TIF_NEED_FPU_LOAD)) |
---|
67 | 68 | copy_fxregs_to_kernel(&tsk->thread.fpu); |
---|
68 | | - fpregs_unlock(); |
---|
| 69 | + fpregs_unlock(flags); |
---|
69 | 70 | |
---|
70 | 71 | convert_from_fxsr(&env, tsk); |
---|
71 | 72 | |
---|
.. | .. |
---|
165 | 166 | { |
---|
166 | 167 | struct task_struct *tsk = current; |
---|
167 | 168 | int ia32_fxstate = (buf != buf_fx); |
---|
| 169 | + unsigned long flags; |
---|
168 | 170 | int ret; |
---|
169 | 171 | |
---|
170 | 172 | ia32_fxstate &= (IS_ENABLED(CONFIG_X86_32) || |
---|
.. | .. |
---|
186 | 188 | * userland's stack frame which will likely succeed. If it does not, |
---|
187 | 189 | * resolve the fault in the user memory and try again. |
---|
188 | 190 | */ |
---|
189 | | - fpregs_lock(); |
---|
| 191 | + flags = fpregs_lock(); |
---|
190 | 192 | if (test_thread_flag(TIF_NEED_FPU_LOAD)) |
---|
191 | 193 | __fpregs_load_activate(); |
---|
192 | 194 | |
---|
193 | 195 | pagefault_disable(); |
---|
194 | 196 | ret = copy_fpregs_to_sigframe(buf_fx); |
---|
195 | 197 | pagefault_enable(); |
---|
196 | | - fpregs_unlock(); |
---|
| 198 | + fpregs_unlock(flags); |
---|
197 | 199 | |
---|
198 | 200 | if (ret) { |
---|
199 | 201 | if (!fault_in_pages_writeable(buf_fx, fpu_user_xstate_size)) |
---|
.. | .. |
---|
286 | 288 | struct fpu *fpu = &tsk->thread.fpu; |
---|
287 | 289 | struct user_i387_ia32_struct env; |
---|
288 | 290 | u64 user_xfeatures = 0; |
---|
| 291 | + unsigned long flags; |
---|
289 | 292 | int fx_only = 0; |
---|
290 | 293 | int ret = 0; |
---|
291 | 294 | |
---|
.. | .. |
---|
337 | 340 | * going through the kernel buffer with the enabled pagefault |
---|
338 | 341 | * handler. |
---|
339 | 342 | */ |
---|
340 | | - fpregs_lock(); |
---|
| 343 | + flags = fpregs_lock(); |
---|
341 | 344 | pagefault_disable(); |
---|
342 | 345 | ret = copy_user_to_fpregs_zeroing(buf_fx, user_xfeatures, fx_only); |
---|
343 | 346 | pagefault_enable(); |
---|
.. | .. |
---|
360 | 363 | copy_kernel_to_xregs(&fpu->state.xsave, |
---|
361 | 364 | xfeatures_mask_supervisor()); |
---|
362 | 365 | fpregs_mark_activate(); |
---|
363 | | - fpregs_unlock(); |
---|
| 366 | + fpregs_unlock(flags); |
---|
364 | 367 | return 0; |
---|
365 | 368 | } |
---|
366 | 369 | |
---|
.. | .. |
---|
382 | 385 | if (test_thread_flag(TIF_NEED_FPU_LOAD)) |
---|
383 | 386 | __cpu_invalidate_fpregs_state(); |
---|
384 | 387 | |
---|
385 | | - fpregs_unlock(); |
---|
| 388 | + fpregs_unlock(flags); |
---|
386 | 389 | } else { |
---|
387 | 390 | /* |
---|
388 | 391 | * For 32-bit frames with fxstate, copy the fxstate so it can |
---|
.. | .. |
---|
400 | 403 | * to be loaded again on return to userland (overriding last_cpu avoids |
---|
401 | 404 | * the optimisation). |
---|
402 | 405 | */ |
---|
403 | | - fpregs_lock(); |
---|
| 406 | + flags = fpregs_lock(); |
---|
404 | 407 | |
---|
405 | 408 | if (!test_thread_flag(TIF_NEED_FPU_LOAD)) { |
---|
406 | 409 | |
---|
.. | .. |
---|
413 | 416 | set_thread_flag(TIF_NEED_FPU_LOAD); |
---|
414 | 417 | } |
---|
415 | 418 | __fpu_invalidate_fpregs_state(fpu); |
---|
416 | | - fpregs_unlock(); |
---|
| 419 | + fpregs_unlock(flags); |
---|
417 | 420 | |
---|
418 | 421 | if (use_xsave() && !fx_only) { |
---|
419 | 422 | u64 init_bv = xfeatures_mask_user() & ~user_xfeatures; |
---|
.. | .. |
---|
425 | 428 | sanitize_restored_user_xstate(&fpu->state, envp, user_xfeatures, |
---|
426 | 429 | fx_only); |
---|
427 | 430 | |
---|
428 | | - fpregs_lock(); |
---|
| 431 | + flags = fpregs_lock(); |
---|
429 | 432 | if (unlikely(init_bv)) |
---|
430 | 433 | copy_kernel_to_xregs(&init_fpstate.xsave, init_bv); |
---|
431 | 434 | |
---|
.. | .. |
---|
446 | 449 | sanitize_restored_user_xstate(&fpu->state, envp, user_xfeatures, |
---|
447 | 450 | fx_only); |
---|
448 | 451 | |
---|
449 | | - fpregs_lock(); |
---|
| 452 | + flags = fpregs_lock(); |
---|
450 | 453 | if (use_xsave()) { |
---|
451 | 454 | u64 init_bv; |
---|
452 | 455 | |
---|
.. | .. |
---|
460 | 463 | if (ret) |
---|
461 | 464 | goto out; |
---|
462 | 465 | |
---|
463 | | - fpregs_lock(); |
---|
| 466 | + flags = fpregs_lock(); |
---|
464 | 467 | ret = copy_kernel_to_fregs_err(&fpu->state.fsave); |
---|
465 | 468 | } |
---|
466 | 469 | if (!ret) |
---|
467 | 470 | fpregs_mark_activate(); |
---|
468 | 471 | else |
---|
469 | 472 | fpregs_deactivate(fpu); |
---|
470 | | - fpregs_unlock(); |
---|
| 473 | + fpregs_unlock(flags); |
---|
471 | 474 | |
---|
472 | 475 | out: |
---|
473 | 476 | if (ret) |
---|