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: Jiri Slaby <jirislaby@gmail.com>
LKML-Reference: <1239190320-23952-2-git-send-email-jirislaby@gmail.com>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
This commit is contained in:
Jiri Slaby 2009-04-08 13:31:59 +02:00 committed by Ingo Molnar
parent fcb2ac5bdf
commit 34ba476a01

View File

@ -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)
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)
"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:
#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...
*/ */