From: tip-bot for Brian Gerst <brgerst@gmail.com>
To: linux-tip-commits@vger.kernel.org
Cc: linux-kernel@vger.kernel.org, hpa@zytor.com, mingo@redhat.com,
brgerst@gmail.com, penberg@kernel.org, suresh.b.siddha@intel.com,
tglx@linutronix.de, hpa@linux.intel.com
Subject: [tip:x86/fpu] x86-32, fpu: Rewrite fpu_save_init()
Date: Fri, 10 Sep 2010 01:49:41 GMT [thread overview]
Message-ID: <tip-58a992b9cbaf449aeebd3575c3695a9eb5d95b5e@git.kernel.org> (raw)
In-Reply-To: <1283563039-3466-12-git-send-email-brgerst@gmail.com>
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 */
next prev parent reply other threads:[~2010-09-10 1:54 UTC|newest]
Thread overview: 40+ messages / expand[flat|nested] mbox.gz Atom feed top
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-bot for Brian Gerst [this message]
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
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=tip-58a992b9cbaf449aeebd3575c3695a9eb5d95b5e@git.kernel.org \
--to=brgerst@gmail.com \
--cc=hpa@linux.intel.com \
--cc=hpa@zytor.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-tip-commits@vger.kernel.org \
--cc=mingo@redhat.com \
--cc=penberg@kernel.org \
--cc=suresh.b.siddha@intel.com \
--cc=tglx@linutronix.de \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox