public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
* [PATCH 0/12] x86 FPU cleanups (v2)
@ 2010-09-04  1:17 Brian Gerst
  2010-09-04  1:17 ` [PATCH 01/12] x86: Use correct type for %cr4 Brian Gerst
                   ` (12 more replies)
  0 siblings, 13 replies; 40+ messages in thread
From: Brian Gerst @ 2010-09-04  1:17 UTC (permalink / raw)
  To: hpa; +Cc: x86, linux-kernel, penberg

This patch set cleans up and merges the 32-bit and 64-bit FPU code.

v2:
- Don't write to %cr4 unless some bits are set
- Reworked the fpu_save_init() merge

[PATCH 01/12] x86: Use correct type for %cr4
[PATCH 02/12] x86: Merge fpu_init()
[PATCH 03/12] x86: Merge tolerant_fwait()
[PATCH 04/12] x86: Merge __save_init_fpu()
[PATCH 05/12] x86-64: Disable preemption when using TS_USEDFPU
[PATCH 06/12] x86-64: Fix %cs value in convert_from_fxsr()
[PATCH 07/12] x86-64: Simplify constraints for fxsave/fxtstor
[PATCH 08/12] x86-32: Remove math_emulate stub
[PATCH 09/12] x86: Remove unnecessary ifdefs from i387 code.
[PATCH 10/12] x86: Remove PSHUFB_XMM5_* macros
[PATCH 11/12] x86-32: Rewrite fpu_save_init()
[PATCH 12/12] x86: Merge fpu_save_init()

 arch/x86/include/asm/i387.h      |  195 ++++++++++---------------------------
 arch/x86/include/asm/processor.h |    4 +-
 arch/x86/kernel/cpu/common.c     |    7 --
 arch/x86/kernel/i387.c           |   52 +++++------
 arch/x86/kernel/process_64.c     |    2 +-
 arch/x86/kernel/traps.c          |   35 +------
 6 files changed, 84 insertions(+), 211 deletions(-)


^ permalink raw reply	[flat|nested] 40+ messages in thread

* [PATCH 01/12] x86: Use correct type for %cr4
  2010-09-04  1:17 [PATCH 0/12] x86 FPU cleanups (v2) Brian Gerst
@ 2010-09-04  1:17 ` Brian Gerst
  2010-09-04  6:45   ` Pekka Enberg
  2010-09-10  1:46   ` [tip:x86/fpu] " tip-bot for Brian Gerst
  2010-09-04  1:17 ` [PATCH 02/12] x86: Merge fpu_init() Brian Gerst
                   ` (11 subsequent siblings)
  12 siblings, 2 replies; 40+ messages in thread
From: Brian Gerst @ 2010-09-04  1:17 UTC (permalink / raw)
  To: hpa; +Cc: x86, linux-kernel, penberg

%cr4 is 64-bit in 64-bit mode (although the upper 32-bits are currently reserved).
Use unsigned long for the temporary variable to get the right size.

Signed-off-by: Brian Gerst <brgerst@gmail.com>
---
 arch/x86/include/asm/processor.h |    4 ++--
 1 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/arch/x86/include/asm/processor.h b/arch/x86/include/asm/processor.h
index 325b7bd..396b80f 100644
--- a/arch/x86/include/asm/processor.h
+++ b/arch/x86/include/asm/processor.h
@@ -602,7 +602,7 @@ extern unsigned long		mmu_cr4_features;
 
 static inline void set_in_cr4(unsigned long mask)
 {
-	unsigned cr4;
+	unsigned long cr4;
 
 	mmu_cr4_features |= mask;
 	cr4 = read_cr4();
@@ -612,7 +612,7 @@ static inline void set_in_cr4(unsigned long mask)
 
 static inline void clear_in_cr4(unsigned long mask)
 {
-	unsigned cr4;
+	unsigned long cr4;
 
 	mmu_cr4_features &= ~mask;
 	cr4 = read_cr4();
-- 
1.7.2.2


^ permalink raw reply related	[flat|nested] 40+ messages in thread

* [PATCH 02/12] x86: Merge fpu_init()
  2010-09-04  1:17 [PATCH 0/12] x86 FPU cleanups (v2) Brian Gerst
  2010-09-04  1:17 ` [PATCH 01/12] x86: Use correct type for %cr4 Brian Gerst
@ 2010-09-04  1:17 ` Brian Gerst
  2010-09-04  6:45   ` Pekka Enberg
  2010-09-10  1:46   ` [tip:x86/fpu] x86, fpu: " tip-bot for Brian Gerst
  2010-09-04  1:17 ` [PATCH 03/12] x86: Merge tolerant_fwait() Brian Gerst
                   ` (10 subsequent siblings)
  12 siblings, 2 replies; 40+ messages in thread
From: Brian Gerst @ 2010-09-04  1:17 UTC (permalink / raw)
  To: hpa; +Cc: x86, linux-kernel, penberg

Make fpu_init() handle 32-bit setup.

Signed-off-by: Brian Gerst <brgerst@gmail.com>
---
 arch/x86/kernel/cpu/common.c |    7 -------
 arch/x86/kernel/i387.c       |   30 ++++++++++++++----------------
 arch/x86/kernel/traps.c      |   12 ------------
 3 files changed, 14 insertions(+), 35 deletions(-)

diff --git a/arch/x86/kernel/cpu/common.c b/arch/x86/kernel/cpu/common.c
index 490dac6..f9e23e8 100644
--- a/arch/x86/kernel/cpu/common.c
+++ b/arch/x86/kernel/cpu/common.c
@@ -1264,13 +1264,6 @@ void __cpuinit cpu_init(void)
 	clear_all_debug_regs();
 	dbg_restore_debug_regs();
 
-	/*
-	 * Force FPU initialization:
-	 */
-	current_thread_info()->status = 0;
-	clear_used_math();
-	mxcsr_feature_mask_init();
-
 	fpu_init();
 	xsave_init();
 }
diff --git a/arch/x86/kernel/i387.c b/arch/x86/kernel/i387.c
index a46cb35..1f082f3 100644
--- a/arch/x86/kernel/i387.c
+++ b/arch/x86/kernel/i387.c
@@ -80,7 +80,6 @@ static void __cpuinit init_thread_xstate(void)
 #endif
 }
 
-#ifdef CONFIG_X86_64
 /*
  * Called at bootup to set up the initial FPU state that is later cloned
  * into all processes.
@@ -88,12 +87,21 @@ static void __cpuinit init_thread_xstate(void)
 
 void __cpuinit fpu_init(void)
 {
-	unsigned long oldcr0 = read_cr0();
-
-	set_in_cr4(X86_CR4_OSFXSR);
-	set_in_cr4(X86_CR4_OSXMMEXCPT);
+	unsigned long cr0;
+	unsigned long cr4_mask = 0;
 
-	write_cr0(oldcr0 & ~(X86_CR0_TS|X86_CR0_EM)); /* clear TS and EM */
+	if (cpu_has_fxsr)
+		cr4_mask |= X86_CR4_OSFXSR;
+	if (cpu_has_xmm)
+		cr4_mask |= X86_CR4_OSXMMEXCPT;
+	if (cr4_mask)
+		set_in_cr4(cr4_mask);
+
+	cr0 = read_cr0();
+	cr0 &= ~(X86_CR0_TS|X86_CR0_EM); /* clear TS and EM */
+	if (!HAVE_HWFP)
+		cr0 |= X86_CR0_EM;
+	write_cr0(cr0);
 
 	if (!smp_processor_id())
 		init_thread_xstate();
@@ -104,16 +112,6 @@ void __cpuinit fpu_init(void)
 	clear_used_math();
 }
 
-#else	/* CONFIG_X86_64 */
-
-void __cpuinit fpu_init(void)
-{
-	if (!smp_processor_id())
-		init_thread_xstate();
-}
-
-#endif	/* CONFIG_X86_32 */
-
 void fpu_finit(struct fpu *fpu)
 {
 #ifdef CONFIG_X86_32
diff --git a/arch/x86/kernel/traps.c b/arch/x86/kernel/traps.c
index 60788de..d0029eb 100644
--- a/arch/x86/kernel/traps.c
+++ b/arch/x86/kernel/traps.c
@@ -881,18 +881,6 @@ void __init trap_init(void)
 #endif
 
 #ifdef CONFIG_X86_32
-	if (cpu_has_fxsr) {
-		printk(KERN_INFO "Enabling fast FPU save and restore... ");
-		set_in_cr4(X86_CR4_OSFXSR);
-		printk("done.\n");
-	}
-	if (cpu_has_xmm) {
-		printk(KERN_INFO
-			"Enabling unmasked SIMD FPU exception support... ");
-		set_in_cr4(X86_CR4_OSXMMEXCPT);
-		printk("done.\n");
-	}
-
 	set_system_trap_gate(SYSCALL_VECTOR, &system_call);
 	set_bit(SYSCALL_VECTOR, used_vectors);
 #endif
-- 
1.7.2.2


^ permalink raw reply related	[flat|nested] 40+ messages in thread

* [PATCH 03/12] x86: Merge tolerant_fwait()
  2010-09-04  1:17 [PATCH 0/12] x86 FPU cleanups (v2) Brian Gerst
  2010-09-04  1:17 ` [PATCH 01/12] x86: Use correct type for %cr4 Brian Gerst
  2010-09-04  1:17 ` [PATCH 02/12] x86: Merge fpu_init() Brian Gerst
@ 2010-09-04  1:17 ` Brian Gerst
  2010-09-04  6:46   ` Pekka Enberg
  2010-09-10  1:46   ` [tip:x86/fpu] x86, fpu: " tip-bot for Brian Gerst
  2010-09-04  1:17 ` [PATCH 04/12] x86: Merge __save_init_fpu() Brian Gerst
                   ` (9 subsequent siblings)
  12 siblings, 2 replies; 40+ messages in thread
From: Brian Gerst @ 2010-09-04  1:17 UTC (permalink / raw)
  To: hpa; +Cc: x86, linux-kernel, penberg

Commit e2e75c91 merged the math exception handler, allowing both 32-bit
and 64-bit to handle math exceptions from kernel mode.  Switch to using
the 64-bit version of tolerant_fwait() without fnclex, which simply
ignores the exception if one is still pending from userspace.

Signed-off-by: Brian Gerst <brgerst@gmail.com>
---
 arch/x86/include/asm/i387.h |   19 ++++---------------
 1 files changed, 4 insertions(+), 15 deletions(-)

diff --git a/arch/x86/include/asm/i387.h b/arch/x86/include/asm/i387.h
index a73a8d5..5d8f9a7 100644
--- a/arch/x86/include/asm/i387.h
+++ b/arch/x86/include/asm/i387.h
@@ -77,15 +77,6 @@ static inline void sanitize_i387_state(struct task_struct *tsk)
 }
 
 #ifdef CONFIG_X86_64
