Commit 00659c4e authored by Linus Torvalds's avatar Linus Torvalds Committed by Willy Tarreau

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>
(cherry picked from commit 26bef131)
[wt: in 2.6.32, patch applies to arch/x86/include/asm/i387.h. There's
 no static_cpu_has() so we use boot_cpu_has() like other kernels do
 with gcc3.
]
Signed-off-by: default avatarWilly Tarreau <w@1wt.eu>
parent b3dc3e65
...@@ -242,12 +242,13 @@ static inline void __save_init_fpu(struct task_struct *tsk) ...@@ -242,12 +242,13 @@ static inline void __save_init_fpu(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. safe_address is a random variable that should be in L1 */ values. safe_address is a random variable that should be in L1 */
alternative_input( if (unlikely(boot_cpu_has(X86_FEATURE_FXSAVE_LEAK))) {
GENERIC_NOP8 GENERIC_NOP2, asm volatile(
"emms\n\t" /* clear stack tags */ "fnclex\n\t"
"fildl %[addr]", /* set F?P to defined value */ "emms\n\t"
X86_FEATURE_FXSAVE_LEAK, "fildl %[addr]" /* set F?P to defined value */
[addr] "m" (safe_address)); : : [addr] "m" (safe_address));
}
end: end:
task_thread_info(tsk)->status &= ~TS_USEDFPU; task_thread_info(tsk)->status &= ~TS_USEDFPU;
} }
......
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