x86-64, asm: Use fxsaveq/fxrestorq in more places

Checkin d7acb92fea made use of fxsaveq
in fpu_fxsave() if the assembler supports it; this adds
fxsaveq/fxrstorq to fxrstor_checking() and fxsave_user() as well.

Reported-by: Linus Torvalds <torvalds@linux-foundation.org>
LKML-Reference: <AANLkTi=RKyHLNTq6iomZOXkc6Zw1j9iAgsq8388XmzwN@mail.gmail.com>
Signed-off-by: H. Peter Anvin <hpa@zytor.com>
This commit is contained in:
H. Peter Anvin 2010-10-22 15:33:38 -07:00
parent f5d9d249b9
commit fd35fbcdd1
1 changed files with 24 additions and 0 deletions

View File

@ -93,6 +93,17 @@ static inline int fxrstor_checking(struct i387_fxsave_struct *fx)
int err; int err;
/* See comment in fxsave() below. */ /* See comment in fxsave() below. */
#ifdef CONFIG_AS_FXSAVEQ
asm volatile("1: fxrstorq %[fx]\n\t"
"2:\n"
".section .fixup,\"ax\"\n"
"3: movl $-1,%[err]\n"
" jmp 2b\n"
".previous\n"
_ASM_EXTABLE(1b, 3b)
: [err] "=r" (err)
: [fx] "m" (*fx), "0" (0));
#else
asm volatile("1: rex64/fxrstor (%[fx])\n\t" asm volatile("1: rex64/fxrstor (%[fx])\n\t"
"2:\n" "2:\n"
".section .fixup,\"ax\"\n" ".section .fixup,\"ax\"\n"
@ -102,6 +113,7 @@ static inline int fxrstor_checking(struct i387_fxsave_struct *fx)
_ASM_EXTABLE(1b, 3b) _ASM_EXTABLE(1b, 3b)
: [err] "=r" (err) : [err] "=r" (err)
: [fx] "R" (fx), "m" (*fx), "0" (0)); : [fx] "R" (fx), "m" (*fx), "0" (0));
#endif
return err; return err;
} }
@ -119,6 +131,17 @@ static inline int fxsave_user(struct i387_fxsave_struct __user *fx)
return -EFAULT; return -EFAULT;
/* See comment in fxsave() below. */ /* See comment in fxsave() below. */
#ifdef CONFIG_AS_FXSAVEQ
asm volatile("1: fxsaveq %[fx]\n\t"
"2:\n"
".section .fixup,\"ax\"\n"
"3: movl $-1,%[err]\n"
" jmp 2b\n"
".previous\n"
_ASM_EXTABLE(1b, 3b)
: [err] "=r" (err), [fx] "=m" (*fx)
: "0" (0));
#else
asm volatile("1: rex64/fxsave (%[fx])\n\t" asm volatile("1: rex64/fxsave (%[fx])\n\t"
"2:\n" "2:\n"
".section .fixup,\"ax\"\n" ".section .fixup,\"ax\"\n"
@ -128,6 +151,7 @@ static inline int fxsave_user(struct i387_fxsave_struct __user *fx)
_ASM_EXTABLE(1b, 3b) _ASM_EXTABLE(1b, 3b)
: [err] "=r" (err), "=m" (*fx) : [err] "=r" (err), "=m" (*fx)
: [fx] "R" (fx), "0" (0)); : [fx] "R" (fx), "0" (0));
#endif
if (unlikely(err) && if (unlikely(err) &&
__clear_user(fx, sizeof(struct i387_fxsave_struct))) __clear_user(fx, sizeof(struct i387_fxsave_struct)))
err = -EFAULT; err = -EFAULT;