-
-/* Ignore delayed exceptions from user space */
-static inline void tolerant_fwait(void)
-{
-	asm volatile("1: fwait\n"
-		     "2:\n"
-		     _ASM_EXTABLE(1b, 2b));
-}
-
 static inline int fxrstor_checking(struct i387_fxsave_struct *fx)
 {
 	int err;
@@ -220,11 +211,6 @@ extern void finit_soft_fpu(struct i387_soft_struct *soft);
 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)
 {
@@ -344,7 +330,10 @@ static inline void __unlazy_fpu(struct task_struct *tsk)
 static inline void __clear_fpu(struct task_struct *tsk)
 {
 	if (task_thread_info(tsk)->status & TS_USEDFPU) {
-		tolerant_fwait();
+		/* Ignore delayed exceptions from user space */
+		asm volatile("1: fwait\n"
+			     "2:\n"
+			     _ASM_EXTABLE(1b, 2b));
 		task_thread_info(tsk)->status &= ~TS_USEDFPU;
 		stts();
 	}
-- 
1.7.2.2


^ permalink raw reply related	[flat|nested] 40+ messages in thread

* [PATCH 04/12] x86: Merge __save_init_fpu()
  2010-09-04  1:17 [PATCH 0/12] x86 FPU cleanups (v2) Brian Gerst
                   ` (2 preceding siblings ...)
  2010-09-04  1:17 ` [PATCH 03/12] x86: Merge tolerant_fwait() Brian Gerst
@ 2010-09-04  1:17 ` Brian Gerst
  2010-09-04  6:47   ` Pekka Enberg
  2010-09-10  1:47   ` [tip:x86/fpu] x86, fpu: " tip-bot for Brian Gerst
  2010-09-04  1:17 ` [PATCH 05/12] x86-64: Disable preemption when using TS_USEDFPU Brian Gerst
                   ` (8 subsequent siblings)
  12 siblings, 2 replies; 40+ messages in thread
From: Brian Gerst @ 2010-09-04  1:17 UTC (permalink / raw)
  To: hpa; +Cc: x86, linux-kernel, penberg

__save_init_fpu() is identical for 32-bit and 64-bit.

Signed-off-by: Brian Gerst <brgerst@gmail.com>
---
 arch/x86/include/asm/i387.h |   11 ++---------
 1 files changed, 2 insertions(+), 9 deletions(-)

diff --git a/arch/x86/include/asm/i387.h b/arch/x86/include/asm/i387.h
index 5d8f9a7..88065e3 100644
--- a/arch/x86/include/asm/i387.h
+++ b/arch/x86/include/asm/i387.h
@@ -197,12 +197,6 @@ static inline void fpu_save_init(struct fpu *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
@@ -285,15 +279,14 @@ end:
 	;
 }
 
+#endif	/* CONFIG_X86_64 */
+
 static inline void __save_init_fpu(struct task_struct *tsk)
 {
 	fpu_save_init(&tsk->thread.fpu);
 	task_thread_info(tsk)->status &= ~TS_USEDFPU;
 }
 
-
-#endif	/* CONFIG_X86_64 */
-
 static inline int fpu_fxrstor_checking(struct fpu *fpu)
 {
 	return fxrstor_checking(&fpu->state->fxsave);
-- 
1.7.2.2


^ permalink raw reply related	[flat|nested] 40+ messages in thread

* [PATCH 05/12] x86-64: Disable preemption when using TS_USEDFPU
  2010-09-04  1:17 [PATCH 0/12] x86 FPU cleanups (v2) Brian Gerst
                   ` (3 preceding siblings ...)
  2010-09-04  1:17 ` [PATCH 04/12] x86: Merge __save_init_fpu() Brian Gerst
@ 2010-09-04  1:17 ` Brian Gerst
  2010-09-04  6:47   ` Pekka Enberg
  2010-09-10  1:47   ` [tip:x86/fpu] x86-64, fpu: " tip-bot for Brian Gerst
  2010-09-04  1:17 ` [PATCH 06/12] x86-64: Fix %cs value in convert_from_fxsr() Brian Gerst
                   ` (7 subsequent siblings)
  12 siblings, 2 replies; 40+ messages in thread
From: Brian Gerst @ 2010-09-04  1:17 UTC (permalink / raw)
  To: hpa; +Cc: x86, linux-kernel, penberg

Consolidates code and fixes the below race for 64-bit.

commit 9fa2f37bfeb798728241cc4a19578ce6e4258f25
Author: torvalds <torvalds>
Date:   Tue Sep 2 07:37:25 2003 +0000

    Be a lot more careful about TS_USEDFPU and preemption

    We had some races where we testecd (or set) TS_USEDFPU together
    with sequences that depended on the setting (like clearing or
    setting the TS flag in %cr0) and we could be preempted in between,
    which screws up the FPU state, since preemption will itself change
    USEDFPU and the TS flag.

    This makes it a lot more explicit: the "internal" low-level FPU
    functions ("__xxxx_fpu()") all require preemption to be disabled,
    and the exported "real" functions will make sure that is the case.

    One case - in __switch_to() - was switched to the non-preempt-safe
    internal version, since the scheduler itself has already disabled
    preemption.

    BKrev: 3f5448b5WRiQuyzAlbajs3qoQjSobw

Signed-off-by: Brian Gerst <brgerst@gmail.com>
---
 arch/x86/include/asm/i387.h  |   15 ---------------
 arch/x86/kernel/process_64.c |    2 +-
 2 files changed, 1 insertions(+), 16 deletions(-)

diff --git a/arch/x86/include/asm/i387.h b/arch/x86/include/asm/i387.h
index 88065e3..8b40a83 100644
--- a/arch/x86/include/asm/i387.h
+++ b/arch/x86/include/asm/i387.h
@@ -387,19 +387,6 @@ static inline void irq_ts_restore(int TS_state)
 		stts();
 }
 
-#ifdef CONFIG_X86_64
-
-static inline void save_init_fpu(struct task_struct *tsk)
-{
-	__save_init_fpu(tsk);
-	stts();
-}
-
-#define unlazy_fpu	__unlazy_fpu
-#define clear_fpu	__clear_fpu
-
-#else  /* CONFIG_X86_32 */
-
 /*
  * These disable preemption on their own and are safe
  */
@@ -425,8 +412,6 @@ static inline void clear_fpu(struct task_struct *tsk)
 	preempt_enable();
 }
 
-#endif	/* CONFIG_X86_64 */
-
 /*
  * i387 state interaction
  */
diff --git a/arch/x86/kernel/process_64.c b/arch/x86/kernel/process_64.c
index 3d9ea53..b3d7a3a 100644
--- a/arch/x86/kernel/process_64.c
+++ b/arch/x86/kernel/process_64.c
@@ -424,7 +424,7 @@ __switch_to(struct task_struct *prev_p, struct task_struct *next_p)
 	load_TLS(next, cpu);
 
 	/* Must be after DS reload */
-	unlazy_fpu(prev_p);
+	__unlazy_fpu(prev_p);
 
 	/* Make sure cpu is ready for new context */
 	if (preload_fpu)
-- 
1.7.2.2


^ permalink raw reply related	[flat|nested] 40+ messages in thread

* [PATCH 06/12] x86-64: Fix %cs value in convert_from_fxsr()
  2010-09-04  1:17 [PATCH 0/12] x86 FPU cleanups (v2) Brian Gerst
                   ` (4 preceding siblings ...)
  2010-09-04  1:17 ` [PATCH 05/12] x86-64: Disable preemption when using TS_USEDFPU Brian Gerst
@ 2010-09-04  1:17 ` Brian Gerst
  2010-09-04  6:51   ` Pekka Enberg
  2010-09-10  1:47   ` [tip:x86/fpu] x86-64, fpu: " tip-bot for Brian Gerst
  2010-09-04  1:17 ` [PATCH 07/12] x86-64: Simplify constraints for fxsave/fxtstor Brian Gerst
                   ` (6 subsequent siblings)
  12 siblings, 2 replies; 40+ messages in thread
From: Brian Gerst @ 2010-09-04  1:17 UTC (permalink / raw)
  To: hpa; +Cc: x86, linux-kernel, penberg

While %ds still contains the userspace selector, %cs is KERNEL_CS at
this point.  Always get %cs from pt_regs even for the current task.

Signed-off-by: Brian Gerst <brgerst@gmail.com>
---
 arch/x86/kernel/i387.c |   18 ++++++++----------
 1 files changed, 8 insertions(+), 10 deletions(-)

diff --git a/arch/x86/kernel/i387.c b/arch/x86/kernel/i387.c
index 1f082f3..966fdcb 100644
--- a/arch/x86/kernel/i387.c
+++ b/arch/x86/kernel/i387.c
@@ -384,19 +384,17 @@ convert_from_fxsr(struct user_i387_ia32_struct *env, struct task_struct *tsk)
 #ifdef CONFIG_X86_64
 	env->fip = fxsave->rip;
 	env->foo = fxsave->rdp;
+	/*
+	 * should be actually ds/cs at fpu exception time, but
+	 * that information is not available in 64bit mode.
+	 */
+	env->fcs = task_pt_regs(tsk)->cs;
 	if (tsk == current) {
-		/*
-		 * should be actually ds/cs at fpu exception time, but
-		 * that information is not available in 64bit mode.
-		 */
-		asm("mov %%ds, %[fos]" : [fos] "=r" (env->fos));
-		asm("mov %%cs, %[fcs]" : [fcs] "=r" (env->fcs));
+		savesegment(ds, env->fos);
 	} else {
-		struct pt_regs *regs = task_pt_regs(tsk);
-
-		env->fos = 0xffff0000 | tsk->thread.ds;
-		env->fcs = regs->cs;
+		env->fos = tsk->thread.ds;
 	}
+	env->fos |= 0xffff0000;
 #else
 	env->fip = fxsave->fip;
 	env->fcs = (u16) fxsave->fcs | ((u32) fxsave->fop << 16);
-- 
1.7.2.2


^ permalink raw reply related	[flat|nested] 40+ messages in thread

* [PATCH 07/12] x86-64: Simplify constraints for fxsave/fxtstor
  2010-09-04  1:17 [PATCH 0/12] x86 FPU cleanups (v2) Brian Gerst
                   ` (5 preceding siblings ...)
  2010-09-04  1:17 ` [PATCH 06/12] x86-64: Fix %cs value in convert_from_fxsr() Brian Gerst
@ 2010-09-04  1:17 ` Brian Gerst
  2010-09-04  6:48   ` Pekka Enberg
                     ` (2 more replies)
  2010-09-04  1:17 ` [PATCH 08/12] x86-32: Remove math_emulate stub Brian Gerst
                   ` (5 subsequent siblings)
  12 siblings, 3 replies; 40+ messages in thread
From: Brian Gerst @ 2010-09-04  1:17 UTC (permalink / raw)
  To: hpa; +Cc: x86, linux-kernel, penberg

Use the "R" constraint (legacy register) instead of listing all the
possible registers.  Clean up the comments as well.

Signed-off-by: Brian Gerst <brgerst@gmail.com>
---
 arch/x86/include/asm/i387.h |   44 ++++++++++++++++--------------------------
 1 files changed, 17 insertions(+), 27 deletions(-)

diff --git a/arch/x86/include/asm/i387.h b/arch/x86/include/asm/i387.h
index 8b40a83..768fcb2 100644
--- a/arch/x86/include/asm/i387.h
+++ b/arch/x86/include/asm/i387.h
@@ -81,6 +81,7 @@ static inline int fxrstor_checking(struct i387_fxsave_struct *fx)
 {
 	int err;
 
+	/* See comment in fxsave() below. */
 	asm volatile("1:  rex64/fxrstor (%[fx])\n\t"
 		     "2:\n"
 		     ".section .fixup,\"ax\"\n"
@@ -89,11 +90,7 @@ static inline int fxrstor_checking(struct i387_fxsave_struct *fx)
 		     ".previous\n"
 		     _ASM_EXTABLE(1b, 3b)
 		     : [err] "=r" (err)
-#if 0 /* See comment in fxsave() below. */
-		     : [fx] "r" (fx), "m" (*fx), "0" (0));
-#else
-		     : [fx] "cdaSDb" (fx), "m" (*fx), "0" (0));
-#endif
+		     : [fx] "R" (fx), "m" (*fx), "0" (0));
 	return err;
 }
 
@@ -140,6 +137,7 @@ static inline int fxsave_user(struct i387_fxsave_struct __user *fx)
 	if (unlikely(err))
 		return -EFAULT;
 
+	/* See comment in fxsave() below. */
 	asm volatile("1:  rex64/fxsave (%[fx])\n\t"
 		     "2:\n"
 		     ".section .fixup,\"ax\"\n"
@@ -148,11 +146,7 @@ static inline int fxsave_user(struct i387_fxsave_struct __user *fx)
 		     ".previous\n"
 		     _ASM_EXTABLE(1b, 3b)
 		     : [err] "=r" (err), "=m" (*fx)
-#if 0 /* See comment in fxsave() below. */
-		     : [fx] "r" (fx), "0" (0));
-#else
-		     : [fx] "cdaSDb" (fx), "0" (0));
-#endif
+		     : [fx] "R" (fx), "0" (0));
 	if (unlikely(err) &&
 	    __clear_user(fx, sizeof(struct i387_fxsave_struct)))
 		err = -EFAULT;
@@ -165,26 +159,22 @@ static inline void fpu_fxsave(struct fpu *fpu)
 	/* 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. */
-#if 0
-	/* 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
-	/* Using, as a workaround, the properly prefixed form below isn't
+	   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
 	   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));
-#endif
+	asm volatile("rex64/fxsave (%[fx])"
+		     : "=m" (fpu->state->fxsave)
+		     : [fx] "R" (&fpu->state->fxsave));
 }
 
 static inline void fpu_save_init(struct fpu *fpu)
-- 
1.7.2.2


^ permalink raw reply related	[flat|nested] 40+ messages in thread

* [PATCH 08/12] x86-32: Remove math_emulate stub
  2010-09-04  1:17 [PATCH 0/12] x86 FPU cleanups (v2) Brian Gerst
                   ` (6 preceding siblings ...)
  2010-09-04  1:17 ` [PATCH 07/12] x86-64: Simplify constraints for fxsave/fxtstor Brian Gerst
@ 2010-09-04  1:17 ` Brian Gerst
  2010-09-04  6:48   ` Pekka Enberg
  2010-09-10  1:48   ` [tip:x86/fpu] x86-32, fpu: " tip-bot for Brian Gerst
  2010-09-04  1:17 ` [PATCH 09/12] x86: Remove unnecessary ifdefs from i387 code Brian Gerst
                   ` (4 subsequent siblings)
  12 siblings, 2 replies; 40+ messages in thread
From: Brian Gerst @ 2010-09-04  1:17 UTC (permalink / raw)
  To: hpa; +Cc: x86, linux-kernel, penberg

check_fpu() in bugs.c halts boot if no FPU is found and math emulation
isn't enabled.  Therefore this stub will never be used.

Signed-off-by: Brian Gerst <brgerst@gmail.com>
---
 arch/x86/kernel/traps.c |   23 ++++++-----------------
 1 files changed, 6 insertions(+), 17 deletions(-)

diff --git a/arch/x86/kernel/traps.c b/arch/x86/kernel/traps.c
index d0029eb..d439685 100644
--- a/arch/x86/kernel/traps.c
+++ b/arch/x86/kernel/traps.c
@@ -776,21 +776,10 @@ asmlinkage void math_state_restore(void)
 }
 EXPORT_SYMBOL_GPL(math_state_restore);
 
-#ifndef CONFIG_MATH_EMULATION
-void math_emulate(struct math_emu_info *info)
-{
-	printk(KERN_EMERG
-		"math-emulation not enabled and no coprocessor found.\n");
-	printk(KERN_EMERG "killing %s.\n", current->comm);
-	force_sig(SIGFPE, current);
-	schedule();
-}
-#endif /* CONFIG_MATH_EMULATION */
-
 dotraplinkage void __kprobes
 do_device_not_available(struct pt_regs *regs, long error_code)
 {
-#ifdef CONFIG_X86_32
+#ifdef CONFIG_MATH_EMULATION
 	if (read_cr0() & X86_CR0_EM) {
 		struct math_emu_info info = { };
 
@@ -798,12 +787,12 @@ do_device_not_available(struct pt_regs *regs, long error_code)
 
 		info.regs = regs;
 		math_emulate(&info);
-	} else {
-		math_state_restore(); /* interrupts still off */
-		conditional_sti(regs);
+		return;
 	}
-#else
-	math_state_restore();
+#endif
+	math_state_restore(); /* interrupts still off */
+#ifdef CONFIG_X86_32
+	conditional_sti(regs);
 #endif
 }
 
