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;

Reply via email to