Commit 34ba476a authored by Jiri Slaby's avatar Jiri Slaby Committed by Ingo Molnar

x86: unify restore_fpu_checking

Impact: cleanup

On x86_32, separate f*rstor to an inline function which makes
restore_fpu_checking the same on both platforms -> move it
outside the ifdefs.
Signed-off-by: default avatarJiri Slaby <jirislaby@gmail.com>
LKML-Reference: <1239190320-23952-2-git-send-email-jirislaby@gmail.com>
Signed-off-by: default avatarIngo Molnar <mingo@elte.hu>
parent fcb2ac5b
...@@ -75,14 +75,6 @@ static inline int fxrstor_checking(struct i387_fxsave_struct *fx) ...@@ -75,14 +75,6 @@ static inline int fxrstor_checking(struct i387_fxsave_struct *fx)
return err; return err;
} }
static inline int restore_fpu_checking(struct task_struct *tsk)
{
if (task_thread_info(tsk)->status & TS_XSAVE)
return xrstor_checking(&tsk->thread.xstate->xsave);
else
return fxrstor_checking(&tsk->thread.xstate->fxsave);
}
/* AMD CPUs don't save/restore FDP/FIP/FOP unless an exception /* AMD CPUs don't save/restore FDP/FIP/FOP unless an exception
is pending. Clear the x87 state here by setting it to fixed is pending. Clear the x87 state here by setting it to fixed
values. The kernel data segment can be sometimes 0 and sometimes values. The kernel data segment can be sometimes 0 and sometimes
...@@ -185,10 +177,9 @@ static inline void tolerant_fwait(void) ...@@ -185,10 +177,9 @@ static inline void tolerant_fwait(void)
asm volatile("fnclex ; fwait"); asm volatile("fnclex ; fwait");
} }
static inline int restore_fpu_checking(struct task_struct *tsk) /* perform fxrstor iff the processor has extended states, otherwise frstor */
static inline int fxrstor_checking(struct i387_fxsave_struct *fx)
{ {
if (task_thread_info(tsk)->status & TS_XSAVE)
return xrstor_checking(&tsk->thread.xstate->xsave);
/* /*
* The "nop" is needed to make the instructions the same * The "nop" is needed to make the instructions the same
* length. * length.
...@@ -197,7 +188,8 @@ static inline int restore_fpu_checking(struct task_struct *tsk) ...@@ -197,7 +188,8 @@ static inline int restore_fpu_checking(struct task_struct *tsk)
"nop ; frstor %1", "nop ; frstor %1",
"fxrstor %1", "fxrstor %1",
X86_FEATURE_FXSR, X86_FEATURE_FXSR,
"m" (tsk->thread.xstate->fxsave)); "m" (*fx));
return 0; return 0;
} }
...@@ -261,6 +253,14 @@ end: ...@@ -261,6 +253,14 @@ end:
#endif /* CONFIG_X86_64 */ #endif /* CONFIG_X86_64 */
static inline int restore_fpu_checking(struct task_struct *tsk)
{
if (task_thread_info(tsk)->status & TS_XSAVE)
return xrstor_checking(&tsk->thread.xstate->xsave);
else
return fxrstor_checking(&tsk->thread.xstate->fxsave);
}
/* /*
* Signal frame handlers... * Signal frame handlers...
*/ */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment