diff options
Diffstat (limited to 'arch/x86/include/asm/fpu-internal.h')
| -rw-r--r-- | arch/x86/include/asm/fpu-internal.h | 13 | 
1 files changed, 7 insertions, 6 deletions
diff --git a/arch/x86/include/asm/fpu-internal.h b/arch/x86/include/asm/fpu-internal.h index c49a613c6452..cea1c76d49bf 100644 --- a/arch/x86/include/asm/fpu-internal.h +++ b/arch/x86/include/asm/fpu-internal.h @@ -293,12 +293,13 @@ static inline int restore_fpu_checking(struct task_struct *tsk)  	/* AMD K7/K8 CPUs don't save/restore FDP/FIP/FOP unless an exception  	   is pending.  Clear the x87 state here by setting it to fixed  	   values. "m" is a random variable that should be in L1 */ -	alternative_input( -		ASM_NOP8 ASM_NOP2, -		"emms\n\t"		/* clear stack tags */ -		"fildl %P[addr]",	/* set F?P to defined value */ -		X86_FEATURE_FXSAVE_LEAK, -		[addr] "m" (tsk->thread.fpu.has_fpu)); +	if (unlikely(static_cpu_has(X86_FEATURE_FXSAVE_LEAK))) { +		asm volatile( +			"fnclex\n\t" +			"emms\n\t" +			"fildl %P[addr]"	/* set F?P to defined value */ +			: : [addr] "m" (tsk->thread.fpu.has_fpu)); +	}  	return fpu_restore_checking(&tsk->thread.fpu);  }  |