diff options
Diffstat (limited to 'arch/x86/include/asm/xsave.h')
| -rw-r--r-- | arch/x86/include/asm/xsave.h | 23 | 
1 files changed, 9 insertions, 14 deletions
diff --git a/arch/x86/include/asm/xsave.h b/arch/x86/include/asm/xsave.h index 8a1b6f9b594..0415cdabb5a 100644 --- a/arch/x86/include/asm/xsave.h +++ b/arch/x86/include/asm/xsave.h @@ -34,17 +34,14 @@  extern unsigned int xstate_size;  extern u64 pcntxt_mask;  extern u64 xstate_fx_sw_bytes[USER_XSTATE_FX_SW_WORDS]; +extern struct xsave_struct *init_xstate_buf;  extern void xsave_init(void);  extern void update_regset_xstate_info(unsigned int size, u64 xstate_mask);  extern int init_fpu(struct task_struct *child); -extern int check_for_xstate(struct i387_fxsave_struct __user *buf, -			    void __user *fpstate, -			    struct _fpx_sw_bytes *sw); -static inline int fpu_xrstor_checking(struct fpu *fpu) +static inline int fpu_xrstor_checking(struct xsave_struct *fx)  { -	struct xsave_struct *fx = &fpu->state->xsave;  	int err;  	asm volatile("1: .byte " REX_PREFIX "0x0f,0xae,0x2f\n\t" @@ -69,13 +66,13 @@ static inline int xsave_user(struct xsave_struct __user *buf)  	 * Clear the xsave header first, so that reserved fields are  	 * initialized to zero.  	 */ -	err = __clear_user(&buf->xsave_hdr, -			   sizeof(struct xsave_hdr_struct)); +	err = __clear_user(&buf->xsave_hdr, sizeof(buf->xsave_hdr));  	if (unlikely(err))  		return -EFAULT; -	__asm__ __volatile__("1: .byte " REX_PREFIX "0x0f,0xae,0x27\n" -			     "2:\n" +	__asm__ __volatile__(ASM_STAC "\n" +			     "1: .byte " REX_PREFIX "0x0f,0xae,0x27\n" +			     "2: " ASM_CLAC "\n"  			     ".section .fixup,\"ax\"\n"  			     "3:  movl $-1,%[err]\n"  			     "    jmp  2b\n" @@ -84,9 +81,6 @@ static inline int xsave_user(struct xsave_struct __user *buf)  			     : [err] "=r" (err)  			     : "D" (buf), "a" (-1), "d" (-1), "0" (0)  			     : "memory"); -	if (unlikely(err) && __clear_user(buf, xstate_size)) -		err = -EFAULT; -	/* No need to clear here because the caller clears USED_MATH */  	return err;  } @@ -97,8 +91,9 @@ static inline int xrestore_user(struct xsave_struct __user *buf, u64 mask)  	u32 lmask = mask;  	u32 hmask = mask >> 32; -	__asm__ __volatile__("1: .byte " REX_PREFIX "0x0f,0xae,0x2f\n" -			     "2:\n" +	__asm__ __volatile__(ASM_STAC "\n" +			     "1: .byte " REX_PREFIX "0x0f,0xae,0x2f\n" +			     "2: " ASM_CLAC "\n"  			     ".section .fixup,\"ax\"\n"  			     "3:  movl $-1,%[err]\n"  			     "    jmp  2b\n"  |