-- 
1.7.2.2


^ permalink raw reply related	[flat|nested] 40+ messages in thread

* [PATCH 09/12] x86: Remove unnecessary ifdefs from i387 code.
  2010-09-04  1:17 [PATCH 0/12] x86 FPU cleanups (v2) Brian Gerst
                   ` (7 preceding siblings ...)
  2010-09-04  1:17 ` [PATCH 08/12] x86-32: Remove math_emulate stub Brian Gerst
@ 2010-09-04  1:17 ` Brian Gerst
  2010-09-04  6:49   ` Pekka Enberg
  2010-09-10  1:48   ` [tip:x86/fpu] x86, fpu: " tip-bot for Brian Gerst
  2010-09-04  1:17 ` [PATCH 10/12] x86: Remove PSHUFB_XMM5_* macros Brian Gerst
                   ` (3 subsequent siblings)
  12 siblings, 2 replies; 40+ messages in thread
From: Brian Gerst @ 2010-09-04  1:17 UTC (permalink / raw)
  To: hpa; +Cc: x86, linux-kernel, penberg

Remove ifdefs for code that the compiler can optimize away on 64-bit.

Signed-off-by: Brian Gerst <brgerst@gmail.com>
---
 arch/x86/include/asm/i387.h |   12 ++++++------
 arch/x86/kernel/i387.c      |    4 ----
 2 files changed, 6 insertions(+), 10 deletions(-)

diff --git a/arch/x86/include/asm/i387.h b/arch/x86/include/asm/i387.h
index 768fcb2..42b507e 100644
--- a/arch/x86/include/asm/i387.h
+++ b/arch/x86/include/asm/i387.h
@@ -55,6 +55,12 @@ extern int save_i387_xstate_ia32(void __user *buf);
 extern int restore_i387_xstate_ia32(void __user *buf);
 #endif
 
+#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
+
 #define X87_FSW_ES (1 << 7)	/* Exception Summary */
 
 static __always_inline __pure bool use_xsaveopt(void)
@@ -189,12 +195,6 @@ static inline void fpu_save_init(struct fpu *fpu)
 
 #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
-
 /* perform fxrstor iff the processor has extended states, otherwise frstor */
 static inline int fxrstor_checking(struct i387_fxsave_struct *fx)
 {
diff --git a/arch/x86/kernel/i387.c b/arch/x86/kernel/i387.c
index 966fdcb..9238309 100644
--- a/arch/x86/kernel/i387.c
+++ b/arch/x86/kernel/i387.c
@@ -74,10 +74,8 @@ static void __cpuinit init_thread_xstate(void)
 
 	if (cpu_has_fxsr)
 		xstate_size = sizeof(struct i387_fxsave_struct);
-#ifdef CONFIG_X86_32
 	else
 		xstate_size = sizeof(struct i387_fsave_struct);
-#endif
 }
 
 /*
@@ -114,12 +112,10 @@ void __cpuinit fpu_init(void)
 
 void fpu_finit(struct fpu *fpu)
 {
-#ifdef CONFIG_X86_32
 	if (!HAVE_HWFP) {
 		finit_soft_fpu(&fpu->state->soft);
 		return;
 	}
-#endif
 
 	if (cpu_has_fxsr) {
 		struct i387_fxsave_struct *fx = &fpu->state->fxsave;
-- 
1.7.2.2


^ permalink raw reply related	[flat|nested] 40+ messages in thread

* [PATCH 10/12] x86: Remove PSHUFB_XMM5_* macros
  2010-09-04  1:17 [PATCH 0/12] x86 FPU cleanups (v2) Brian Gerst
                   ` (8 preceding siblings ...)
  2010-09-04  1:17 ` [PATCH 09/12] x86: Remove unnecessary ifdefs from i387 code Brian Gerst
@ 2010-09-04  1:17 ` Brian Gerst
  2010-09-04  6:49   ` Pekka Enberg
  2010-09-10  1:49   ` [tip:x86/fpu] x86, fpu: " tip-bot for Brian Gerst
  2010-09-04  1:17 ` [PATCH 11/12] x86-32: Rewrite fpu_save_init() Brian Gerst
                   ` (2 subsequent siblings)
  12 siblings, 2 replies; 40+ messages in thread
From: Brian Gerst @ 2010-09-04  1:17 UTC (permalink / raw)
  To: hpa; +Cc: x86, linux-kernel, penberg

The PSHUFB_XMM5_* macros are no longer used.

Signed-off-by: Brian Gerst <brgerst@gmail.com>
---
 arch/x86/include/asm/i387.h |    3 ---
 1 files changed, 0 insertions(+), 3 deletions(-)

diff --git a/arch/x86/include/asm/i387.h b/arch/x86/include/asm/i387.h
index 42b507e..907967e 100644
--- a/arch/x86/include/asm/i387.h
+++ b/arch/x86/include/asm/i387.h
@@ -465,7 +465,4 @@ extern void fpu_finit(struct fpu *fpu);
 
 #endif /* __ASSEMBLY__ */
 
-#define PSHUFB_XMM5_XMM0 .byte 0x66, 0x0f, 0x38, 0x00, 0xc5
-#define PSHUFB_XMM5_XMM6 .byte 0x66, 0x0f, 0x38, 0x00, 0xf5
-
 #endif /* _ASM_X86_I387_H */
-- 
1.7.2.2


^ permalink raw reply related	[flat|nested] 40+ messages in thread

* [PATCH 11/12] x86-32: Rewrite fpu_save_init()
  2010-09-04  1:17 [PATCH 0/12] x86 FPU cleanups (v2) Brian Gerst
                   ` (9 preceding siblings ...)
  2010-09-04  1:17 ` [PATCH 10/12] x86: Remove PSHUFB_XMM5_* macros Brian Gerst
@ 2010-09-04  1:17 ` Brian Gerst
  2010-09-04  6:51   ` Pekka Enberg
  2010-09-10  1:49   ` [tip:x86/fpu] x86-32, fpu: " tip-bot for Brian Gerst
  2010-09-04  1:17 ` [PATCH 12/12] x86: Merge fpu_save_init() Brian Gerst
  2010-09-04  6:45 ` [PATCH 0/12] x86 FPU cleanups (v2) Pekka Enberg
  12 siblings, 2 replies; 40+ messages in thread
From: Brian Gerst @ 2010-09-04  1:17 UTC (permalink / raw)
  To: hpa; +Cc: x86, linux-kernel, penberg

Rewrite fpu_save_init() to prepare for merging with 64-bit.

Signed-off-by: Brian Gerst <brgerst@gmail.com>
---
 arch/x86/include/asm/i387.h |   47 ++++++++++++++++++++----------------------
 1 files changed, 22 insertions(+), 25 deletions(-)

diff --git a/arch/x86/include/asm/i387.h b/arch/x86/include/asm/i387.h
index 907967e..b45abef 100644
--- a/arch/x86/include/asm/i387.h
+++ b/arch/x86/include/asm/i387.h
@@ -73,6 +73,11 @@ static __always_inline __pure bool use_xsave(void)
 	return static_cpu_has(X86_FEATURE_XSAVE);
 }
 
+static __always_inline __pure bool use_fxsr(void)
+{
+        return static_cpu_has(X86_FEATURE_FXSR);
+}
+
 extern void __sanitize_i387_state(struct task_struct *);
 
 static inline void sanitize_i387_state(struct task_struct *tsk)
@@ -211,6 +216,12 @@ static inline int fxrstor_checking(struct i387_fxsave_struct *fx)
 	return 0;
 }
 
+static inline void fpu_fxsave(struct fpu *fpu)
+{
+	asm volatile("fxsave %[fx]"
+		     : [fx] "=m" (fpu->state->fxsave));
+}
+
 /* We need a safe address that is cheap to find and that is already
    in L1 during context switch. The best choices are unfortunately
    different for UP and SMP */
@@ -226,36 +237,24 @@ static inline int fxrstor_checking(struct i387_fxsave_struct *fx)
 static inline void fpu_save_init(struct fpu *fpu)
 {
 	if (use_xsave()) {
-		struct xsave_struct *xstate = &fpu->state->xsave;
-		struct i387_fxsave_struct *fx = &fpu->state->fxsave;
-
 		fpu_xsave(fpu);
 
 		/*
 		 * xsave header may indicate the init state of the FP.
 		 */
-		if (!(xstate->xsave_hdr.xstate_bv & XSTATE_FP))
-			goto end;
-
-		if (unlikely(fx->swd & X87_FSW_ES))
-			asm volatile("fnclex");
-
-		/*
-		 * we can do a simple return here or be paranoid :)
-		 */
-		goto clear_state;
+		if (!(fpu->state->xsave.xsave_hdr.xstate_bv & XSTATE_FP))
+			return;
+	} else if (use_fxsr()) {
+		fpu_fxsave(fpu);
+	} else {
+		asm volatile("fsave %[fx]; fwait"
+			     : [fx] "=m" (fpu->state->fsave));
+		return;
 	}
 
-	/* Use more nops than strictly needed in case the compiler
-	   varies code */
-	alternative_input(
-		"fnsave %[fx] ;fwait;" GENERIC_NOP8 GENERIC_NOP4,
-		"fxsave %[fx]\n"
-		"bt $7,%[fsw] ; jnc 1f ; fnclex\n1:",
-		X86_FEATURE_FXSR,
-		[fx] "m" (fpu->state->fxsave),
-		[fsw] "m" (fpu->state->fxsave.swd) : "memory");
-clear_state:
+	if (unlikely(fpu->state->fxsave.swd & X87_FSW_ES))
+		asm volatile("fnclex");
+
 	/* 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 */
@@ -265,8 +264,6 @@ clear_state:
 		"fildl %[addr]", 	/* set F?P to defined value */
 		X86_FEATURE_FXSAVE_LEAK,
 		[addr] "m" (safe_address));
-end:
-	;
 }
 
 #endif	/* CONFIG_X86_64 */
-- 
1.7.2.2


^ permalink raw reply related	[flat|nested] 40+ messages in thread

* [PATCH 12/12] x86: Merge fpu_save_init()
  2010-09-04  1:17 [PATCH 0/12] x86 FPU cleanups (v2) Brian Gerst
                   ` (10 preceding siblings ...)
  2010-09-04  1:17 ` [PATCH 11/12] x86-32: Rewrite fpu_save_init() Brian Gerst
@ 2010-09-04  1:17 ` Brian Gerst
  2010-09-04  6:51   ` Pekka Enberg
  2010-09-10  1:50   ` [tip:x86/fpu] x86, fpu: " tip-bot for Brian Gerst
  2010-09-04  6:45 ` [PATCH 0/12] x86 FPU cleanups (v2) Pekka Enberg
  12 siblings, 2 replies; 40+ messages in thread
From: Brian Gerst @ 2010-09-04  1:17 UTC (permalink / raw)
  To: hpa; +Cc: x86, linux-kernel, penberg

Make 64-bit use the 32-bit version of fpu_save_init().  Remove
unused clear_fpu_state().

Signed-off-by: Brian Gerst <brgerst@gmail.com>
---
 arch/x86/include/asm/i387.h |   48 +++---------------------------------------
 1 files changed, 4 insertions(+), 44 deletions(-)

diff --git a/arch/x86/include/asm/i387.h b/arch/x86/include/asm/i387.h
index b45abef..9a28b3c 100644
--- a/arch/x86/include/asm/i387.h
+++ b/arch/x86/include/asm/i387.h
@@ -105,36 +105,6 @@ static inline int fxrstor_checking(struct i387_fxsave_struct *fx)
 	return err;
 }
 
-/* AMD CPUs don't save/restore FDP/FIP/FOP unless an exception
-   is pending. Clear the x87 state here by setting it to fixed
-   values. The kernel data segment can be sometimes 0 and sometimes
-   new user value. Both should be ok.
-   Use the PDA as safe address because it should be already in L1. */
-static inline void fpu_clear(struct fpu *fpu)
-{
-	struct xsave_struct *xstate = &fpu->state->xsave;
-	struct i387_fxsave_struct *fx = &fpu->state->fxsave;
-
-	/*
-	 * xsave header may indicate the init state of the FP.
-	 */
-	if (use_xsave() &&
-	    !(xstate->xsave_hdr.xstate_bv & XSTATE_FP))
-		return;
-
-	if (unlikely(fx->swd & X87_FSW_ES))
-		asm volatile("fnclex");
-	alternative_input(ASM_NOP8 ASM_NOP2,
-			  "    emms\n"		/* clear stack tags */
-			  "    fildl %%gs:0",	/* load to clear state */
-			  X86_FEATURE_FXSAVE_LEAK);
-}
-
-static inline void clear_fpu_state(struct task_struct *tsk)
-{
-	fpu_clear(&tsk->thread.fpu);
-}
-
 static inline int fxsave_user(struct i387_fxsave_struct __user *fx)
 {
 	int err;
@@ -188,16 +158,6 @@ static inline void fpu_fxsave(struct fpu *fpu)
 		     : [fx] "R" (&fpu->state->fxsave));
 }
 
-static inline void fpu_save_init(struct fpu *fpu)
-{
-	if (use_xsave())
-		fpu_xsave(fpu);
-	else
-		fpu_fxsave(fpu);
-
-	fpu_clear(fpu);
-}
-
 #else  /* CONFIG_X86_32 */
 
 /* perform fxrstor iff the processor has extended states, otherwise frstor */
@@ -222,6 +182,8 @@ static inline void fpu_fxsave(struct fpu *fpu)
 		     : [fx] "=m" (fpu->state->fxsave));
 }
 
+#endif	/* CONFIG_X86_64 */
+
 /* We need a safe address that is cheap to find and that is already
    in L1 during context switch. The best choices are unfortunately
    different for UP and SMP */
@@ -259,15 +221,13 @@ static inline void fpu_save_init(struct fpu *fpu)
 	   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(
-		GENERIC_NOP8 GENERIC_NOP2,
+		ASM_NOP8 ASM_NOP2,
 		"emms\n\t"	  	/* clear stack tags */
-		"fildl %[addr]", 	/* set F?P to defined value */
+		"fildl %P[addr]", 	/* set F?P to defined value */
 		X86_FEATURE_FXSAVE_LEAK,
 		[addr] "m" (safe_address));
 }
 
-#endif	/* CONFIG_X86_64 */
-
 static inline void __save_init_fpu(struct task_struct *tsk)
 {
 	fpu_save_init(&tsk->thread.fpu);
-- 
1.7.2.2


^ permalink raw reply related	[flat|nested] 40+ messages in thread

* Re: [PATCH 0/12] x86 FPU cleanups (v2)
  2010-09-04  1:17 [PATCH 0/12] x86 FPU cleanups (v2) Brian Gerst
                   ` (11 preceding siblings ...)
  2010-09-04  1:17 ` [PATCH 12/12] x86: Merge fpu_save_init() Brian Gerst
@ 2010-09-04  6:45 ` Pekka Enberg
  12 siblings, 0 replies; 40+ messages in thread
