On Sun, 2014-01-12 at 21:03 -0800, H. Peter Anvin wrote: > Hi guys, > > 26bef1318adc1b3a530ecc807ef99346db2aa8b0 should have been tagged for > stable, but it wasn't. The bug in question dates back to ancient times; > I expect it should apply without problems to any still supported tree.
I've queued this up for 3.2, but some adjustment was required as the
code lives in __math_state_restore():
--- a/arch/x86/kernel/traps.c
+++ b/arch/x86/kernel/traps.c
@@ -582,12 +582,13 @@ void __math_state_restore(struct task_st
/* 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
values. safe_address 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" (safe_address));
+ 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" (safe_address));
+ }
/*
* Paranoid restore. send a SIGSEGV if we fail to restore the state.
--- END ---
Ben.
--
Ben Hutchings
If at first you don't succeed, you're doing about average.
signature.asc
Description: This is a digitally signed message part
