提交 26bef131 编写于 作者: L Linus Torvalds 提交者: 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: Nhalfdog <me@halfdog.net>
Tested-by: NBorislav Petkov <bp@suse.de>
Link: http://lkml.kernel.org/r/CA%2B55aFxQnY_PCG_n4=0w-VG=YLXL-yr7oMxyy0WU2gCBAf3ydg@mail.gmail.comSigned-off-by: NH. Peter Anvin <hpa@zytor.com>
上级 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% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册