Module Name: src
Committed By: maxv
Date: Sat May 4 07:20:22 UTC 2019
Modified Files:
src/sys/arch/amd64/amd64: cpufunc.S
src/sys/arch/i386/i386: cpufunc.S i386func.S
src/sys/arch/x86/include: cpufunc.h
src/sys/arch/xen/x86: xenfunc.c
Log Message:
More inlined ASM. While here switch to proper types.
To generate a diff of this commit:
cvs rdiff -u -r1.38 -r1.39 src/sys/arch/amd64/amd64/cpufunc.S
cvs rdiff -u -r1.30 -r1.31 src/sys/arch/i386/i386/cpufunc.S
cvs rdiff -u -r1.20 -r1.21 src/sys/arch/i386/i386/i386func.S
cvs rdiff -u -r1.26 -r1.27 src/sys/arch/x86/include/cpufunc.h
cvs rdiff -u -r1.24 -r1.25 src/sys/arch/xen/x86/xenfunc.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.38 src/sys/arch/amd64/amd64/cpufunc.S:1.39
--- src/sys/arch/amd64/amd64/cpufunc.S:1.38 Wed May 1 15:17:49 2019
+++ src/sys/arch/amd64/amd64/cpufunc.S Sat May 4 07:20:22 2019
@@ -1,4 +1,4 @@
-/* $NetBSD: cpufunc.S,v 1.38 2019/05/01 15:17:49 maxv Exp $ */
+/* $NetBSD: cpufunc.S,v 1.39 2019/05/04 07:20:22 maxv Exp $ */
/*
* Copyright (c) 1998, 2007, 2008 The NetBSD Foundation, Inc.
@@ -88,58 +88,8 @@ ENTRY(ltr)
ltr %di
ret
END(ltr)
-
-ENTRY(lcr0)
- movq %rdi, %cr0
- ret
-END(lcr0)
-
-ENTRY(rcr0)
- movq %cr0, %rax
- ret
-END(rcr0)
-
-ENTRY(lcr2)
- movq %rdi, %cr2
- ret
-END(lcr2)
-
-ENTRY(rcr2)
- movq %cr2, %rax
- ret
-END(rcr2)
-
-ENTRY(lcr3)
- movq %rdi, %cr3
- ret
-END(lcr3)
-
-ENTRY(rcr3)
- movq %cr3, %rax
- ret
-END(rcr3)
#endif
-ENTRY(lcr4)
- movq %rdi, %cr4
- ret
-END(lcr4)
-
-ENTRY(rcr4)
- movq %cr4, %rax
- ret
-END(rcr4)
-
-ENTRY(lcr8)
- movq %rdi, %cr8
- ret
-END(lcr8)
-
-ENTRY(rcr8)
- movq %cr8, %rax
- ret
-END(rcr8)
-
/*
* Big hammer: flush all TLB entries, including ones from PTE's
* with the G bit set. This should only be necessary if TLB
@@ -177,76 +127,6 @@ ENTRY(tlbflush)
ret
END(tlbflush)
-ENTRY(ldr0)
- movq %rdi, %dr0
- ret
-END(ldr0)
-
-ENTRY(rdr0)
- movq %dr0, %rax
- ret
-END(rdr0)
-
-ENTRY(ldr1)
- movq %rdi, %dr1
- ret
-END(ldr1)
-
-ENTRY(rdr1)
- movq %dr1, %rax
- ret
-END(rdr1)
-
-ENTRY(ldr2)
- movq %rdi, %dr2
- ret
-END(ldr2)
-
-ENTRY(rdr2)
- movq %dr2, %rax
- ret
-END(rdr2)
-
-ENTRY(ldr3)
- movq %rdi, %dr3
- ret
-END(ldr3)
-
-ENTRY(rdr3)
- movq %dr3, %rax
- ret
-END(rdr3)
-
-ENTRY(ldr6)
- movq %rdi, %dr6
- ret
-END(ldr6)
-
-ENTRY(rdr6)
- movq %dr6, %rax
- ret
-END(rdr6)
-
-ENTRY(ldr7)
- movq %rdi, %dr7
- ret
-END(ldr7)
-
-ENTRY(rdr7)
- movq %dr7, %rax
- ret
-END(rdr7)
-
-ENTRY(x86_disable_intr)
- cli
- ret
-END(x86_disable_intr)
-
-ENTRY(x86_enable_intr)
- sti
- ret
-END(x86_enable_intr)
-
ENTRY(x86_read_flags)
pushfq
popq %rax
@@ -469,21 +349,6 @@ ENTRY(x86_cpuid2)
ret
END(x86_cpuid2)
-ENTRY(x86_getss)
- movl %ss, %eax
- ret
-END(x86_getss)
-
-ENTRY(fnclex)
- fnclex
- ret
-END(fnclex)
-
-ENTRY(fninit)
- fninit
- ret
-END(fninit)
-
ENTRY(fnsave)
fnsave (%rdi)
ret
@@ -664,21 +529,6 @@ ENTRY(outsl)
ret
END(outsl)
-ENTRY(setds)
- movw %di, %ds
- ret
-END(setds)
-
-ENTRY(setes)
- movw %di, %es
- ret
-END(setes)
-
-ENTRY(setfs)
- movw %di, %fs
- ret
-END(setfs)
-
#ifndef XENPV
ENTRY(setusergs)
CLI(ax)
Index: src/sys/arch/i386/i386/cpufunc.S
diff -u src/sys/arch/i386/i386/cpufunc.S:1.30 src/sys/arch/i386/i386/cpufunc.S:1.31
--- src/sys/arch/i386/i386/cpufunc.S:1.30 Wed May 1 15:17:49 2019
+++ src/sys/arch/i386/i386/cpufunc.S Sat May 4 07:20:22 2019
@@ -1,4 +1,4 @@
-/* $NetBSD: cpufunc.S,v 1.30 2019/05/01 15:17:49 maxv Exp $ */
+/* $NetBSD: cpufunc.S,v 1.31 2019/05/04 07:20:22 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.30 2019/05/01 15:17:49 maxv Exp $");
+__KERNEL_RCSID(0, "$NetBSD: cpufunc.S,v 1.31 2019/05/04 07:20:22 maxv Exp $");
#include "opt_xen.h"
@@ -73,22 +73,6 @@ ENTRY(lidt)
END(lidt)
#endif /* XENPV */
-ENTRY(rcr3)
- movl %cr3, %eax
- ret
-END(rcr3)
-
-ENTRY(lcr4)
- movl 4(%esp), %eax
- movl %eax, %cr4
- ret
-END(lcr4)
-
-ENTRY(rcr4)
- movl %cr4, %eax
- ret
-END(rcr4)
-
ENTRY(x86_read_flags)
pushfl
popl %eax
@@ -276,21 +260,6 @@ ENTRY(x86_cpuid2)
ret
END(x86_cpuid2)
-ENTRY(x86_getss)
- movl %ss, %eax
- ret
-END(x86_getss)
-
-ENTRY(fnclex)
- fnclex
- ret
-END(fnclex)
-
-ENTRY(fninit)
- fninit
- ret
-END(fninit)
-
ENTRY(fnsave)
movl 4(%esp), %eax
fnsave (%eax)
Index: src/sys/arch/i386/i386/i386func.S
diff -u src/sys/arch/i386/i386/i386func.S:1.20 src/sys/arch/i386/i386/i386func.S:1.21
--- src/sys/arch/i386/i386/i386func.S:1.20 Sun Jan 6 14:35:31 2019
+++ src/sys/arch/i386/i386/i386func.S Sat May 4 07:20:22 2019
@@ -1,4 +1,4 @@
-/* $NetBSD: i386func.S,v 1.20 2019/01/06 14:35:31 cherry Exp $ */
+/* $NetBSD: i386func.S,v 1.21 2019/05/04 07:20:22 maxv Exp $ */
/*-
* Copyright (c) 1998, 2007, 2008 The NetBSD Foundation, Inc.
@@ -36,7 +36,7 @@
*/
#include <machine/asm.h>
-__KERNEL_RCSID(0, "$NetBSD: i386func.S,v 1.20 2019/01/06 14:35:31 cherry Exp $");
+__KERNEL_RCSID(0, "$NetBSD: i386func.S,v 1.21 2019/05/04 07:20:22 maxv Exp $");
#include <machine/specialreg.h>
#include <machine/segments.h>
@@ -66,23 +66,6 @@ ENTRY(ltr)
ret
END(ltr)
-ENTRY(lcr0)
- movl 4(%esp), %eax
- movl %eax, %cr0
- ret
-END(lcr0)
-
-ENTRY(rcr0)
- movl %cr0, %eax
- ret
-END(rcr0)
-
-ENTRY(lcr3)
- movl 4(%esp), %eax
- movl %eax, %cr3
- ret
-END(lcr3)
-
/*
* Big hammer: flush all TLB entries, including ones from PTE's
* with the G bit set. This should only be necessary if TLB
@@ -123,98 +106,11 @@ ENTRY(tlbflush)
ret
END(tlbflush)
-ENTRY(ldr0)
- movl 4(%esp), %eax
- movl %eax, %dr0
- ret
-END(ldr0)
-
-ENTRY(rdr0)
- movl %dr0, %eax
- ret
-END(rdr0)
-
-ENTRY(ldr1)
- movl 4(%esp), %eax
- movl %eax, %dr1
- ret
-END(ldr1)
-
-ENTRY(rdr1)
- movl %dr1, %eax
- ret
-END(rdr1)
-
-ENTRY(ldr2)
- movl 4(%esp), %eax
- movl %eax, %dr2
- ret
-END(ldr2)
-
-ENTRY(rdr2)
- movl %dr2, %eax
- ret
-END(rdr2)
-
-ENTRY(ldr3)
- movl 4(%esp), %eax
- movl %eax, %dr3
- ret
-END(ldr3)
-
-ENTRY(rdr3)
- movl %dr3, %eax
- ret
-END(rdr3)
-
-ENTRY(ldr6)
- movl 4(%esp), %eax
- movl %eax, %dr6
- ret
-END(ldr6)
-
-ENTRY(rdr6)
- movl %dr6, %eax
- ret
-END(rdr6)
-
-ENTRY(ldr7)
- movl 4(%esp), %eax
- movl %eax, %dr7
- ret
-END(ldr7)
-
-ENTRY(rdr7)
- movl %dr7, %eax
- ret
-END(rdr7)
-
-ENTRY(rcr2)
- movl %cr2, %eax
- ret
-END(rcr2)
-
-ENTRY(lcr2)
- movl 4(%esp), %eax
- movl %eax, %cr2
- ret
-END(lcr2)
-
ENTRY(wbinvd)
wbinvd
ret
END(wbinvd)
-ENTRY(x86_disable_intr)
- cli
- ret
-END(x86_disable_intr)
-
-ENTRY(x86_enable_intr)
- sti
- ret
-END(x86_enable_intr)
-
/*
* void lgdt(struct region_descriptor *rdp);
*
Index: src/sys/arch/x86/include/cpufunc.h
diff -u src/sys/arch/x86/include/cpufunc.h:1.26 src/sys/arch/x86/include/cpufunc.h:1.27
--- src/sys/arch/x86/include/cpufunc.h:1.26 Wed May 1 15:17:49 2019
+++ src/sys/arch/x86/include/cpufunc.h Sat May 4 07:20:22 2019
@@ -1,4 +1,4 @@
-/* $NetBSD: cpufunc.h,v 1.26 2019/05/01 15:17:49 maxv Exp $ */
+/* $NetBSD: cpufunc.h,v 1.27 2019/05/04 07:20:22 maxv Exp $ */
/*
* Copyright (c) 1998, 2007, 2019 The NetBSD Foundation, Inc.
@@ -95,47 +95,160 @@ void lidt(struct region_descriptor *);
void lldt(u_short);
void ltr(u_short);
-void lcr0(u_long);
-u_long rcr0(void);
-void lcr2(vaddr_t);
-vaddr_t rcr2(void);
-void lcr3(vaddr_t);
-vaddr_t rcr3(void);
-void lcr4(vaddr_t);
-vaddr_t rcr4(void);
-void lcr8(vaddr_t);
-vaddr_t rcr8(void);
-
-register_t rdr0(void);
-void ldr0(register_t);
-register_t rdr1(void);
-void ldr1(register_t);
-register_t rdr2(void);
-void ldr2(register_t);
-register_t rdr3(void);
-void ldr3(register_t);
-register_t rdr6(void);
-void ldr6(register_t);
-register_t rdr7(void);
-void ldr7(register_t);
-
-u_int x86_getss(void);
-void setds(int);
-void setes(int);
-void setfs(int);
+static inline uint16_t
+x86_getss(void)
+{
+ uint16_t val;
+
+ asm volatile (
+ "mov %%ss,%[val]"
+ : [val] "=r" (val)
+ :
+ );
+ return val;
+}
+
+static inline void
+setds(uint16_t val)
+{
+ asm volatile (
+ "mov %[val],%%ds"
+ :
+ : [val] "r" (val)
+ );
+}
+
+static inline void
+setes(uint16_t val)
+{
+ asm volatile (
+ "mov %[val],%%es"
+ :
+ : [val] "r" (val)
+ );
+}
+
+static inline void
+setfs(uint16_t val)
+{
+ asm volatile (
+ "mov %[val],%%fs"
+ :
+ : [val] "r" (val)
+ );
+}
+
void setusergs(int);
/* -------------------------------------------------------------------------- */
+#define FUNC_CR(crnum) \
+ static inline void lcr##crnum(register_t val) \
+ { \
+ asm volatile ( \
+ "mov %[val],%%cr" #crnum \
+ : \
+ : [val] "r" (val) \
+ ); \
+ } \
+ static inline register_t rcr##crnum(void) \
+ { \
+ register_t val; \
+ asm volatile ( \
+ "mov %%cr" #crnum ",%[val]" \
+ : [val] "=r" (val) \
+ : \
+ ); \
+ return val; \
+ }
+
+#define PROTO_CR(crnum) \
+ void lcr##crnum(register_t); \
+ register_t rcr##crnum(void);
+
+#ifndef XENPV
+FUNC_CR(0)
+FUNC_CR(2)
+FUNC_CR(3)
+#else
+PROTO_CR(0)
+PROTO_CR(2)
+PROTO_CR(3)
+#endif
+
+FUNC_CR(4)
+FUNC_CR(8)
+
+/* -------------------------------------------------------------------------- */
+
+#define FUNC_DR(drnum) \
+ static inline void ldr##drnum(register_t val) \
+ { \
+ asm volatile ( \
+ "mov %[val],%%dr" #drnum \
+ : \
+ : [val] "r" (val) \
+ ); \
+ } \
+ static inline register_t rdr##drnum(void) \
+ { \
+ register_t val; \
+ asm volatile ( \
+ "mov %%dr" #drnum ",%[val]" \
+ : [val] "=r" (val) \
+ : \
+ ); \
+ return val; \
+ }
+
+#define PROTO_DR(drnum) \
+ register_t rdr##drnum(void); \
+ void ldr##drnum(register_t);
+
+#ifndef XENPV
+FUNC_DR(0)
+FUNC_DR(1)
+FUNC_DR(2)
+FUNC_DR(3)
+FUNC_DR(6)
+FUNC_DR(7)
+#else
+PROTO_DR(0)
+PROTO_DR(1)
+PROTO_DR(2)
+PROTO_DR(3)
+PROTO_DR(6)
+PROTO_DR(7)
+#endif
+
+/* -------------------------------------------------------------------------- */
+
union savefpu;
-void fnclex(void);
-void fninit(void);
+
+static inline void
+fninit(void)
+{
+ asm volatile ("fninit");
+}
+
+static inline void
+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 *);
-void clts(void);
+
+static inline void
+clts(void)
+{
+ asm volatile ("clts");
+}
+
void stts(void);
void fxsave(union savefpu *);
void fxrstor(const union savefpu *);
@@ -178,9 +291,19 @@ void xsaveopt(union savefpu *, uint64_t)
/* -------------------------------------------------------------------------- */
+static inline void
+x86_disable_intr(void)
+{
+ asm volatile ("cli");
+}
+
+static inline void
+x86_enable_intr(void)
+{
+ asm volatile ("sti");
+}
+
/* Use read_psl, write_psl when saving and restoring interrupt state. */
-void x86_disable_intr(void);
-void x86_enable_intr(void);
u_long x86_read_psl(void);
void x86_write_psl(u_long);
@@ -194,10 +317,8 @@ void x86_reset(void);
/*
* Some of the undocumented AMD64 MSRs need a 'passcode' to access.
- *
* See LinuxBIOSv2: src/cpu/amd/model_fxx/model_fxx_init.c
*/
-
#define OPTERON_MSR_PASSCODE 0x9c5a203aU
static inline uint64_t
Index: src/sys/arch/xen/x86/xenfunc.c
diff -u src/sys/arch/xen/x86/xenfunc.c:1.24 src/sys/arch/xen/x86/xenfunc.c:1.25
--- src/sys/arch/xen/x86/xenfunc.c:1.24 Sun Jan 6 14:35:31 2019
+++ src/sys/arch/xen/x86/xenfunc.c Sat May 4 07:20:22 2019
@@ -1,4 +1,4 @@
-/* $NetBSD: xenfunc.c,v 1.24 2019/01/06 14:35:31 cherry Exp $ */
+/* $NetBSD: xenfunc.c,v 1.25 2019/05/04 07:20:22 maxv Exp $ */
/*
* Copyright (c) 2004 Christian Limpach.
@@ -26,7 +26,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: xenfunc.c,v 1.24 2019/01/06 14:35:31 cherry Exp $");
+__KERNEL_RCSID(0, "$NetBSD: xenfunc.c,v 1.25 2019/05/04 07:20:22 maxv Exp $");
#include <sys/param.h>
@@ -124,12 +124,12 @@ ltr(u_short sel)
}
void
-lcr0(u_long val)
+lcr0(register_t val)
{
panic("XXX lcr0 not supported\n");
}
-u_long
+register_t
rcr0(void)
{
/* XXX: handle X86_CR0_TS ? */
@@ -250,7 +250,7 @@ wbinvd(void)
xpq_flush_cache();
}
-vaddr_t
+register_t
rcr2(void)
{
return curcpu()->ci_vcpu->arch.cr2;