]> git.karo-electronics.de Git - karo-tx-linux.git/commitdiff
x86: use alternative instructions for fnsave/fxsave too
authorLinus Torvalds <torvalds@evo.osdl.org>
Fri, 22 Jul 2005 22:19:20 +0000 (18:19 -0400)
committerLinus Torvalds <torvalds@evo.osdl.org>
Fri, 22 Jul 2005 22:19:20 +0000 (18:19 -0400)
This one ends up using an inline asm format that claims to read memory
and then clobber it (rather than just write it directly), which made it
easier to use the existing "alternative_input()" infrastructure support.

Now the fxsave code matches the fxrstor.

include/asm-i386/i387.h

index e678609bb57ead5c910b50b4e57bf11724ea74d8..6747006743f94f49abf8339cdced9f988ce2e359 100644 (file)
@@ -33,7 +33,7 @@ extern void init_fpu(struct task_struct *);
                "nop ; frstor %1",              \
                "fxrstor %1",                   \
                X86_FEATURE_FXSR,               \
-               "m" ((tsk)->thread.i387.fsave))
+               "m" ((tsk)->thread.i387.fxsave))
 
 extern void kernel_fpu_begin(void);
 #define kernel_fpu_end() do { stts(); preempt_enable(); } while(0)
@@ -43,13 +43,12 @@ extern void kernel_fpu_begin(void);
  */
 static inline void __save_init_fpu( struct task_struct *tsk )
 {
-       if ( cpu_has_fxsr ) {
-               asm volatile( "fxsave %0 ; fnclex"
-                             : "=m" (tsk->thread.i387.fxsave) );
-       } else {
-               asm volatile( "fnsave %0 ; fwait"
-                             : "=m" (tsk->thread.i387.fsave) );
-       }
+       alternative_input(
+               "fnsave %1 ; fwait ;" GENERIC_NOP2,
+               "fxsave %1 ; fnclex",
+               X86_FEATURE_FXSR,
+               "m" (tsk->thread.i387.fxsave)
+               :"memory");
        tsk->thread_info->status &= ~TS_USEDFPU;
 }