Commit 26bef131 authored by Linus Torvalds's avatar Linus Torvalds Committed by H. Peter Anvin

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: default avatarhalfdog <me@halfdog.net>
Tested-by: default avatarBorislav Petkov <bp@suse.de>
Link: http://lkml.kernel.org/r/CA%2B55aFxQnY_PCG_n4=0w-VG=YLXL-yr7oMxyy0WU2gCBAf3ydg@mail.gmail.comSigned-off-by: default avatarH. Peter Anvin <hpa@zytor.com>
parent 1739f09e
...@@ -293,12 +293,13 @@ static inline int restore_fpu_checking(struct task_struct *tsk) ...@@ -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);
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment