Lines Matching +full:supervisor +full:- +full:mode

1 // SPDX-License-Identifier: GPL-2.0
33 if (__copy_from_user(fx_sw, &fxbuf->sw_reserved[0], sizeof(*fx_sw))) in check_xstate_in_sigframe()
37 if (fx_sw->magic1 != FP_XSTATE_MAGIC1) in check_xstate_in_sigframe()
46 if (__get_user(magic2, (__u32 __user *)(fpstate + current->thread.fpu.fpstate->user_size))) in check_xstate_in_sigframe()
52 trace_x86_fpu_xstate_check_failed(&current->thread.fpu); in check_xstate_in_sigframe()
55 fx_sw->magic1 = 0; in check_xstate_in_sigframe()
56 fx_sw->xstate_size = sizeof(struct fxregs_state); in check_xstate_in_sigframe()
57 fx_sw->xfeatures = XFEATURE_MASK_FPSSE; in check_xstate_in_sigframe()
67 struct xregs_state *xsave = &tsk->thread.fpu.fpstate->regs.xsave; in save_fsave_header()
73 fxsave(&tsk->thread.fpu.fpstate->regs.fxsave); in save_fsave_header()
79 __put_user(xsave->i387.swd, &fp->status) || in save_fsave_header()
80 __put_user(X86_FXSR_MAGIC, &fp->magic)) in save_fsave_header()
86 if (__get_user(swd, &fp->swd) || __put_user(swd, &fp->status)) in save_fsave_header()
103 sw_bytes->magic1 = FP_XSTATE_MAGIC1; in save_sw_bytes()
104 sw_bytes->extended_size = fpstate->user_size + FP_XSTATE_MAGIC2_SIZE; in save_sw_bytes()
105 sw_bytes->xfeatures = fpstate->user_xfeatures; in save_sw_bytes()
106 sw_bytes->xstate_size = fpstate->user_size; in save_sw_bytes()
109 sw_bytes->extended_size += sizeof(struct fregs_state); in save_sw_bytes()
122 err = __copy_to_user(&x->i387.sw_reserved, &sw_bytes, sizeof(sw_bytes)); in save_xstate_epilog()
128 (__u32 __user *)(buf + fpstate->user_size)); in save_xstate_epilog()
134 err |= __get_user(xfeatures, (__u32 __user *)&x->header.xfeatures); in save_xstate_epilog()
149 err |= __put_user(xfeatures, (__u32 __user *)&x->header.xfeatures); in save_xstate_epilog()
168 * 'buf_fx' is the 64-byte aligned pointer at which the [f|fx|x]save
172 * buf == buf_fx for 64-bit frames and 32-bit fsave frame.
173 * buf != buf_fx for 32-bit frames with fxstate.
178 * If this is a 32-bit frame with fxstate, put a fsave header before
187 struct fpstate *fpstate = tsk->thread.fpu.fpstate; in copy_fpstate_to_sigframe()
212 if (__clear_user(&xbuf->header, sizeof(xbuf->header))) in copy_fpstate_to_sigframe()
232 if (!__clear_user(buf_fx, fpstate->user_size)) in copy_fpstate_to_sigframe()
237 /* Save the fsave header for the 32-bit frames. */ in copy_fpstate_to_sigframe()
275 struct fpu *fpu = &current->thread.fpu; in restore_fpregs_from_user()
279 xrestore &= fpu->fpstate->user_xfeatures; in restore_fpregs_from_user()
283 xfd_update_state(fpu->fpstate); in restore_fpregs_from_user()
285 ret = __restore_fpregs_from_user(buf, fpu->fpstate->user_xfeatures, in restore_fpregs_from_user()
309 if (!fault_in_readable(buf, fpu->fpstate->user_size)) in restore_fpregs_from_user()
315 * Restore supervisor states: previous context switch etc has done in restore_fpregs_from_user()
316 * XSAVES and saved the supervisor states in the kernel buffer from in restore_fpregs_from_user()
324 os_xrstor_supervisor(fpu->fpstate); in restore_fpregs_from_user()
335 struct fpu *fpu = &tsk->thread.fpu; in __fpu_restore_sig()
375 * If supervisor states are available then save the in __fpu_restore_sig()
377 * supervisor state is preserved. Save the full state for in __fpu_restore_sig()
379 * saving the supervisor states and then shuffle them to in __fpu_restore_sig()
380 * the right place in memory. It's ia32 mode. Shrug. in __fpu_restore_sig()
383 os_xsave(fpu->fpstate); in __fpu_restore_sig()
390 fpregs = &fpu->fpstate->regs; in __fpu_restore_sig()
395 if (__copy_from_user(&fpregs->fxsave, buf_fx, in __fpu_restore_sig()
396 sizeof(fpregs->fxsave))) in __fpu_restore_sig()
401 if (fpregs->fxsave.mxcsr & ~mxcsr_feature_mask) in __fpu_restore_sig()
405 fpregs->fxsave.mxcsr &= mxcsr_feature_mask; in __fpu_restore_sig()
410 fpregs->xsave.header.xfeatures |= XFEATURE_MASK_FPSSE; in __fpu_restore_sig()
414 convert_to_fxsr(&fpregs->fxsave, &env); in __fpu_restore_sig()
422 * fx_only mode as well because that has only FP and SSE in __fpu_restore_sig()
425 * Preserve supervisor states! in __fpu_restore_sig()
429 fpregs->xsave.header.xfeatures &= mask; in __fpu_restore_sig()
430 success = !os_xrstor_safe(fpu->fpstate, in __fpu_restore_sig()
433 success = !fxrstor_safe(&fpregs->fxsave); in __fpu_restore_sig()
445 unsigned int size = fpstate->user_size; in xstate_sigframe_size()
455 struct fpu *fpu = &current->thread.fpu; in fpu__restore_sig()
466 size = xstate_sigframe_size(fpu->fpstate); in fpu__restore_sig()
502 unsigned long frame_size = xstate_sigframe_size(current->thread.fpu.fpstate); in fpu__alloc_mathframe()
504 *buf_fx = sp = round_down(sp - frame_size, 64); in fpu__alloc_mathframe()
507 sp -= sizeof(struct fregs_state); in fpu__alloc_mathframe()
523 * This space is needed on (most) 32-bit kernels, or when a 32-bit in fpu__get_fpstate_size()
524 * app is running on a 64-bit kernel. To keep things simple, just in fpu__get_fpstate_size()
526 * even for 64-bit apps on 64-bit kernels. This wastes a bit of in fpu__get_fpstate_size()