Module Name: src
Committed By: maxv
Date: Wed Oct 30 17:06:57 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
Log Message:
More inlined ASM.
To generate a diff of this commit:
cvs rdiff -u -r1.45 -r1.46 src/sys/arch/amd64/amd64/cpufunc.S
cvs rdiff -u -r1.35 -r1.36 src/sys/arch/i386/i386/cpufunc.S
cvs rdiff -u -r1.36 -r1.37 src/sys/arch/x86/include/cpufunc.h
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.45 src/sys/arch/amd64/amd64/cpufunc.S:1.46
--- src/sys/arch/amd64/amd64/cpufunc.S:1.45 Sat Sep 7 18:56:01 2019
+++ src/sys/arch/amd64/amd64/cpufunc.S Wed Oct 30 17:06:57 2019
@@ -1,4 +1,4 @@
-/* $NetBSD: cpufunc.S,v 1.45 2019/09/07 18:56:01 maxv Exp $ */
+/* $NetBSD: cpufunc.S,v 1.46 2019/10/30 17:06:57 maxv Exp $ */
/*
* Copyright (c) 1998, 2007, 2008 The NetBSD Foundation, Inc.
@@ -313,16 +313,6 @@ ENTRY(x86_mwait)
ret
END(x86_mwait)
-ENTRY(fnsave)
- fnsave (%rdi)
- ret
-END(fnsave)
-
-ENTRY(frstor)
- frstor (%rdi)
- ret
-END(frstor)
-
ENTRY(stts)
movq %cr0, %rax
orq $CR0_TS, %rax
@@ -330,46 +320,12 @@ ENTRY(stts)
ret
END(stts)
-ENTRY(fxsave)
- fxsave (%rdi)
- ret
-END(fxsave)
-
-ENTRY(fxrstor)
- fxrstor (%rdi)
- ret
-END(fxrstor)
-
ENTRY(fldummy)
ffree %st(7)
fldz
ret
END(fldummy)
-ENTRY(xsave)
- movq %rsi, %rax
- movq %rsi, %rdx
- shrq $32, %rdx
- xsave (%rdi)
- ret
-END(xsave)
-
-ENTRY(xsaveopt)
- movq %rsi, %rax
- movq %rsi, %rdx
- shrq $32, %rdx
- xsaveopt (%rdi)
- ret
-END(xsaveopt)
-
-ENTRY(xrstor)
- movq %rsi, %rax
- movq %rsi, %rdx
- shrq $32, %rdx
- xrstor (%rdi)
- ret
-END(xrstor)
-
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.35 src/sys/arch/i386/i386/cpufunc.S:1.36
--- src/sys/arch/i386/i386/cpufunc.S:1.35 Sat Sep 7 18:33:16 2019
+++ src/sys/arch/i386/i386/cpufunc.S Wed Oct 30 17:06:57 2019
@@ -1,4 +1,4 @@
-/* $NetBSD: cpufunc.S,v 1.35 2019/09/07 18:33:16 maxv Exp $ */
+/* $NetBSD: cpufunc.S,v 1.36 2019/10/30 17:06:57 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.35 2019/09/07 18:33:16 maxv Exp $");
+__KERNEL_RCSID(0, "$NetBSD: cpufunc.S,v 1.36 2019/10/30 17:06:57 maxv Exp $");
#include "opt_xen.h"
@@ -224,18 +224,6 @@ ENTRY(x86_mwait)
ret
END(x86_mwait)
-ENTRY(fnsave)
- movl 4(%esp), %eax
- fnsave (%eax)
- ret
-END(fnsave)
-
-ENTRY(frstor)
- movl 4(%esp), %eax
- frstor (%eax)
- ret
-END(frstor)
-
ENTRY(stts)
movl %cr0, %eax
testl $CR0_TS, %eax
@@ -246,42 +234,6 @@ ENTRY(stts)
ret
END(stts)
-ENTRY(fxsave)
- movl 4(%esp), %eax
- fxsave (%eax)
- ret
-END(fxsave)
-
-ENTRY(fxrstor)
- movl 4(%esp), %eax
- fxrstor (%eax)
- ret
-END(fxrstor)
-
-ENTRY(xsave)
- movl 4(%esp), %ecx
- movl 8(%esp), %eax /* feature mask bits */
- movl 12(%esp), %edx
- xsave (%ecx)
- ret
-END(xsave)
-
-ENTRY(xsaveopt)
- movl 4(%esp), %ecx
- movl 8(%esp), %eax /* feature mask bits */
- movl 12(%esp), %edx
- xsaveopt (%ecx)
- ret
-END(xsaveopt)
-
-ENTRY(xrstor)
- movl 4(%esp), %ecx
- movl 8(%esp), %eax /* feature mask bits */
- movl 12(%esp), %edx
- xrstor (%ecx)
- ret
-END(xrstor)
-
ENTRY(fldummy)
ffree %st(7)
fldz
Index: src/sys/arch/x86/include/cpufunc.h
diff -u src/sys/arch/x86/include/cpufunc.h:1.36 src/sys/arch/x86/include/cpufunc.h:1.37
--- src/sys/arch/x86/include/cpufunc.h:1.36 Sat Sep 7 18:33:16 2019
+++ src/sys/arch/x86/include/cpufunc.h Wed Oct 30 17:06:57 2019
@@ -1,4 +1,4 @@
-/* $NetBSD: cpufunc.h,v 1.36 2019/09/07 18:33:16 maxv Exp $ */
+/* $NetBSD: cpufunc.h,v 1.37 2019/10/30 17:06:57 maxv Exp $ */
/*
* Copyright (c) 1998, 2007, 2019 The NetBSD Foundation, Inc.
@@ -358,15 +358,105 @@ wrxcr(uint32_t xcr, uint64_t val)
);
}
-void fnsave(union savefpu *);
-void frstor(const union savefpu *);
+static inline void
+fnsave(void *addr)
+{
+ uint8_t *area = addr;
+
+ __asm volatile (
+ "fnsave %[area]"
+ : [area] "=m" (*area)
+ :
+ : "memory"
+ );
+}
-void fxsave(union savefpu *);
-void fxrstor(const union savefpu *);
+static inline void
+frstor(void *addr)
+{
+ const uint8_t *area = addr;
+
+ __asm volatile (
+ "frstor %[area]"
+ :
+ : [area] "m" (*area)
+ : "memory"
+ );
+}
-void xsave(union savefpu *, uint64_t);
-void xsaveopt(union savefpu *, uint64_t);
-void xrstor(const union savefpu *, uint64_t);
+static inline void
+fxsave(void *addr)
+{
+ uint8_t *area = addr;
+
+ __asm volatile (
+ "fxsave %[area]"
+ : [area] "=m" (*area)
+ :
+ : "memory"
+ );
+}
+
+static inline void
+fxrstor(void *addr)
+{
+ const uint8_t *area = addr;
+
+ __asm volatile (
+ "fxrstor %[area]"
+ :
+ : [area] "m" (*area)
+ : "memory"
+ );
+}
+
+static inline void
+xsave(void *addr, uint64_t mask)
+{
+ uint8_t *area = addr;
+ uint32_t low, high;
+
+ low = mask;
+ high = mask >> 32;
+ __asm volatile (
+ "xsave %[area]"
+ : [area] "=m" (*area)
+ : "a" (low), "d" (high)
+ : "memory"
+ );
+}
+
+static inline void
+xsaveopt(void *addr, uint64_t mask)
+{
+ uint8_t *area = addr;
+ uint32_t low, high;
+
+ low = mask;
+ high = mask >> 32;
+ __asm volatile (
+ "xsaveopt %[area]"
+ : [area] "=m" (*area)
+ : "a" (low), "d" (high)
+ : "memory"
+ );
+}
+
+static inline void
+xrstor(void *addr, uint64_t mask)
+{
+ const uint8_t *area = addr;
+ uint32_t low, high;
+
+ low = mask;
+ high = mask >> 32;
+ __asm volatile (
+ "xrstor %[area]"
+ :
+ : [area] "m" (*area), "a" (low), "d" (high)
+ : "memory"
+ );
+}
/* -------------------------------------------------------------------------- */