From: Pekka Enberg @ 2010-09-04  6:45 UTC (permalink / raw)
  To: Brian Gerst; +Cc: hpa, x86, linux-kernel

  On 4.9.2010 4.17, Brian Gerst wrote:
> This patch set cleans up and merges the 32-bit and 64-bit FPU code.
Oh, you seem to have dropped all of my previous ACKs.

^ permalink raw reply	[flat|nested] 40+ messages in thread

* Re: [PATCH 01/12] x86: Use correct type for %cr4
  2010-09-04  1:17 ` [PATCH 01/12] x86: Use correct type for %cr4 Brian Gerst
@ 2010-09-04  6:45   ` Pekka Enberg
  2010-09-10  1:46   ` [tip:x86/fpu] " tip-bot for Brian Gerst
  1 sibling, 0 replies; 40+ messages in thread
From: Pekka Enberg @ 2010-09-04  6:45 UTC (permalink / raw)
  To: Brian Gerst; +Cc: hpa, x86, linux-kernel

  On 4.9.2010 4.17, Brian Gerst wrote:
> %cr4 is 64-bit in 64-bit mode (although the upper 32-bits are currently reserved).
> Use unsigned long for the temporary variable to get the right size.
>
> Signed-off-by: Brian Gerst<brgerst@gmail.com>
Acked-by: Pekka Enberg <penberg@kernel.org>

^ permalink raw reply	[flat|nested] 40+ messages in thread

* Re: [PATCH 02/12] x86: Merge fpu_init()
  2010-09-04  1:17 ` [PATCH 02/12] x86: Merge fpu_init() Brian Gerst
@ 2010-09-04  6:45   ` Pekka Enberg
  2010-09-10  1:46   ` [tip:x86/fpu] x86, fpu: " tip-bot for Brian Gerst
  1 sibling, 0 replies; 40+ messages in thread
From: Pekka Enberg @ 2010-09-04  6:45 UTC (permalink / raw)
  To: Brian Gerst; +Cc: hpa, x86, linux-kernel

  On 4.9.2010 4.17, Brian Gerst wrote:
> Make fpu_init() handle 32-bit setup.
>
> Signed-off-by: Brian Gerst<brgerst@gmail.com>
Acked-by: Pekka Enberg <penberg@kernel.org>


^ permalink raw reply	[flat|nested] 40+ messages in thread

* Re: [PATCH 03/12] x86: Merge tolerant_fwait()
  2010-09-04  1:17 ` [PATCH 03/12] x86: Merge tolerant_fwait() Brian Gerst
@ 2010-09-04  6:46   ` Pekka Enberg
  2010-09-10  1:46   ` [tip:x86/fpu] x86, fpu: " tip-bot for Brian Gerst
  1 sibling, 0 replies; 40+ messages in thread
From: Pekka Enberg @ 2010-09-04  6:46 UTC (permalink / raw)
  To: Brian Gerst; +Cc: hpa, x86, linux-kernel

  On 4.9.2010 4.17, Brian Gerst wrote:
> Commit e2e75c91 merged the math exception handler, allowing both 32-bit
> and 64-bit to handle math exceptions from kernel mode.  Switch to using
> the 64-bit version of tolerant_fwait() without fnclex, which simply
> ignores the exception if one is still pending from userspace.
>
> Signed-off-by: Brian Gerst<brgerst@gmail.com>
Acked-by: Pekka Enberg <penberg@kernel.org>


^ permalink raw reply	[flat|nested] 40+ messages in thread

* Re: [PATCH 04/12] x86: Merge __save_init_fpu()
  2010-09-04  1:17 ` [PATCH 04/12] x86: Merge __save_init_fpu() Brian Gerst
@ 2010-09-04  6:47   ` Pekka Enberg
  2010-09-10  1:47   ` [tip:x86/fpu] x86, fpu: " tip-bot for Brian Gerst
  1 sibling, 0 replies; 40+ messages in thread
From: Pekka Enberg @ 2010-09-04  6:47 UTC (permalink / raw)
  To: Brian Gerst; +Cc: hpa, x86, linux-kernel

  On 4.9.2010 4.17, Brian Gerst wrote:
> __save_init_fpu() is identical for 32-bit and 64-bit.
>
> Signed-off-by: Brian Gerst<brgerst@gmail.com>
Acked-by: Pekka Enberg <penberg@kernel.org>


^ permalink raw reply	[flat|nested] 40+ messages in thread

* Re: [PATCH 05/12] x86-64: Disable preemption when using TS_USEDFPU
  2010-09-04  1:17 ` [PATCH 05/12] x86-64: Disable preemption when using TS_USEDFPU Brian Gerst
@ 2010-09-04  6:47   ` Pekka Enberg
  2010-09-10  1:47   ` [tip:x86/fpu] x86-64, fpu: " tip-bot for Brian Gerst
  1 sibling, 0 replies; 40+ messages in thread
From: Pekka Enberg @ 2010-09-04  6:47 UTC (permalink / raw)
  To: Brian Gerst; +Cc: hpa, x86, linux-kernel

  On 4.9.2010 4.17, Brian Gerst wrote:
> Consolidates code and fixes the below race for 64-bit.
>
> commit 9fa2f37bfeb798728241cc4a19578ce6e4258f25
> Author: torvalds<torvalds>
> Date:   Tue Sep 2 07:37:25 2003 +0000
>
>      Be a lot more careful about TS_USEDFPU and preemption
>
>      We had some races where we testecd (or set) TS_USEDFPU together
>      with sequences that depended on the setting (like clearing or
>      setting the TS flag in %cr0) and we could be preempted in between,
>      which screws up the FPU state, since preemption will itself change
>      USEDFPU and the TS flag.
>
>      This makes it a lot more explicit: the "internal" low-level FPU
>      functions ("__xxxx_fpu()") all require preemption to be disabled,
>      and the exported "real" functions will make sure that is the case.
>
>      One case - in __switch_to() - was switched to the non-preempt-safe
>      internal version, since the scheduler itself has already disabled
>      preemption.
>
>      BKrev: 3f5448b5WRiQuyzAlbajs3qoQjSobw
>
> Signed-off-by: Brian Gerst<brgerst@gmail.com>
Acked-by: Pekka Enberg <penberg@kernel.org>


^ permalink raw reply	[flat|nested] 40+ messages in thread

* Re: [PATCH 07/12] x86-64: Simplify constraints for fxsave/fxtstor
  2010-09-04  1:17 ` [PATCH 07/12] x86-64: Simplify constraints for fxsave/fxtstor Brian Gerst
@ 2010-09-04  6:48   ` Pekka Enberg
  2010-09-09 21:22   ` H. Peter Anvin
  2010-09-10  1:48   ` [tip:x86/fpu] x86-64, fpu: " tip-bot for Brian Gerst
  2 siblings, 0 replies; 40+ messages in thread
From: Pekka Enberg @ 2010-09-04  6:48 UTC (permalink / raw)
  To: Brian Gerst; +Cc: hpa, x86, linux-kernel

  On 4.9.2010 4.17, Brian Gerst wrote:
> Use the "R" constraint (legacy register) instead of listing all the
> possible registers.  Clean up the comments as well.
>
> Signed-off-by: Brian Gerst<brgerst@gmail.com>
Acked-by: Pekka Enberg <penberg@kernel.org>

^ permalink raw reply	[flat|nested] 40+ messages in thread

* Re: [PATCH 08/12] x86-32: Remove math_emulate stub
  2010-09-04  1:17 ` [PATCH 08/12] x86-32: Remove math_emulate stub Brian Gerst
@ 2010-09-04  6:48   ` Pekka Enberg
  2010-09-10  1:48   ` [tip:x86/fpu] x86-32, fpu: " tip-bot for Brian Gerst
  1 sibling, 0 replies; 40+ messages in thread
From: Pekka Enberg @ 2010-09-04  6:48 UTC (permalink / raw)
  To: Brian Gerst; +Cc: hpa, x86, linux-kernel

  On 4.9.2010 4.17, Brian Gerst wrote:
> check_fpu() in bugs.c halts boot if no FPU is found and math emulation
> isn't enabled.  Therefore this stub will never be used.
>
> Signed-off-by: Brian Gerst<brgerst@gmail.com>
Acked-by: Pekka Enberg <penberg@kernel.org>


^ permalink raw reply	[flat|nested] 40+ messages in thread

* Re: [PATCH 09/12] x86: Remove unnecessary ifdefs from i387 code.
  2010-09-04  1:17 ` [PATCH 09/12] x86: Remove unnecessary ifdefs from i387 code Brian Gerst
@ 2010-09-04  6:49   ` Pekka Enberg
  2010-09-10  1:48   ` [tip:x86/fpu] x86, fpu: " tip-bot for Brian Gerst
  1 sibling, 0 replies; 40+ messages in thread
From: Pekka Enberg @ 2010-09-04  6:49 UTC (permalink / raw)
  To: Brian Gerst; +Cc: hpa, x86, linux-kernel

  On 4.9.2010 4.17, Brian Gerst wrote:
> Remove ifdefs for code that the compiler can optimize away on 64-bit.
>
> Signed-off-by: Brian Gerst<brgerst@gmail.com>
Acked-by: Pekka Enberg <penberg@kernel.org>

^ permalink raw reply	[flat|nested] 40+ messages in thread

* Re: [PATCH 10/12] x86: Remove PSHUFB_XMM5_* macros
  2010-09-04  1:17 ` [PATCH 10/12] x86: Remove PSHUFB_XMM5_* macros Brian Gerst
@ 2010-09-04  6:49   ` Pekka Enberg
  2010-09-10  1:49   ` [tip:x86/fpu] x86, fpu: " tip-bot for Brian Gerst
  1 sibling, 0 replies; 40+ messages in thread
From: Pekka Enberg @ 2010-09-04  6:49 UTC (permalink / raw)
  To: Brian Gerst; +Cc: hpa, x86, linux-kernel

  On 4.9.2010 4.17, Brian Gerst wrote:
> The PSHUFB_XMM5_* macros are no longer used.
>
> Signed-off-by: Brian Gerst<brgerst@gmail.com>
Acked-by: Pekka Enberg <penberg@kernel.org>


^ permalink raw reply	[flat|nested] 40+ messages in thread

* Re: [PATCH 11/12] x86-32: Rewrite fpu_save_init()
  2010-09-04  1:17 ` [PATCH 11/12] x86-32: Rewrite fpu_save_init() Brian Gerst
@ 2010-09-04  6:51   ` Pekka Enberg
  2010-09-10  1:49   ` [tip:x86/fpu] x86-32, fpu: " tip-bot for Brian Gerst
  1 sibling, 0 replies; 40+ messages in thread
From: Pekka Enberg @ 2010-09-04  6:51 UTC (permalink / raw)
  To: Brian Gerst; +Cc: hpa, x86, linux-kernel

  On 4.9.2010 4.17, Brian Gerst wrote:
> Rewrite fpu_save_init() to prepare for merging with 64-bit.
>
> Signed-off-by: Brian Gerst<brgerst@gmail.com>
Acked-by: Pekka Enberg <penberg@kernel.org>


^ permalink raw reply	[flat|nested] 40+ messages in thread

* Re: [PATCH 12/12] x86: Merge fpu_save_init()
  2010-09-04  1:17 ` [PATCH 12/12] x86: Merge fpu_save_init() Brian Gerst
@ 2010-09-04  6:51   ` Pekka Enberg
  2010-09-10  1:50   ` [tip:x86/fpu] x86, fpu: " tip-bot for Brian Gerst
  1 sibling, 0 replies; 40+ messages in thread
From: Pekka Enberg @ 2010-09-04  6:51 UTC (permalink / raw)
  To: Brian Gerst; +Cc: hpa, x86, linux-kernel

  On 4.9.2010 4.17, Brian Gerst wrote:
