Module Name: src
Committed By: maxv
Date: Fri Jul 5 17:08:56 UTC 2019
Modified Files:
src/sys/arch/amd64/amd64: cpufunc.S
src/sys/arch/i386/i386: cpufunc.S
src/sys/arch/x86/include: cpufunc.h
src/sys/arch/x86/x86: fpu.c
Log Message:
More inlines, prerequisites for future changes. Also, remove fngetsw(),
which was a duplicate of fnstsw().
To generate a diff of this commit:
cvs rdiff -u -r1.42 -r1.43 src/sys/arch/amd64/amd64/cpufunc.S
cvs rdiff -u -r1.33 -r1.34 src/sys/arch/i386/i386/cpufunc.S
cvs rdiff -u -r1.33 -r1.34 src/sys/arch/x86/include/cpufunc.h
cvs rdiff -u -r1.54 -r1.55 src/sys/arch/x86/x86/fpu.c
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/sys/arch/amd64/amd64/cpufunc.S
diff -u src/sys/arch/amd64/amd64/cpufunc.S:1.42 src/sys/arch/amd64/amd64/cpufunc.S:1.43
--- src/sys/arch/amd64/amd64/cpufunc.S:1.42 Wed Jul 3 17:24:37 2019
+++ src/sys/arch/amd64/amd64/cpufunc.S Fri Jul 5 17:08:55 2019
@@ -1,4 +1,4 @@
-/* $NetBSD: cpufunc.S,v 1.42 2019/07/03 17:24:37 maxv Exp $ */
+/* $NetBSD: cpufunc.S,v 1.43 2019/07/05 17:08:55 maxv Exp $ */
/*
* Copyright (c) 1998, 2007, 2008 The NetBSD Foundation, Inc.
@@ -363,21 +363,6 @@ ENTRY(fnsave)
ret
END(fnsave)
-ENTRY(fnstcw)
- fnstcw (%rdi)
- ret
-END(fnstcw)
-
-ENTRY(fngetsw)
- fnstsw %ax
- ret
-END(fngetsw)
-
-ENTRY(fnstsw)
- fnstsw (%rdi)
- ret
-END(fnstsw)
-
ENTRY(frstor)
frstor (%rdi)
ret
@@ -430,16 +415,6 @@ ENTRY(xrstor)
ret
END(xrstor)
-ENTRY(x86_stmxcsr)
- stmxcsr (%rdi)
- ret
-END(x86_stmxcsr)
-
-ENTRY(x86_ldmxcsr)
- ldmxcsr (%rdi)
- ret
-END(x86_ldmxcsr)
-
ENTRY(inb)
movq %rdi, %rdx
xorq %rax, %rax
Index: src/sys/arch/i386/i386/cpufunc.S
diff -u src/sys/arch/i386/i386/cpufunc.S:1.33 src/sys/arch/i386/i386/cpufunc.S:1.34
--- src/sys/arch/i386/i386/cpufunc.S:1.33 Wed Jul 3 17:24:37 2019
+++ src/sys/arch/i386/i386/cpufunc.S Fri Jul 5 17:08:55 2019
@@ -1,4 +1,4 @@
-/* $NetBSD: cpufunc.S,v 1.33 2019/07/03 17:24:37 maxv Exp $ */
+/* $NetBSD: cpufunc.S,v 1.34 2019/07/05 17:08:55 maxv Exp $ */
/*-
* Copyright (c) 1998, 2007 The NetBSD Foundation, Inc.
@@ -38,7 +38,7 @@
#include <sys/errno.h>
#include <machine/asm.h>
-__KERNEL_RCSID(0, "$NetBSD: cpufunc.S,v 1.33 2019/07/03 17:24:37 maxv Exp $");
+__KERNEL_RCSID(0, "$NetBSD: cpufunc.S,v 1.34 2019/07/05 17:08:55 maxv Exp $");
#include "opt_xen.h"
@@ -250,23 +250,6 @@ ENTRY(fnsave)
ret
END(fnsave)
-ENTRY(fnstcw)
- movl 4(%esp), %eax
- fnstcw (%eax)
- ret
-END(fnstcw)
-
-ENTRY(fngetsw)
- fnstsw %ax
- ret
-END(fngetsw)
-
-ENTRY(fnstsw)
- movl 4(%esp), %eax
- fnstsw (%eax)
- ret
-END(fnstsw)
-
ENTRY(frstor)
movl 4(%esp), %eax
frstor (%eax)
@@ -319,18 +302,6 @@ ENTRY(xrstor)
ret
END(xrstor)
-ENTRY(x86_stmxcsr)
- movl 4(%esp), %eax
- stmxcsr (%eax)
- ret
-END(x86_stmxcsr)
-
-ENTRY(x86_ldmxcsr)
- movl 4(%esp), %eax
- ldmxcsr (%eax)
- ret
-END(x86_ldmxcsr)
-
ENTRY(fldummy)
ffree %st(7)
fldz
Index: src/sys/arch/x86/include/cpufunc.h
diff -u src/sys/arch/x86/include/cpufunc.h:1.33 src/sys/arch/x86/include/cpufunc.h:1.34
--- src/sys/arch/x86/include/cpufunc.h:1.33 Wed Jul 3 17:24:37 2019
+++ src/sys/arch/x86/include/cpufunc.h Fri Jul 5 17:08:55 2019
@@ -1,4 +1,4 @@
-/* $NetBSD: cpufunc.h,v 1.33 2019/07/03 17:24:37 maxv Exp $ */
+/* $NetBSD: cpufunc.h,v 1.34 2019/07/05 17:08:55 maxv Exp $ */
/*
* Copyright (c) 1998, 2007, 2019 The NetBSD Foundation, Inc.
@@ -280,11 +280,25 @@ fnclex(void)
__asm volatile ("fnclex");
}
-void fnsave(union savefpu *);
-void fnstcw(uint16_t *);
-uint16_t fngetsw(void);
-void fnstsw(uint16_t *);
-void frstor(const union savefpu *);
+static inline void
+fnstcw(uint16_t *val)
+{
+ __asm volatile (
+ "fnstcw %[val]"
+ : [val] "=m" (*val)
+ :
+ );
+}
+
+static inline void
+fnstsw(uint16_t *val)
+{
+ __asm volatile (
+ "fnstsw %[val]"
+ : [val] "=m" (*val)
+ :
+ );
+}
static inline void
clts(void)
@@ -293,11 +307,27 @@ clts(void)
}
void stts(void);
-void fxsave(union savefpu *);
-void fxrstor(const union savefpu *);
-void x86_ldmxcsr(const uint32_t *);
-void x86_stmxcsr(uint32_t *);
+static inline void
+x86_stmxcsr(uint32_t *val)
+{
+ __asm volatile (
+ "stmxcsr %[val]"
+ : [val] "=m" (*val)
+ :
+ );
+}
+
+static inline void
+x86_ldmxcsr(uint32_t *val)
+{
+ __asm volatile (
+ "ldmxcsr %[val]"
+ :
+ : [val] "m" (*val)
+ );
+}
+
void fldummy(void);
static inline uint64_t
@@ -328,9 +358,15 @@ wrxcr(uint32_t xcr, uint64_t val)
);
}
-void xrstor(const union savefpu *, uint64_t);
+void fnsave(union savefpu *);
+void frstor(const union savefpu *);
+
+void fxsave(union savefpu *);
+void fxrstor(const union savefpu *);
+
void xsave(union savefpu *, uint64_t);
void xsaveopt(union savefpu *, uint64_t);
+void xrstor(const union savefpu *, uint64_t);
/* -------------------------------------------------------------------------- */
Index: src/sys/arch/x86/x86/fpu.c
diff -u src/sys/arch/x86/x86/fpu.c:1.54 src/sys/arch/x86/x86/fpu.c:1.55
--- src/sys/arch/x86/x86/fpu.c:1.54 Wed Jun 26 12:30:13 2019
+++ src/sys/arch/x86/x86/fpu.c Fri Jul 5 17:08:56 2019
@@ -1,4 +1,4 @@
-/* $NetBSD: fpu.c,v 1.54 2019/06/26 12:30:13 mgorny Exp $ */
+/* $NetBSD: fpu.c,v 1.55 2019/07/05 17:08:56 maxv Exp $ */
/*
* Copyright (c) 2008 The NetBSD Foundation, Inc. All
@@ -96,7 +96,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: fpu.c,v 1.54 2019/06/26 12:30:13 mgorny Exp $");
+__KERNEL_RCSID(0, "$NetBSD: fpu.c,v 1.55 2019/07/05 17:08:56 maxv Exp $");
#include "opt_multiprocessor.h"
@@ -188,6 +188,8 @@ fpuinit_mxcsr_mask(void)
static inline void
fpu_errata_amd(void)
{
+ uint16_t sw;
+
/*
* AMD FPUs do not restore FIP, FDP, and FOP on fxrstor and xrstor
* when FSW.ES=0, leaking other threads' execution history.
@@ -203,7 +205,8 @@ fpu_errata_amd(void)
* which indicates that FIP/FDP/FOP are restored (same behavior
* as Intel). We're not using it though.
*/
- if (fngetsw() & 0x80)
+ fnstsw(&sw);
+ if (sw & 0x80)
fnclex();
fldummy();
}