|
@@ -33,7 +33,7 @@ extern void init_fpu(struct task_struct *);
|
|
|
"nop ; frstor %1", \
|
|
|
"fxrstor %1", \
|
|
|
X86_FEATURE_FXSR, \
|
|
|
- "m" ((tsk)->thread.i387.fsave))
|
|
|
+ "m" ((tsk)->thread.i387.fxsave))
|
|
|
|
|
|
extern void kernel_fpu_begin(void);
|
|
|
#define kernel_fpu_end() do { stts(); preempt_enable(); } while(0)
|
|
@@ -43,13 +43,12 @@ extern void kernel_fpu_begin(void);
|
|
|
*/
|
|
|
static inline void __save_init_fpu( struct task_struct *tsk )
|
|
|
{
|
|
|
- if ( cpu_has_fxsr ) {
|
|
|
- asm volatile( "fxsave %0 ; fnclex"
|
|
|
- : "=m" (tsk->thread.i387.fxsave) );
|
|
|
- } else {
|
|
|
- asm volatile( "fnsave %0 ; fwait"
|
|
|
- : "=m" (tsk->thread.i387.fsave) );
|
|
|
- }
|
|
|
+ alternative_input(
|
|
|
+ "fnsave %1 ; fwait ;" GENERIC_NOP2,
|
|
|
+ "fxsave %1 ; fnclex",
|
|
|
+ X86_FEATURE_FXSR,
|
|
|
+ "m" (tsk->thread.i387.fxsave)
|
|
|
+ :"memory");
|
|
|
tsk->thread_info->status &= ~TS_USEDFPU;
|
|
|
}
|
|
|
|