> Make 64-bit use the 32-bit version of fpu_save_init().  Remove
> unused clear_fpu_state().
>
> Signed-off-by: Brian Gerst<brgerst@gmail.com>
Acked-by: Pekka Enberg <penberg@kernel.org>


^ permalink raw reply	[flat|nested] 40+ messages in thread

* Re: [PATCH 06/12] x86-64: Fix %cs value in convert_from_fxsr()
  2010-09-04  1:17 ` [PATCH 06/12] x86-64: Fix %cs value in convert_from_fxsr() Brian Gerst
@ 2010-09-04  6:51   ` Pekka Enberg
  2010-09-10  1:47   ` [tip:x86/fpu] x86-64, fpu: " tip-bot for Brian Gerst
  1 sibling, 0 replies; 40+ messages in thread
From: Pekka Enberg @ 2010-09-04  6:51 UTC (permalink / raw)
  To: Brian Gerst; +Cc: hpa, x86, linux-kernel

  On 4.9.2010 4.17, Brian Gerst wrote:
> While %ds still contains the userspace selector, %cs is KERNEL_CS at
> this point.  Always get %cs from pt_regs even for the current task.
>
> Signed-off-by: Brian Gerst<brgerst@gmail.com>
Acked-by: Pekka Enberg <penberg@kernel.org>


^ permalink raw reply	[flat|nested] 40+ messages in thread

* Re: [PATCH 07/12] x86-64: Simplify constraints for fxsave/fxtstor
  2010-09-04  1:17 ` [PATCH 07/12] x86-64: Simplify constraints for fxsave/fxtstor Brian Gerst
  2010-09-04  6:48   ` Pekka Enberg
@ 2010-09-09 21:22   ` H. Peter Anvin
  2010-09-09 23:43     ` Brian Gerst
  2010-09-10  1:48   ` [tip:x86/fpu] x86-64, fpu: " tip-bot for Brian Gerst
  2 siblings, 1 reply; 40+ messages in thread
From: H. Peter Anvin @ 2010-09-09 21:22 UTC (permalink / raw)
  To: Brian Gerst; +Cc: x86, linux-kernel, penberg

On 09/03/2010 06:17 PM, Brian Gerst wrote:
> Use the "R" constraint (legacy register) instead of listing all the
> possible registers.  Clean up the comments as well.
> 
> Signed-off-by: Brian Gerst <brgerst@gmail.com>

Hi Brian,

Have you tested this on *old* versions of gcc?  Since the whole point of
that butt-ugly code sequence is to support now-historic versions of
binutils, we need to make sure that "R" was supposed on the
corresponding gcc versions...

	-hpa

^ permalink raw reply	[flat|nested] 40+ messages in thread

* Re: [PATCH 07/12] x86-64: Simplify constraints for fxsave/fxtstor
  2010-09-09 21:22   ` H. Peter Anvin
@ 2010-09-09 23:43     ` Brian Gerst
  0 siblings, 0 replies; 40+ messages in thread
From: Brian Gerst @ 2010-09-09 23:43 UTC (permalink / raw)
  To: H. Peter Anvin; +Cc: x86, linux-kernel, penberg

On Thu, Sep 9, 2010 at 5:22 PM, H. Peter Anvin <hpa@zytor.com> wrote:
> On 09/03/2010 06:17 PM, Brian Gerst wrote:
>> Use the "R" constraint (legacy register) instead of listing all the
>> possible registers.  Clean up the comments as well.
>>
>> Signed-off-by: Brian Gerst <brgerst@gmail.com>
>
> Hi Brian,
>
> Have you tested this on *old* versions of gcc?  Since the whole point of
> that butt-ugly code sequence is to support now-historic versions of
> binutils, we need to make sure that "R" was supposed on the
> corresponding gcc versions...

It's documented as far back as the GCC 3.1.1 manual.  Whether it
actually works or not on older compilers I have no way of testing.

--
Brian Gerst

^ permalink raw reply	[flat|nested] 40+ messages in thread

* [tip:x86/fpu] x86: Use correct type for %cr4
  2010-09-04  1:17 ` [PATCH 01/12] x86: Use correct type for %cr4 Brian Gerst
  2010-09-04  6:45   ` Pekka Enberg
@ 2010-09-10  1:46   ` tip-bot for Brian Gerst
  1 sibling, 0 replies; 40+ messages in thread
From: tip-bot for Brian Gerst @ 2010-09-10  1:46 UTC (permalink / raw)
  To: linux-tip-commits
  Cc: linux-kernel, hpa, mingo, brgerst, penberg, suresh.b.siddha, tglx,
	hpa

Commit-ID:  2df7a6e9e8e67c19e5fe2eac3f2d2223b7bb4a7b
Gitweb:     http://git.kernel.org/tip/2df7a6e9e8e67c19e5fe2eac3f2d2223b7bb4a7b
Author:     Brian Gerst <brgerst@gmail.com>
AuthorDate: Fri, 3 Sep 2010 21:17:08 -0400
Committer:  H. Peter Anvin <hpa@linux.intel.com>
CommitDate: Thu, 9 Sep 2010 14:16:13 -0700

x86: Use correct type for %cr4

%cr4 is 64-bit in 64-bit mode (although the upper 32-bits are currently reserved).
Use unsigned long for the temporary variable to get the right size.

Signed-off-by: Brian Gerst <brgerst@gmail.com>
Acked-by: Pekka Enberg <penberg@kernel.org>
Cc: Suresh Siddha <suresh.b.siddha@intel.com>
LKML-Reference: <1283563039-3466-2-git-send-email-brgerst@gmail.com>
Signed-off-by: H. Peter Anvin <hpa@linux.intel.com>
---
 arch/x86/include/asm/processor.h |    4 ++--
 1 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/arch/x86/include/asm/processor.h b/arch/x86/include/asm/processor.h
index 325b7bd..396b80f 100644
--- a/arch/x86/include/asm/processor.h
+++ b/arch/x86/include/asm/processor.h
@@ -602,7 +602,7 @@ extern unsigned long		mmu_cr4_features;
 
 static inline void set_in_cr4(unsigned long mask)
 {
-	unsigned cr4;
+	unsigned long cr4;
 
 	mmu_cr4_features |= mask;
 	cr4 = read_cr4();
@@ -612,7 +612,7 @@ static inline void set_in_cr4(unsigned long mask)
 
 static inline void clear_in_cr4(unsigned long mask)
 {
-	unsigned cr4;
+	unsigned long cr4;
 
 	mmu_cr4_features &= ~mask;
 	cr4 = read_cr4();

^ permalink raw reply related	[flat|nested] 40+ messages in thread

* [tip:x86/fpu] x86, fpu: Merge fpu_init()
  2010-09-04  1:17 ` [PATCH 02/12] x86: Merge fpu_init() Brian Gerst
  2010-09-04  6:45   ` Pekka Enberg
@ 2010-09-10  1:46   ` tip-bot for Brian Gerst
  1 sibling, 0 replies; 40+ messages in thread
From: tip-bot for Brian Gerst @ 2010-09-10  1:46 UTC (permalink / raw)
  To: linux-tip-commits
  Cc: linux-kernel, hpa, mingo, brgerst, penberg, suresh.b.siddha, tglx,
	hpa

Commit-ID:  6ac8bac2684235f4caf22a410549c582aa7327d6
Gitweb:     http://git.kernel.org/tip/6ac8bac2684235f4caf22a410549c582aa7327d6
Author:     Brian Gerst <brgerst@gmail.com>
AuthorDate: Fri, 3 Sep 2010 21:17:09 -0400
Committer:  H. Peter Anvin <hpa@linux.intel.com>
CommitDate: Thu, 9 Sep 2010 14:16:20 -0700

x86, fpu: Merge fpu_init()

Make fpu_init() handle 32-bit setup.

Signed-off-by: Brian Gerst <brgerst@gmail.com>
Acked-by: Pekka Enberg <penberg@kernel.org>
Cc: Suresh Siddha <suresh.b.siddha@intel.com>
LKML-Reference: <1283563039-3466-3-git-send-email-brgerst@gmail.com>
Signed-off-by: H. Peter Anvin <hpa@linux.intel.com>
---
 arch/x86/kernel/cpu/common.c |    7 -------
 arch/x86/kernel/i387.c       |   30 ++++++++++++++----------------
 arch/x86/kernel/traps.c      |   12 ------------
 3 files changed, 14 insertions(+), 35 deletions(-)

diff --git a/arch/x86/kernel/cpu/common.c b/arch/x86/kernel/cpu/common.c
index 490dac6..f9e23e8 100644
--- a/arch/x86/kernel/cpu/common.c
+++ b/arch/x86/kernel/cpu/common.c
@@ -1264,13 +1264,6 @@ void __cpuinit cpu_init(void)
 	clear_all_debug_regs();
 	dbg_restore_debug_regs();
 
-	/*
-	 * Force FPU initialization:
-	 */
-	current_thread_info()->status = 0;
-	clear_used_math();
-	mxcsr_feature_mask_init();
-
 	fpu_init();
 	xsave_init();
 }
diff --git a/arch/x86/kernel/i387.c b/arch/x86/kernel/i387.c
index 2605c50..8216651 100644
--- a/arch/x86/kernel/i387.c
+++ b/arch/x86/kernel/i387.c
@@ -85,7 +85,6 @@ static void __cpuinit init_thread_xstate(void)
 #endif
 }
 
-#ifdef CONFIG_X86_64
 /*
  * Called at bootup to set up the initial FPU state that is later cloned
  * into all processes.
@@ -93,12 +92,21 @@ static void __cpuinit init_thread_xstate(void)
 
 void __cpuinit fpu_init(void)
 {
-	unsigned long oldcr0 = read_cr0();
-
-	set_in_cr4(X86_CR4_OSFXSR);
-	set_in_cr4(X86_CR4_OSXMMEXCPT);
+	unsigned long cr0;
+	unsigned long cr4_mask = 0;
 
-	write_cr0(oldcr0 & ~(X86_CR0_TS|X86_CR0_EM)); /* clear TS and EM */
+	if (cpu_has_fxsr)
+		cr4_mask |= X86_CR4_OSFXSR;
+	if (cpu_has_xmm)
+		cr4_mask |= X86_CR4_OSXMMEXCPT;
+	if (cr4_mask)
+		set_in_cr4(cr4_mask);
+
+	cr0 = read_cr0();
+	cr0 &= ~(X86_CR0_TS|X86_CR0_EM); /* clear TS and EM */
+	if (!HAVE_HWFP)
+		cr0 |= X86_CR0_EM;
+	write_cr0(cr0);
 
 	if (!smp_processor_id())
 		init_thread_xstate();
@@ -109,16 +117,6 @@ void __cpuinit fpu_init(void)
 	clear_used_math();
 }
 
