Merge branch 'x86-fpu-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git...
Linus Torvalds [Thu, 21 Oct 2010 20:34:32 +0000 (13:34 -0700)]
* 'x86-fpu-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip:
  x86, fpu: Merge fpu_save_init()
  x86-32, fpu: Rewrite fpu_save_init()
  x86, fpu: Remove PSHUFB_XMM5_* macros
  x86, fpu: Remove unnecessary ifdefs from i387 code.
  x86-32, fpu: Remove math_emulate stub
  x86-64, fpu: Simplify constraints for fxsave/fxtstor
  x86-64, fpu: Fix %cs value in convert_from_fxsr()
  x86-64, fpu: Disable preemption when using TS_USEDFPU
  x86, fpu: Merge __save_init_fpu()
  x86, fpu: Merge tolerant_fwait()
  x86, fpu: Merge fpu_init()
  x86: Use correct type for %cr4
  x86, xsave: Disable xsave in i387 emulation mode

Fixed up fxsaveq-induced conflict in arch/x86/include/asm/i387.h

1  2 
arch/x86/include/asm/i387.h
arch/x86/include/asm/processor.h
arch/x86/kernel/cpu/common.c
arch/x86/kernel/i387.c

@@@ -174,57 -140,26 +140,30 @@@ static inline void fpu_fxsave(struct fp
        /* Using "rex64; fxsave %0" is broken because, if the memory operand
           uses any extended registers for addressing, a second REX prefix
           will be generated (to the assembler, rex64 followed by semicolon
 -         is a separate instruction), and hence the 64-bitness is lost.
 -         Using "fxsaveq %0" would be the ideal choice, but is only supported
 -         starting with gas 2.16.
 -      asm volatile("fxsaveq %0"
 -                   : "=m" (fpu->state->fxsave));
 -         Using, as a workaround, the properly prefixed form below isn't
 +         is a separate instruction), and hence the 64-bitness is lost. */
++
 +#ifdef CONFIG_AS_FXSAVEQ
 +      /* Using "fxsaveq %0" would be the ideal choice, but is only supported
 +         starting with gas 2.16. */
 +      __asm__ __volatile__("fxsaveq %0"
 +                           : "=m" (fpu->state->fxsave));
- #elif 0
++#else
 +      /* Using, as a workaround, the properly prefixed form below isn't
           accepted by any binutils version so far released, complaining that
           the same type of prefix is used twice if an extended register is
-          needed for addressing (fix submitted to mainline 2005-11-21). */
-       __asm__ __volatile__("rex64/fxsave %0"
-                            : "=m" (fpu->state->fxsave));
- #else
-       /* This, however, we can work around by forcing the compiler to select
+          needed for addressing (fix submitted to mainline 2005-11-21).
+       asm volatile("rex64/fxsave %0"
+                    : "=m" (fpu->state->fxsave));
+          This, however, we can work around by forcing the compiler to select
           an addressing mode that doesn't require extended registers. */
-       __asm__ __volatile__("rex64/fxsave (%1)"
-                            : "=m" (fpu->state->fxsave)
-                            : "cdaSDb" (&fpu->state->fxsave));
+       asm volatile("rex64/fxsave (%[fx])"
+                    : "=m" (fpu->state->fxsave)
+                    : [fx] "R" (&fpu->state->fxsave));
 +#endif
  }
  
- static inline void fpu_save_init(struct fpu *fpu)
- {
-       if (use_xsave())
-               fpu_xsave(fpu);
-       else
-               fpu_fxsave(fpu);
-       fpu_clear(fpu);
- }
- static inline void __save_init_fpu(struct task_struct *tsk)
- {
-       fpu_save_init(&tsk->thread.fpu);
-       task_thread_info(tsk)->status &= ~TS_USEDFPU;
- }
  #else  /* CONFIG_X86_32 */
  
- #ifdef CONFIG_MATH_EMULATION
- extern void finit_soft_fpu(struct i387_soft_struct *soft);
- #else
- static inline void finit_soft_fpu(struct i387_soft_struct *soft) {}
- #endif
- static inline void tolerant_fwait(void)
- {
-       asm volatile("fnclex ; fwait");
- }
  /* perform fxrstor iff the processor has extended states, otherwise frstor */
  static inline int fxrstor_checking(struct i387_fxsave_struct *fx)
  {
Simple merge
Simple merge
Simple merge