All of lore.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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.