-#else	/* CONFIG_X86_64 */
-
-void __cpuinit fpu_init(void)
-{
-	if (!smp_processor_id())
-		init_thread_xstate();
-}
-
-#endif	/* CONFIG_X86_32 */
-
 void fpu_finit(struct fpu *fpu)
 {
 #ifdef CONFIG_X86_32
diff --git a/arch/x86/kernel/traps.c b/arch/x86/kernel/traps.c
index 60788de..d0029eb 100644
--- a/arch/x86/kernel/traps.c
+++ b/arch/x86/kernel/traps.c
@@ -881,18 +881,6 @@ void __init trap_init(void)
 #endif
 
 #ifdef CONFIG_X86_32
-	if (cpu_has_fxsr) {
-		printk(KERN_INFO "Enabling fast FPU save and restore... ");
-		set_in_cr4(X86_CR4_OSFXSR);
-		printk("done.\n");
-	}
-	if (cpu_has_xmm) {
-		printk(KERN_INFO
-			"Enabling unmasked SIMD FPU exception support... ");
-		set_in_cr4(X86_CR4_OSXMMEXCPT);
-		printk("done.\n");
-	}
-
 	set_system_trap_gate(SYSCALL_VECTOR, &system_call);
 	set_bit(SYSCALL_VECTOR, used_vectors);
 #endif

^ permalink raw reply related	[flat|nested] 40+ messages in thread

* [tip:x86/fpu] x86, fpu: Merge tolerant_fwait()
  2010-09-04  1:17 ` [PATCH 03/12] x86: Merge tolerant_fwait() Brian Gerst
  2010-09-04  6:46   ` Pekka Enberg
@ 2010-09-10  1:46   ` tip-bot for Brian Gerst
  1 sibling, 0 replies; 40+ messages in thread
From: tip-bot for Brian Gerst @ 2010-09-10  1:46 UTC (permalink / raw)
  To: linux-tip-commits
  Cc: linux-kernel, hpa, mingo, brgerst, penberg, suresh.b.siddha, tglx,
	hpa

Commit-ID:  51115d4d45700fc7c08306f7ba6e68551f526ae5
Gitweb:     http://git.kernel.org/tip/51115d4d45700fc7c08306f7ba6e68551f526ae5
Author:     Brian Gerst <brgerst@gmail.com>
AuthorDate: Fri, 3 Sep 2010 21:17:10 -0400
Committer:  H. Peter Anvin <hpa@linux.intel.com>
CommitDate: Thu, 9 Sep 2010 14:16:25 -0700

x86, fpu: Merge tolerant_fwait()

Commit e2e75c91 merged the math exception handler, allowing both 32-bit
and 64-bit to handle math exceptions from kernel mode.  Switch to using
the 64-bit version of tolerant_fwait() without fnclex, which simply
ignores the exception if one is still pending from userspace.

Signed-off-by: Brian Gerst <brgerst@gmail.com>
Acked-by: Pekka Enberg <penberg@kernel.org>
Cc: Suresh Siddha <suresh.b.siddha@intel.com>
LKML-Reference: <1283563039-3466-4-git-send-email-brgerst@gmail.com>
Signed-off-by: H. Peter Anvin <hpa@linux.intel.com>
---
 arch/x86/include/asm/i387.h |   19 ++++---------------
 1 files changed, 4 insertions(+), 15 deletions(-)

diff --git a/arch/x86/include/asm/i387.h b/arch/x86/include/asm/i387.h
index a73a8d5..5d8f9a7 100644
--- a/arch/x86/include/asm/i387.h
+++ b/arch/x86/include/asm/i387.h
@@ -77,15 +77,6 @@ static inline void sanitize_i387_state(struct task_struct *tsk)
 }
 
 #ifdef CONFIG_X86_64
-
-/* Ignore delayed exceptions from user space */
-static inline void tolerant_fwait(void)
-{
-	asm volatile("1: fwait\n"
-		     "2:\n"
-		     _ASM_EXTABLE(1b, 2b));
-}
-
 static inline int fxrstor_checking(struct i387_fxsave_struct *fx)
 {
 	int err;
@@ -220,11 +211,6 @@ extern void finit_soft_fpu(struct i387_soft_struct *soft);
 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)
 {
@@ -344,7 +330,10 @@ static inline void __unlazy_fpu(struct task_struct *tsk)
 static inline void __clear_fpu(struct task_struct *tsk)
 {
 	if (task_thread_info(tsk)->status & TS_USEDFPU) {
-		tolerant_fwait();
+		/* Ignore delayed exceptions from user space */
+		asm volatile("1: fwait\n"
+			     "2:\n"
+			     _ASM_EXTABLE(1b, 2b));
 		task_thread_info(tsk)->status &= ~TS_USEDFPU;
 		stts();
 	}

^ permalink raw reply related	[flat|nested] 40+ messages in thread

* [tip:x86/fpu] x86, fpu: Merge __save_init_fpu()
  2010-09-04  1:17 ` [PATCH 04/12] x86: Merge __save_init_fpu() Brian Gerst
  2010-09-04  6:47   ` Pekka Enberg
@ 2010-09-10  1:47   ` tip-bot for Brian Gerst
  1 sibling, 0 replies; 40+ messages in thread
From: tip-bot for Brian Gerst @ 2010-09-10  1:47 UTC (permalink / raw)
  To: linux-tip-commits
  Cc: linux-kernel, hpa, mingo, brgerst, penberg, suresh.b.siddha, tglx,
	hpa

Commit-ID:  bfd946cb891800d408decaae268a3480775178a3
Gitweb:     http://git.kernel.org/tip/bfd946cb891800d408decaae268a3480775178a3
Author:     Brian Gerst <brgerst@gmail.com>
AuthorDate: Fri, 3 Sep 2010 21:17:11 -0400
Committer:  H. Peter Anvin <hpa@linux.intel.com>
CommitDate: Thu, 9 Sep 2010 14:16:30 -0700

x86, fpu: Merge __save_init_fpu()

__save_init_fpu() is identical for 32-bit and 64-bit.

Signed-off-by: Brian Gerst <brgerst@gmail.com>
Acked-by: Pekka Enberg <penberg@kernel.org>
Cc: Suresh Siddha <suresh.b.siddha@intel.com>
LKML-Reference: <1283563039-3466-5-git-send-email-brgerst@gmail.com>
Signed-off-by: H. Peter Anvin <hpa@linux.intel.com>
---
 arch/x86/include/asm/i387.h |   11 ++---------
 1 files changed, 2 insertions(+), 9 deletions(-)

diff --git a/arch/x86/include/asm/i387.h b/arch/x86/include/asm/i387.h
index 5d8f9a7..88065e3 100644
--- a/arch/x86/include/asm/i387.h
+++ b/arch/x86/include/asm/i387.h
@@ -197,12 +197,6 @@ static inline void fpu_save_init(struct fpu *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
@@ -285,15 +279,14 @@ end:
 	;
 }
 
+#endif	/* CONFIG_X86_64 */
+
 static inline void __save_init_fpu(struct task_struct *tsk)
 {
 	fpu_save_init(&tsk->thread.fpu);
 	task_thread_info(tsk)->status &= ~TS_USEDFPU;
 }
 
-
-#endif	/* CONFIG_X86_64 */
-
 static inline int fpu_fxrstor_checking(struct fpu *fpu)
 {
 	return fxrstor_checking(&fpu->state->fxsave);

^ permalink raw reply related	[flat|nested] 40+ messages in thread

* [tip:x86/fpu] x86-64, fpu: Disable preemption when using TS_USEDFPU
  2010-09-04  1:17 ` [PATCH 05/12] x86-64: Disable preemption when using TS_USEDFPU Brian Gerst
  2010-09-04  6:47   ` Pekka Enberg
@ 2010-09-10  1:47   ` tip-bot for Brian Gerst
  1 sibling, 0 replies; 40+ messages in thread
From: tip-bot for Brian Gerst @ 2010-09-10  1:47 UTC (permalink / raw)
  To: linux-tip-commits
  Cc: linux-kernel, hpa, mingo, brgerst, penberg, suresh.b.siddha, tglx,
	hpa

Commit-ID:  a4d4fbc7735bba6654b20f859135f9d3f8fe7f76
Gitweb:     http://git.kernel.org/tip/a4d4fbc7735bba6654b20f859135f9d3f8fe7f76
Author:     Brian Gerst <brgerst@gmail.com>
AuthorDate: Fri, 3 Sep 2010 21:17:12 -0400
Committer:  H. Peter Anvin <hpa@linux.intel.com>
CommitDate: Thu, 9 Sep 2010 14:16:45 -0700

x86-64, fpu: Disable preemption when using TS_USEDFPU

Consolidates code and fixes the below race for 64-bit.

commit 9fa2f37bfeb798728241cc4a19578ce6e4258f25
Author: torvalds <torvalds>
Date:   Tue Sep 2 07:37:25 2003 +0000

    Be a lot more careful about TS_USEDFPU and preemption

    We had some races where we testecd (or set) TS_USEDFPU together
    with sequences that depended on the setting (like clearing or
    setting the TS flag in %cr0) and we could be preempted in between,
    which screws up the FPU state, since preemption will itself change
    USEDFPU and the TS flag.

    This makes it a lot more explicit: the "internal" low-level FPU
    functions ("__xxxx_fpu()") all require preemption to be disabled,
    and the exported "real" functions will make sure that is the case.

    One case - in __switch_to() - was switched to the non-preempt-safe
    internal version, since the scheduler itself has already disabled
    preemption.

    BKrev: 3f5448b5WRiQuyzAlbajs3qoQjSobw

Signed-off-by: Brian Gerst <brgerst@gmail.com>
Acked-by: Pekka Enberg <penberg@kernel.org>
Cc: Suresh Siddha <suresh.b.siddha@intel.com>
LKML-Reference: <1283563039-3466-6-git-send-email-brgerst@gmail.com>
Signed-off-by: H. Peter Anvin <hpa@linux.intel.com>
---
 arch/x86/include/asm/i387.h  |   15 ---------------
 arch/x86/kernel/process_64.c |    2 +-
 2 files changed, 1 insertions(+), 16 deletions(-)

diff --git a/arch/x86/include/asm/i387.h b/arch/x86/include/asm/i387.h
index 88065e3..8b40a83 100644
--- a/arch/x86/include/asm/i387.h
+++ b/arch/x86/include/asm/i387.h
@@ -387,19 +387,6 @@ static inline void irq_ts_restore(int TS_state)
 		stts();
 }
 
-#ifdef CONFIG_X86_64
-
-static inline void save_init_fpu(struct task_struct *tsk)
-{
-	__save_init_fpu(tsk);
-	stts();
-}
-
-#define unlazy_fpu	__unlazy_fpu
-#define clear_fpu	__clear_fpu
-
-#else  /* CONFIG_X86_32 */
-
 /*
  * These disable preemption on their own and are safe
  */
@@ -425,8 +412,6 @@ static inline void clear_fpu(struct task_struct *tsk)
 	preempt_enable();
 }
 
-#endif	/* CONFIG_X86_64 */
-
 /*
  * i387 state interaction
  */
diff --git a/arch/x86/kernel/process_64.c b/arch/x86/kernel/process_64.c
index 3d9ea53..b3d7a3a 100644
--- a/arch/x86/kernel/process_64.c
+++ b/arch/x86/kernel/process_64.c
@@ -424,7 +424,7 @@ __switch_to(struct task_struct *prev_p, struct task_struct *next_p)
 	load_TLS(next, cpu);
 
 	/* Must be after DS reload */
-	unlazy_fpu(prev_p);
+	__unlazy_fpu(prev_p);
 
 	/* Make sure cpu is ready for new context */
 	if (preload_fpu)

^ permalink raw reply related	[flat|nested] 40+ messages in thread

* [tip:x86/fpu] x86-64, fpu: Fix %cs value in convert_from_fxsr()
  2010-09-04  1:17 ` [PATCH 06/12] x86-64: Fix %cs value in convert_from_fxsr() Brian Gerst
  2010-09-04  6:51   ` Pekka Enberg
@ 2010-09-10  1:47   ` tip-bot for Brian Gerst
  1 sibling, 0 replies; 40+ messages in thread
From: tip-bot for Brian Gerst @ 2010-09-10  1:47 UTC (permalink / raw)
  To: linux-tip-commits
  Cc: linux-kernel, hpa, mingo, brgerst, penberg, suresh.b.siddha, tglx,
	hpa

Commit-ID:  10c11f304986a1f84201c2261a428701f9d2dffc
Gitweb:     http://git.kernel.org/tip/10c11f304986a1f84201c2261a428701f9d2dffc
Author:     Brian Gerst <brgerst@gmail.com>
AuthorDate: Fri, 3 Sep 2010 21:17:13 -0400
Committer:  H. Peter Anvin <hpa@linux.intel.com>
CommitDate: Thu, 9 Sep 2010 14:16:58 -0700

x86-64, fpu: Fix %cs value in convert_from_fxsr()

While %ds still contains the userspace selector, %cs is KERNEL_CS at
this point.  Always get %cs from pt_regs even for the current task.

Signed-off-by: Brian Gerst <brgerst@gmail.com>
Acked-by: Pekka Enberg <penberg@kernel.org>
Cc: Suresh Siddha <suresh.b.siddha@intel.com>
LKML-Reference: <1283563039-3466-7-git-send-email-brgerst@gmail.com>
Signed-off-by: H. Peter Anvin <hpa@linux.intel.com>
---
 arch/x86/kernel/i387.c |   18 ++++++++----------
 1 files changed, 8 insertions(+), 10 deletions(-)

diff --git a/arch/x86/kernel/i387.c b/arch/x86/kernel/i387.c
index 8216651..f3775f5 100644
--- a/arch/x86/kernel/i387.c
+++ b/arch/x86/kernel/i387.c
@@ -389,19 +389,17 @@ convert_from_fxsr(struct user_i387_ia32_struct *env, struct task_struct *tsk)
 #ifdef CONFIG_X86_64
 	env->fip = fxsave->rip;
 	env->foo = fxsave->rdp;
+	/*
+	 * should be actually ds/cs at fpu exception time, but
+	 * that information is not available in 64bit mode.
+	 */
+	env->fcs = task_pt_regs(tsk)->cs;
 	if (tsk == current) {
-		/*
-		 * should be actually ds/cs at fpu exception time, but
-		 * that information is not available in 64bit mode.
-		 */
-		asm("mov %%ds, %[fos]" : [fos] "=r" (env->fos));
-		asm("mov %%cs, %[fcs]" : [fcs] "=r" (env->fcs));
+		savesegment(ds, env->fos);
 	} else {
-		struct pt_regs *regs = task_pt_regs(tsk);
-
-		env->fos = 0xffff0000 | tsk->thread.ds;
-		env->fcs = regs->cs;
+		env->fos = tsk->thread.ds;
 	}
+	env->fos |= 0xffff0000;
 #else
 	env->fip = fxsave->fip;
 	env->fcs = (u16) fxsave->fcs | ((u32) fxsave->fop << 16);

^ permalink raw reply related	[flat|nested] 40+ messages in thread

* [tip:x86/fpu] x86-64, fpu: Simplify constraints for fxsave/fxtstor
  2010-09-04  1:17 ` [PATCH 07/12] x86-64: Simplify constraints for fxsave/fxtstor Brian Gerst
  2010-09-04  6:48   ` Pekka Enberg
  2010-09-09 21:22   ` H. Peter Anvin
@ 2010-09-10  1:48   ` tip-bot for Brian Gerst
  2 siblings, 0 replies; 40+ messages in thread
From: tip-bot for Brian Gerst @ 2010-09-10  1:48 UTC (permalink / raw)
  To: linux-tip-commits
  Cc: linux-kernel, hpa, mingo, brgerst, penberg, suresh.b.siddha, tglx,
	hpa

Commit-ID:  820241356d6aa9a895fc10def15794a5a5bfcd98
Gitweb:     http://git.kernel.org/tip/820241356d6aa9a895fc10def15794a5a5bfcd98
Author:     Brian Gerst <brgerst@gmail.com>
AuthorDate: Fri, 3 Sep 2010 21:17:14 -0400
Committer:  H. Peter Anvin <hpa@linux.intel.com>
CommitDate: Thu, 9 Sep 2010 14:17:06 -0700

x86-64, fpu: Simplify constraints for fxsave/fxtstor

Use the "R" constraint (legacy register) instead of listing all the
possible registers.  Clean up the comments as well.

Signed-off-by: Brian Gerst <brgerst@gmail.com>
Acked-by: Pekka Enberg <penberg@kernel.org>
Cc: Suresh Siddha <suresh.b.siddha@intel.com>
LKML-Reference: <1283563039-3466-8-git-send-email-brgerst@gmail.com>
Signed-off-by: H. Peter Anvin <hpa@linux.intel.com>
---
 arch/x86/include/asm/i387.h |   44 ++++++++++++++++--------------------------
 1 files changed, 17 insertions(+), 27 deletions(-)

diff --git a/arch/x86/include/asm/i387.h b/arch/x86/include/asm/i387.h
index 8b40a83..768fcb2 100644
--- a/arch/x86/include/asm/i387.h
+++ b/arch/x86/include/asm/i387.h
@@ -81,6 +81,7 @@ static inline int fxrstor_checking(struct i387_fxsave_struct *fx)
 {
 	int err;
 
+	/* See comment in fxsave() below. */
 	asm volatile("1:  rex64/fxrstor (%[fx])\n\t"
 		     "2:\n"
 		     ".section .fixup,\"ax\"\n"
@@ -89,11 +90,7 @@ static inline int fxrstor_checking(struct i387_fxsave_struct *fx)
 		     ".previous\n"
 		     _ASM_EXTABLE(1b, 3b)
 		     : [err] "=r" (err)
-#if 0 /* See comment in fxsave() below. */
-		     : [fx] "r" (fx), "m" (*fx), "0" (0));
-#else
-		     : [fx] "cdaSDb" (fx), "m" (*fx), "0" (0));
-#endif
+		     : [fx] "R" (fx), "m" (*fx), "0" (0));
 	return err;
 }
 
