static inline void sanitize_restored_xstate(struct task_struct *tsk, struct user_i387_ia32_struct *ia32_env, u64 xfeatures, int fx_only) { struct xregs_state *xsave = &tsk->thread.fpu.state.xsave; struct xstate_header *header = &xsave->header; if (use_xsave()) { /* These bits must be zero. */ memset(header->reserved, 0, 48); /* * Init the state that is not present in the memory * layout and not enabled by the OS. */ if (fx_only) header->xfeatures = XFEATURE_MASK_FPSSE; else header->xfeatures &= (xfeatures_mask & xfeatures); } if (use_fxsr()) { /* * mscsr reserved bits must be masked to zero for security * reasons. */ xsave->i387.mxcsr &= mxcsr_feature_mask; convert_to_fxsr(tsk, ia32_env); } }
static inline void sanitize_restored_xstate(struct task_struct *tsk, struct user_i387_ia32_struct *ia32_env, u64 xstate_bv, int fx_only) { struct xsave_struct *xsave = &tsk->thread.fpu.state->xsave; struct xsave_hdr_struct *xsave_hdr = &xsave->xsave_hdr; if (use_xsave()) { /* These bits must be zero. */ xsave_hdr->reserved1[0] = xsave_hdr->reserved1[1] = 0; /* * Init the state that is not present in the memory * layout and not enabled by the OS. */ if (fx_only) xsave_hdr->xstate_bv = XSTATE_FPSSE; else xsave_hdr->xstate_bv &= (pcntxt_mask & xstate_bv); } if (use_fxsr()) { /* * mscsr reserved bits must be masked to zero for security * reasons. */ xsave->i387.mxcsr &= mxcsr_feature_mask; convert_to_fxsr(tsk, ia32_env); } }