|
@@ -93,6 +93,17 @@ static inline int fxrstor_checking(struct i387_fxsave_struct *fx)
|
|
|
int err;
|
|
|
|
|
|
/* 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"
|
|
|
"2:\n"
|
|
|
".section .fixup,\"ax\"\n"
|
|
@@ -102,6 +113,7 @@ static inline int fxrstor_checking(struct i387_fxsave_struct *fx)
|
|
|
_ASM_EXTABLE(1b, 3b)
|
|
|
: [err] "=r" (err)
|
|
|
: [fx] "R" (fx), "m" (*fx), "0" (0));
|
|
|
+#endif
|
|
|
return err;
|
|
|
}
|
|
|
|
|
@@ -119,6 +131,17 @@ static inline int fxsave_user(struct i387_fxsave_struct __user *fx)
|
|
|
return -EFAULT;
|
|
|
|
|
|
/* 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"
|
|
|
"2:\n"
|
|
|
".section .fixup,\"ax\"\n"
|
|
@@ -128,6 +151,7 @@ static inline int fxsave_user(struct i387_fxsave_struct __user *fx)
|
|
|
_ASM_EXTABLE(1b, 3b)
|
|
|
: [err] "=r" (err), "=m" (*fx)
|
|
|
: [fx] "R" (fx), "0" (0));
|
|
|
+#endif
|
|
|
if (unlikely(err) &&
|
|
|
__clear_user(fx, sizeof(struct i387_fxsave_struct)))
|
|
|
err = -EFAULT;
|