@@ -140,6 +137,7 @@ static inline int fxsave_user(struct i387_fxsave_struct __user *fx)
 	if (unlikely(err))
 		return -EFAULT;
 
+	/* See comment in fxsave() below. */
 	asm volatile("1:  rex64/fxsave (%[fx])\n\t"
 		     "2:\n"
 		     ".section .fixup,\"ax\"\n"
@@ -148,11 +146,7 @@ static inline int fxsave_user(struct i387_fxsave_struct __user *fx)
 		     ".previous\n"
 		     _ASM_EXTABLE(1b, 3b)
 		     : [err] "=r" (err), "=m" (*fx)
-#if 0 /* See comment in fxsave() below. */
-		     : [fx] "r" (fx), "0" (0));
-#else
-		     : [fx] "cdaSDb" (fx), "0" (0));
-#endif
+		     : [fx] "R" (fx), "0" (0));
 	if (unlikely(err) &&
 	    __clear_user(fx, sizeof(struct i387_fxsave_struct)))
 		err = -EFAULT;
@@ -165,26 +159,22 @@ static inline void fpu_fxsave(struct fpu *fpu)
 	/* 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. */
-#if 0
-	/* 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
-	/* Using, as a workaround, the properly prefixed form below isn't
+	   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
 	   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));
-#endif
+	asm volatile("rex64/fxsave (%[fx])"
+		     : "=m" (fpu->state->fxsave)
+		     : [fx] "R" (&fpu->state->fxsave));
 }
 
 static inline void fpu_save_init(struct fpu *fpu)

^ permalink raw reply related	[flat|nested] 40+ messages in thread

* [tip:x86/fpu] x86-32, fpu: Remove math_emulate stub
  2010-09-04  1:17 ` [PATCH 08/12] x86-32: Remove math_emulate stub Brian Gerst
  2010-09-04  6:48   ` Pekka Enberg
@ 2010-09-10  1:48   ` tip-bot for Brian Gerst
  1 sibling, 0 replies; 40+ messages in thread
From: tip-bot for Brian Gerst @ 2010-09-10  1:48 UTC (permalink / raw)
  To: linux-tip-commits
  Cc: linux-kernel, hpa, mingo, brgerst, penberg, suresh.b.siddha, tglx,
	hpa

Commit-ID:  a334fe43d85f570ae907acf988a053c5eff78d6e
Gitweb:     http://git.kernel.org/tip/a334fe43d85f570ae907acf988a053c5eff78d6e
Author:     Brian Gerst <brgerst@gmail.com>
AuthorDate: Fri, 3 Sep 2010 21:17:15 -0400
Committer:  H. Peter Anvin <hpa@linux.intel.com>
CommitDate: Thu, 9 Sep 2010 14:17:11 -0700

x86-32, fpu: Remove math_emulate stub

check_fpu() in bugs.c halts boot if no FPU is found and math emulation
isn't enabled.  Therefore this stub will never be used.

Signed-off-by: Brian Gerst <brgerst@gmail.com>
Acked-by: Pekka Enberg <penberg@kernel.org>
Cc: Suresh Siddha <suresh.b.siddha@intel.com>
LKML-Reference: <1283563039-3466-9-git-send-email-brgerst@gmail.com>
Signed-off-by: H. Peter Anvin <hpa@linux.intel.com>
---
 arch/x86/kernel/traps.c |   23 ++++++-----------------
 1 files changed, 6 insertions(+), 17 deletions(-)

diff --git a/arch/x86/kernel/traps.c b/arch/x86/kernel/traps.c
index d0029eb..d439685 100644
--- a/arch/x86/kernel/traps.c
+++ b/arch/x86/kernel/traps.c
@@ -776,21 +776,10 @@ asmlinkage void math_state_restore(void)
 }
 EXPORT_SYMBOL_GPL(math_state_restore);
 
-#ifndef CONFIG_MATH_EMULATION
-void math_emulate(struct math_emu_info *info)
-{
-	printk(KERN_EMERG
-		"math-emulation not enabled and no coprocessor found.\n");
-	printk(KERN_EMERG "killing %s.\n", current->comm);
-	force_sig(SIGFPE, current);
-	schedule();
-}
-#endif /* CONFIG_MATH_EMULATION */
-
 dotraplinkage void __kprobes
 do_device_not_available(struct pt_regs *regs, long error_code)
 {
-#ifdef CONFIG_X86_32
+#ifdef CONFIG_MATH_EMULATION
 	if (read_cr0() & X86_CR0_EM) {
 		struct math_emu_info info = { };
 
@@ -798,12 +787,12 @@ do_device_not_available(struct pt_regs *regs, long error_code)
 
 		info.regs = regs;
 		math_emulate(&info);
-	} else {
-		math_state_restore(); /* interrupts still off */
-		conditional_sti(regs);
+		return;
 	}
-#else
-	math_state_restore();
+#endif
+	math_state_restore(); /* interrupts still off */
+#ifdef CONFIG_X86_32
+	conditional_sti(regs);
 #endif
 }
 

^ permalink raw reply related	[flat|nested] 40+ messages in thread

* [tip:x86/fpu] x86, fpu: Remove unnecessary ifdefs from i387 code.
  2010-09-04  1:17 ` [PATCH 09/12] x86: Remove unnecessary ifdefs from i387 code Brian Gerst
  2010-09-04  6:49   ` Pekka Enberg
@ 2010-09-10  1:48   ` tip-bot for Brian Gerst
  1 sibling, 0 replies; 40+ messages in thread
From: tip-bot for Brian Gerst @ 2010-09-10  1:48 UTC (permalink / raw)
  To: linux-tip-commits
  Cc: linux-kernel, hpa, mingo, brgerst, penberg, suresh.b.siddha, tglx,
	hpa

Commit-ID:  8eb91a577d7763d21628f6761045328784b1911c
Gitweb:     http://git.kernel.org/tip/8eb91a577d7763d21628f6761045328784b1911c
Author:     Brian Gerst <brgerst@gmail.com>
AuthorDate: Fri, 3 Sep 2010 21:17:16 -0400
Committer:  H. Peter Anvin <hpa@linux.intel.com>
CommitDate: Thu, 9 Sep 2010 14:17:18 -0700

x86, fpu: Remove unnecessary ifdefs from i387 code.

Remove ifdefs for code that the compiler can optimize away on 64-bit.

Signed-off-by: Brian Gerst <brgerst@gmail.com>
Acked-by: Pekka Enberg <penberg@kernel.org>
Cc: Suresh Siddha <suresh.b.siddha@intel.com>
LKML-Reference: <1283563039-3466-10-git-send-email-brgerst@gmail.com>
Signed-off-by: H. Peter Anvin <hpa@linux.intel.com>
---
 arch/x86/include/asm/i387.h |   12 ++++++------
 arch/x86/kernel/i387.c      |    4 ----
 2 files changed, 6 insertions(+), 10 deletions(-)

diff --git a/arch/x86/include/asm/i387.h b/arch/x86/include/asm/i387.h
index 768fcb2..42b507e 100644
--- a/arch/x86/include/asm/i387.h
+++ b/arch/x86/include/asm/i387.h
@@ -55,6 +55,12 @@ extern int save_i387_xstate_ia32(void __user *buf);
 extern int restore_i387_xstate_ia32(void __user *buf);
 #endif
 
+#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
+
 #define X87_FSW_ES (1 << 7)	/* Exception Summary */
 
 static __always_inline __pure bool use_xsaveopt(void)
@@ -189,12 +195,6 @@ static inline void fpu_save_init(struct fpu *fpu)
 
 #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
-
 /* perform fxrstor iff the processor has extended states, otherwise frstor */
 static inline int fxrstor_checking(struct i387_fxsave_struct *fx)
 {
diff --git a/arch/x86/kernel/i387.c b/arch/x86/kernel/i387.c
index f3775f5..e795e36 100644
--- a/arch/x86/kernel/i387.c
+++ b/arch/x86/kernel/i387.c
@@ -79,10 +79,8 @@ static void __cpuinit init_thread_xstate(void)
 
 	if (cpu_has_fxsr)
 		xstate_size = sizeof(struct i387_fxsave_struct);
-#ifdef CONFIG_X86_32
 	else
 		xstate_size = sizeof(struct i387_fsave_struct);
-#endif
 }
 
 /*
@@ -119,12 +117,10 @@ void __cpuinit fpu_init(void)
 
 void fpu_finit(struct fpu *fpu)
 {
-#ifdef CONFIG_X86_32
 	if (!HAVE_HWFP) {
 		finit_soft_fpu(&fpu->state->soft);
 		return;
 	}
-#endif
 
 	if (cpu_has_fxsr) {
 		struct i387_fxsave_struct *fx = &fpu->state->fxsave;

^ permalink raw reply related	[flat|nested] 40+ messages in thread

* [tip:x86/fpu] x86, fpu: Remove PSHUFB_XMM5_* macros
  2010-09-04  1:17 ` [PATCH 10/12] x86: Remove PSHUFB_XMM5_* macros Brian Gerst
  2010-09-04  6:49   ` Pekka Enberg
@ 2010-09-10  1:49   ` tip-bot for Brian Gerst
  1 sibling, 0 replies; 40+ messages in thread
From: tip-bot for Brian Gerst @ 2010-09-10  1:49 UTC (permalink / raw)
  To: linux-tip-commits
  Cc: linux-kernel, hpa, mingo, brgerst, penberg, suresh.b.siddha, tglx,
	hpa

Commit-ID:  eec73f813ab0954253e5e2168119c4555f83f07d
Gitweb:     http://git.kernel.org/tip/eec73f813ab0954253e5e2168119c4555f83f07d
Author:     Brian Gerst <brgerst@gmail.com>
AuthorDate: Fri, 3 Sep 2010 21:17:17 -0400
Committer:  H. Peter Anvin <hpa@linux.intel.com>
CommitDate: Thu, 9 Sep 2010 14:17:25 -0700

x86, fpu: Remove PSHUFB_XMM5_* macros

The PSHUFB_XMM5_* macros are no longer used.

Signed-off-by: Brian Gerst <brgerst@gmail.com>
Acked-by: Pekka Enberg <penberg@kernel.org>
Cc: Suresh Siddha <suresh.b.siddha@intel.com>
LKML-Reference: <1283563039-3466-11-git-send-email-brgerst@gmail.com>
Signed-off-by: H. Peter Anvin <hpa@linux.intel.com>
---
 arch/x86/include/asm/i387.h |    3 ---
 1 files changed, 0 insertions(+), 3 deletions(-)

diff --git a/arch/x86/include/asm/i387.h b/arch/x86/include/asm/i387.h
index 42b507e..907967e 100644
--- a/arch/x86/include/asm/i387.h
+++ b/arch/x86/include/asm/i387.h
@@ -465,7 +465,4 @@ extern void fpu_finit(struct fpu *fpu);
 
 #endif /* __ASSEMBLY__ */
 
-#define PSHUFB_XMM5_XMM0 .byte 0x66, 0x0f, 0x38, 0x00, 0xc5
-#define PSHUFB_XMM5_XMM6 .byte 0x66, 0x0f, 0x38, 0x00, 0xf5
-
 #endif /* _ASM_X86_I387_H */

^ permalink raw reply related	[flat|nested] 40+ messages in thread

* [tip:x86/fpu] x86-32, fpu: Rewrite fpu_save_init()
  2010-09-04  1:17 ` [PATCH 11/12] x86-32: Rewrite fpu_save_init() Brian Gerst
  2010-09-04  6:51   ` Pekka Enberg
