1
0
Fork 0

x86, fpu, amd: Clear exceptions in AMD FXSAVE workaround

Before we do an EMMS in the AMD FXSAVE information leak workaround we
need to clear any pending exceptions, otherwise we trap with a
floating-point exception inside this code.

Reported-by: halfdog <me@halfdog.net>
Tested-by: Borislav Petkov <bp@suse.de>
Link: http://lkml.kernel.org/r/CA%2B55aFxQnY_PCG_n4=0w-VG=YLXL-yr7oMxyy0WU2gCBAf3ydg@mail.gmail.com
Signed-off-by: H. Peter Anvin <hpa@zytor.com>
hifive-unleashed-5.1
Linus Torvalds 2014-01-11 19:15:52 -08:00 committed by H. Peter Anvin
parent 1739f09e33
commit 26bef1318a
1 changed files with 7 additions and 6 deletions

View File

@ -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( if (unlikely(static_cpu_has(X86_FEATURE_FXSAVE_LEAK))) {
ASM_NOP8 ASM_NOP2, asm volatile(
"emms\n\t" /* clear stack tags */ "fnclex\n\t"
"fildl %P[addr]", /* set F?P to defined value */ "emms\n\t"
X86_FEATURE_FXSAVE_LEAK, "fildl %P[addr]" /* set F?P to defined value */
[addr] "m" (tsk->thread.fpu.has_fpu)); : : [addr] "m" (tsk->thread.fpu.has_fpu));
}
return fpu_restore_checking(&tsk->thread.fpu); return fpu_restore_checking(&tsk->thread.fpu);
} }