|
@@ -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
|
|
/* 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
|
|
is pending. Clear the x87 state here by setting it to fixed
|
|
values. "m" is a random variable that should be in L1 */
|
|
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);
|
|
return fpu_restore_checking(&tsk->thread.fpu);
|
|
}
|
|
}
|