@ 2010-09-10  1:49   ` tip-bot for Brian Gerst
  1 sibling, 0 replies; 40+ messages in thread
From: tip-bot for Brian Gerst @ 2010-09-10  1:49 UTC (permalink / raw)
  To: linux-tip-commits
  Cc: linux-kernel, hpa, mingo, brgerst, penberg, suresh.b.siddha, tglx,
	hpa

Commit-ID:  58a992b9cbaf449aeebd3575c3695a9eb5d95b5e
Gitweb:     http://git.kernel.org/tip/58a992b9cbaf449aeebd3575c3695a9eb5d95b5e
Author:     Brian Gerst <brgerst@gmail.com>
AuthorDate: Fri, 3 Sep 2010 21:17:18 -0400
Committer:  H. Peter Anvin <hpa@linux.intel.com>
CommitDate: Thu, 9 Sep 2010 14:17:31 -0700

x86-32, fpu: Rewrite fpu_save_init()

Rewrite fpu_save_init() to prepare for merging with 64-bit.

Signed-off-by: Brian Gerst <brgerst@gmail.com>
Acked-by: Pekka Enberg <penberg@kernel.org>
Cc: Suresh Siddha <suresh.b.siddha@intel.com>
LKML-Reference: <1283563039-3466-12-git-send-email-brgerst@gmail.com>
Signed-off-by: H. Peter Anvin <hpa@linux.intel.com>
---
 arch/x86/include/asm/i387.h |   47 ++++++++++++++++++++----------------------
 1 files changed, 22 insertions(+), 25 deletions(-)

diff --git a/arch/x86/include/asm/i387.h b/arch/x86/include/asm/i387.h
index 907967e..b45abef 100644
--- a/arch/x86/include/asm/i387.h
+++ b/arch/x86/include/asm/i387.h
@@ -73,6 +73,11 @@ static __always_inline __pure bool use_xsave(void)
 	return static_cpu_has(X86_FEATURE_XSAVE);
 }
 
+static __always_inline __pure bool use_fxsr(void)
+{
+        return static_cpu_has(X86_FEATURE_FXSR);
+}
+
 extern void __sanitize_i387_state(struct task_struct *);
 
 static inline void sanitize_i387_state(struct task_struct *tsk)
@@ -211,6 +216,12 @@ static inline int fxrstor_checking(struct i387_fxsave_struct *fx)
 	return 0;
 }
 
+static inline void fpu_fxsave(struct fpu *fpu)
+{
+	asm volatile("fxsave %[fx]"
+		     : [fx] "=m" (fpu->state->fxsave));
+}
+
 /* We need a safe address that is cheap to find and that is already
    in L1 during context switch. The best choices are unfortunately
    different for UP and SMP */
@@ -226,36 +237,24 @@ static inline int fxrstor_checking(struct i387_fxsave_struct *fx)
 static inline void fpu_save_init(struct fpu *fpu)
 {
 	if (use_xsave()) {
-		struct xsave_struct *xstate = &fpu->state->xsave;
-		struct i387_fxsave_struct *fx = &fpu->state->fxsave;
-
 		fpu_xsave(fpu);
 
 		/*
 		 * xsave header may indicate the init state of the FP.
 		 */
-		if (!(xstate->xsave_hdr.xstate_bv & XSTATE_FP))
-			goto end;
-
-		if (unlikely(fx->swd & X87_FSW_ES))
-			asm volatile("fnclex");
-
-		/*
-		 * we can do a simple return here or be paranoid :)
-		 */
-		goto clear_state;
+		if (!(fpu->state->xsave.xsave_hdr.xstate_bv & XSTATE_FP))
+			return;
+	} else if (use_fxsr()) {
+		fpu_fxsave(fpu);
+	} else {
+		asm volatile("fsave %[fx]; fwait"
+			     : [fx] "=m" (fpu->state->fsave));
+		return;
 	}
 
-	/* Use more nops than strictly needed in case the compiler
-	   varies code */
-	alternative_input(
-		"fnsave %[fx] ;fwait;" GENERIC_NOP8 GENERIC_NOP4,
-		"fxsave %[fx]\n"
-		"bt $7,%[fsw] ; jnc 1f ; fnclex\n1:",
-		X86_FEATURE_FXSR,
-		[fx] "m" (fpu->state->fxsave),
-		[fsw] "m" (fpu->state->fxsave.swd) : "memory");
-clear_state:
+	if (unlikely(fpu->state->fxsave.swd & X87_FSW_ES))
+		asm volatile("fnclex");
+
 	/* 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 */
@@ -265,8 +264,6 @@ clear_state:
 		"fildl %[addr]", 	/* set F?P to defined value */
 		X86_FEATURE_FXSAVE_LEAK,
 		[addr] "m" (safe_address));
-end:
-	;
 }
 
 #endif	/* CONFIG_X86_64 */

^ permalink raw reply related	[flat|nested] 40+ messages in thread

* [tip:x86/fpu] x86, fpu: Merge fpu_save_init()
  2010-09-04  1:17 ` [PATCH 12/12] x86: Merge fpu_save_init() Brian Gerst
  2010-09-04  6:51   ` Pekka Enberg
@ 2010-09-10  1:50   ` tip-bot for Brian Gerst
  1 sibling, 0 replies; 40+ messages in thread
From: tip-bot for Brian Gerst @ 2010-09-10  1:50 UTC (permalink / raw)
  To: linux-tip-commits
  Cc: linux-kernel, hpa, mingo, brgerst, penberg, suresh.b.siddha, tglx,
	hpa

Commit-ID:  b2b57fe053c9cf8b8af5a0e826a465996afed0ff
Gitweb:     http://git.kernel.org/tip/b2b57fe053c9cf8b8af5a0e826a465996afed0ff
Author:     Brian Gerst <brgerst@gmail.com>
AuthorDate: Fri, 3 Sep 2010 21:17:19 -0400
Committer:  H. Peter Anvin <hpa@linux.intel.com>
CommitDate: Thu, 9 Sep 2010 14:17:36 -0700

x86, fpu: Merge fpu_save_init()

Make 64-bit use the 32-bit version of fpu_save_init().  Remove
unused clear_fpu_state().

Signed-off-by: Brian Gerst <brgerst@gmail.com>
Acked-by: Pekka Enberg <penberg@kernel.org>
Cc: Suresh Siddha <suresh.b.siddha@intel.com>
LKML-Reference: <1283563039-3466-13-git-send-email-brgerst@gmail.com>
Signed-off-by: H. Peter Anvin <hpa@linux.intel.com>
---
 arch/x86/include/asm/i387.h |   48 +++---------------------------------------
 1 files changed, 4 insertions(+), 44 deletions(-)

diff --git a/arch/x86/include/asm/i387.h b/arch/x86/include/asm/i387.h
index b45abef..70626ed 100644
--- a/arch/x86/include/asm/i387.h
+++ b/arch/x86/include/asm/i387.h
@@ -105,36 +105,6 @@ static inline int fxrstor_checking(struct i387_fxsave_struct *fx)
 	return err;
 }
 
-/* AMD CPUs don't save/restore FDP/FIP/FOP unless an exception
-   is pending. Clear the x87 state here by setting it to fixed
-   values. The kernel data segment can be sometimes 0 and sometimes
-   new user value. Both should be ok.
-   Use the PDA as safe address because it should be already in L1. */
-static inline void fpu_clear(struct fpu *fpu)
-{
-	struct xsave_struct *xstate = &fpu->state->xsave;
-	struct i387_fxsave_struct *fx = &fpu->state->fxsave;
-
-	/*
-	 * xsave header may indicate the init state of the FP.
-	 */
-	if (use_xsave() &&
-	    !(xstate->xsave_hdr.xstate_bv & XSTATE_FP))
-		return;
-
-	if (unlikely(fx->swd & X87_FSW_ES))
-		asm volatile("fnclex");
-	alternative_input(ASM_NOP8 ASM_NOP2,
-			  "    emms\n"		/* clear stack tags */
-			  "    fildl %%gs:0",	/* load to clear state */
-			  X86_FEATURE_FXSAVE_LEAK);
-}
-
-static inline void clear_fpu_state(struct task_struct *tsk)
-{
-	fpu_clear(&tsk->thread.fpu);
-}
-
 static inline int fxsave_user(struct i387_fxsave_struct __user *fx)
 {
 	int err;
@@ -188,16 +158,6 @@ static inline void fpu_fxsave(struct fpu *fpu)
 		     : [fx] "R" (&fpu->state->fxsave));
 }
 
-static inline void fpu_save_init(struct fpu *fpu)
-{
-	if (use_xsave())
-		fpu_xsave(fpu);
-	else
-		fpu_fxsave(fpu);
-
-	fpu_clear(fpu);
-}
-
 #else  /* CONFIG_X86_32 */
 
 /* perform fxrstor iff the processor has extended states, otherwise frstor */
@@ -222,6 +182,8 @@ static inline void fpu_fxsave(struct fpu *fpu)
 		     : [fx] "=m" (fpu->state->fxsave));
 }
 
+#endif	/* CONFIG_X86_64 */
+
 /* We need a safe address that is cheap to find and that is already
    in L1 during context switch. The best choices are unfortunately
    different for UP and SMP */
@@ -259,15 +221,13 @@ static inline void fpu_save_init(struct fpu *fpu)
 	   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(
-		GENERIC_NOP8 GENERIC_NOP2,
+		ASM_NOP8 ASM_NOP2,
 		"emms\n\t"	  	/* clear stack tags */
-		"fildl %[addr]", 	/* set F?P to defined value */
+		"fildl %P[addr]",	/* set F?P to defined value */
 		X86_FEATURE_FXSAVE_LEAK,
 		[addr] "m" (safe_address));
 }
 
-#endif	/* CONFIG_X86_64 */
-
 static inline void __save_init_fpu(struct task_struct *tsk)
 {
 	fpu_save_init(&tsk->thread.fpu);

^ permalink raw reply related	[flat|nested] 40+ messages in thread

end of thread, other threads:[~2010-09-10  1:55 UTC | newest]

Thread overview: 40+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2010-09-04  1:17 [PATCH 0/12] x86 FPU cleanups (v2) Brian Gerst
2010-09-04  1:17 ` [PATCH 01/12] x86: Use correct type for %cr4 Brian Gerst
2010-09-04  6:45   ` Pekka Enberg
2010-09-10  1:46   ` [tip:x86/fpu] " tip-bot for Brian Gerst
2010-09-04  1:17 ` [PATCH 02/12] x86: Merge fpu_init() Brian Gerst
2010-09-04  6:45   ` Pekka Enberg
2010-09-10  1:46   ` [tip:x86/fpu] x86, fpu: " tip-bot for Brian Gerst
2010-09-04  1:17 ` [PATCH 03/12] x86: Merge tolerant_fwait() Brian Gerst
2010-09-04  6:46   ` Pekka Enberg
2010-09-10  1:46   ` [tip:x86/fpu] x86, fpu: " tip-bot for Brian Gerst
2010-09-04  1:17 ` [PATCH 04/12] x86: Merge __save_init_fpu() Brian Gerst
2010-09-04  6:47   ` Pekka Enberg
2010-09-10  1:47   ` [tip:x86/fpu] x86, fpu: " tip-bot for Brian Gerst
2010-09-04  1:17 ` [PATCH 05/12] x86-64: Disable preemption when using TS_USEDFPU Brian Gerst
2010-09-04  6:47   ` Pekka Enberg
2010-09-10  1:47   ` [tip:x86/fpu] x86-64, fpu: " tip-bot for Brian Gerst
2010-09-04  1:17 ` [PATCH 06/12] x86-64: Fix %cs value in convert_from_fxsr() Brian Gerst
2010-09-04  6:51   ` Pekka Enberg
2010-09-10  1:47   ` [tip:x86/fpu] x86-64, fpu: " tip-bot for Brian Gerst
2010-09-04  1:17 ` [PATCH 07/12] x86-64: Simplify constraints for fxsave/fxtstor Brian Gerst
2010-09-04  6:48   ` Pekka Enberg
2010-09-09 21:22   ` H. Peter Anvin
2010-09-09 23:43     ` Brian Gerst
2010-09-10  1:48   ` [tip:x86/fpu] x86-64, fpu: " tip-bot for Brian Gerst
2010-09-04  1:17 ` [PATCH 08/12] x86-32: Remove math_emulate stub Brian Gerst
2010-09-04  6:48   ` Pekka Enberg
2010-09-10  1:48   ` [tip:x86/fpu] x86-32, fpu: " tip-bot for Brian Gerst
2010-09-04  1:17 ` [PATCH 09/12] x86: Remove unnecessary ifdefs from i387 code Brian Gerst
2010-09-04  6:49   ` Pekka Enberg
2010-09-10  1:48   ` [tip:x86/fpu] x86, fpu: " tip-bot for Brian Gerst
2010-09-04  1:17 ` [PATCH 10/12] x86: Remove PSHUFB_XMM5_* macros Brian Gerst
2010-09-04  6:49   ` Pekka Enberg
2010-09-10  1:49   ` [tip:x86/fpu] x86, fpu: " tip-bot for Brian Gerst
2010-09-04  1:17 ` [PATCH 11/12] x86-32: Rewrite fpu_save_init() Brian Gerst
2010-09-04  6:51   ` Pekka Enberg
2010-09-10  1:49   ` [tip:x86/fpu] x86-32, fpu: " tip-bot for Brian Gerst
2010-09-04  1:17 ` [PATCH 12/12] x86: Merge fpu_save_init() Brian Gerst
2010-09-04  6:51   ` Pekka Enberg
2010-09-10  1:50   ` [tip:x86/fpu] x86, fpu: " tip-bot for Brian Gerst
2010-09-04  6:45 ` [PATCH 0/12] x86 FPU cleanups (v2) Pekka Enberg

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox