|
@@ -181,11 +181,28 @@ static inline int fxrstor_checking(struct i387_fxsave_struct *fx)
|
|
|
"m" (*fx));
|
|
|
}
|
|
|
|
|
|
+static inline int fxrstor_user(struct i387_fxsave_struct __user *fx)
|
|
|
+{
|
|
|
+ if (config_enabled(CONFIG_X86_32))
|
|
|
+ return user_insn(fxrstor %[fx], "=m" (*fx), [fx] "m" (*fx));
|
|
|
+ else if (config_enabled(CONFIG_AS_FXSAVEQ))
|
|
|
+ return user_insn(fxrstorq %[fx], "=m" (*fx), [fx] "m" (*fx));
|
|
|
+
|
|
|
+ /* See comment in fpu_fxsave() below. */
|
|
|
+ return user_insn(rex64/fxrstor (%[fx]), "=m" (*fx), [fx] "R" (fx),
|
|
|
+ "m" (*fx));
|
|
|
+}
|
|
|
+
|
|
|
static inline int frstor_checking(struct i387_fsave_struct *fx)
|
|
|
{
|
|
|
return check_insn(frstor %[fx], "=m" (*fx), [fx] "m" (*fx));
|
|
|
}
|
|
|
|
|
|
+static inline int frstor_user(struct i387_fsave_struct __user *fx)
|
|
|
+{
|
|
|
+ return user_insn(frstor %[fx], "=m" (*fx), [fx] "m" (*fx));
|
|
|
+}
|
|
|
+
|
|
|
static inline void fpu_fxsave(struct fpu *fpu)
|
|
|
{
|
|
|
if (config_enabled(CONFIG_X86_32))
|