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

Reply via email to