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.
Attachment:
signature.asc
Description: This is a digitally signed message part