summaryrefslogtreecommitdiffstats
path: root/sys/i386/isa
diff options
context:
space:
mode:
authorjhb <jhb@FreeBSD.org>2012-07-09 20:55:39 +0000
committerjhb <jhb@FreeBSD.org>2012-07-09 20:55:39 +0000
commit501beca671a3ea893482559b54b30ab166ad3d75 (patch)
treedc9080f4848fba24288806991434be319bb1d32a /sys/i386/isa
parentfb20c6fee6baf0d773d72b8e0a63489e2e7cb188 (diff)
downloadFreeBSD-src-501beca671a3ea893482559b54b30ab166ad3d75.zip
FreeBSD-src-501beca671a3ea893482559b54b30ab166ad3d75.tar.gz
Add a clts() wrapper around the 'clts' instruction to <machine/cpufunc.h>
on x86 and use that to implement stop_emulating() in the fpu/npx code. Reimplement start_emulating() in the non-XEN case by using load_cr0() and rcr0() instead of the 'lmsw' and 'smsw' instructions. Intel explicitly discourages the use of 'lmsw' and 'smsw' on 80386 and later processors in the description of these instructions in Volume 2 of the ADM. Reviewed by: kib MFC after: 1 month
Diffstat (limited to 'sys/i386/isa')
-rw-r--r--sys/i386/isa/npx.c19
1 files changed, 8 insertions, 11 deletions
diff --git a/sys/i386/isa/npx.c b/sys/i386/isa/npx.c
index 0da580f..50c812c 100644
--- a/sys/i386/isa/npx.c
+++ b/sys/i386/isa/npx.c
@@ -100,15 +100,6 @@ __FBSDID("$FreeBSD$");
#define fxrstor(addr) __asm __volatile("fxrstor %0" : : "m" (*(addr)))
#define fxsave(addr) __asm __volatile("fxsave %0" : "=m" (*(addr)))
#endif
-#ifdef XEN
-#define start_emulating() (HYPERVISOR_fpu_taskswitch(1))
-#define stop_emulating() (HYPERVISOR_fpu_taskswitch(0))
-#else
-#define start_emulating() __asm __volatile( \
- "smsw %%ax; orb %0,%%al; lmsw %%ax" \
- : : "n" (CR0_TS) : "ax")
-#define stop_emulating() __asm __volatile("clts")
-#endif
#else /* !(__GNUCLIKE_ASM && !lint) */
void fldcw(u_short cw);
@@ -123,11 +114,17 @@ void frstor(caddr_t addr);
void fxsave(caddr_t addr);
void fxrstor(caddr_t addr);
#endif
-void start_emulating(void);
-void stop_emulating(void);
#endif /* __GNUCLIKE_ASM && !lint */
+#ifdef XEN
+#define start_emulating() (HYPERVISOR_fpu_taskswitch(1))
+#define stop_emulating() (HYPERVISOR_fpu_taskswitch(0))
+#else
+#define start_emulating() load_cr0(rcr0() | CR0_TS)
+#define stop_emulating() clts()
+#endif
+
#ifdef CPU_ENABLE_SSE
#define GET_FPU_CW(thread) \
(cpu_fxsr ? \
OpenPOWER on IntegriCloud