Module Name: src
Committed By: bouyer
Date: Wed Apr 15 16:04:07 UTC 2020
Modified Files:
src/sys/arch/amd64/amd64 [bouyer-xenpvh]: spl.S
src/sys/arch/amd64/conf [bouyer-xenpvh]: XEN3_DOMU
src/sys/arch/i386/i386 [bouyer-xenpvh]: lock_stubs.S spl.S
src/sys/arch/x86/include [bouyer-xenpvh]: cpufunc.h
src/sys/arch/x86/x86 [bouyer-xenpvh]: patch.c
Log Message:
On amd64, always use the cmpxchg8b version of spllower. All x86_64 host should
have it and we already rely on it in lock stubs.
On i386, always use i686_mutex_spin_exit and cx8_spllower for Xen;
Xen doesn't run on CPUs on CPUs lacking the required instructions anyway.
Skip x86_patch only for XENPV, and adjust for changes in assembly functions.
Tested on Xen PV and PVHVM, and on bare metal core i5.
To generate a diff of this commit:
cvs rdiff -u -r1.43.4.6 -r1.43.4.7 src/sys/arch/amd64/amd64/spl.S
cvs rdiff -u -r1.90.6.1 -r1.90.6.2 src/sys/arch/amd64/conf/XEN3_DOMU
cvs rdiff -u -r1.32 -r1.32.6.1 src/sys/arch/i386/i386/lock_stubs.S
cvs rdiff -u -r1.50.4.5 -r1.50.4.6 src/sys/arch/i386/i386/spl.S
cvs rdiff -u -r1.37 -r1.37.6.1 src/sys/arch/x86/include/cpufunc.h
cvs rdiff -u -r1.37.6.2 -r1.37.6.3 src/sys/arch/x86/x86/patch.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/spl.S
diff -u src/sys/arch/amd64/amd64/spl.S:1.43.4.6 src/sys/arch/amd64/amd64/spl.S:1.43.4.7
--- src/sys/arch/amd64/amd64/spl.S:1.43.4.6 Sun Apr 12 17:25:52 2020
+++ src/sys/arch/amd64/amd64/spl.S Wed Apr 15 16:04:06 2020
@@ -1,4 +1,4 @@
-/* $NetBSD: spl.S,v 1.43.4.6 2020/04/12 17:25:52 bouyer Exp $ */
+/* $NetBSD: spl.S,v 1.43.4.7 2020/04/15 16:04:06 bouyer Exp $ */
/*
* Copyright (c) 2003 Wasabi Systems, Inc.
@@ -227,50 +227,12 @@ IDTVEC_END(resume_preempt)
/*
* void spllower(int s);
*
- * Must be the same size as cx8_spllower(). This must use
- * pushf/cli/popf as it is used early in boot where interrupts
- * are disabled via eflags/IE.
- */
-ENTRY(spllower)
- cmpl CPUVAR(ILEVEL),%edi
- jae 1f
- movl CPUVAR(IUNMASK)(,%rdi,4),%edx
- PUSHF(ax)
- CLI(ax)
- testl CPUVAR(IPENDING),%edx
- jnz 2f
- movl %edi,CPUVAR(ILEVEL)
- POPF /* clobbers %rdi */
-1:
- ret
- ret
-2:
-#ifdef XENPV
- /*
- * no need to call stipending, we're going to CLI again
- * just drop the saved value on stack
- */
- addq $8,%rsp
-#else
- popf
-#endif
- jmp _C_LABEL(Xspllower)
-3:
- .space 16
- .align 16
-END(spllower)
-LABEL(spllower_end)
-
-#ifndef XENPV
-/*
- * void cx8_spllower(int s);
- *
* For cmpxchg8b, edx/ecx are the high words and eax/ebx the low.
*
* edx : eax = old level / old ipending
* ecx : ebx = new level / old ipending
*/
-ENTRY(cx8_spllower)
+ENTRY(spllower)
movl CPUVAR(ILEVEL),%edx
movq %rbx,%r8
cmpl %edx,%edi /* new level is lower? */
@@ -292,15 +254,11 @@ ENTRY(cx8_spllower)
ret
2:
movq %r8,%rbx
- .type _C_LABEL(cx8_spllower_patch), @function
-LABEL(cx8_spllower_patch)
jmp _C_LABEL(Xspllower)
.align 16
-END(cx8_spllower_patch)
-END(cx8_spllower)
-LABEL(cx8_spllower_end)
-#endif /* !XENPV */
+END(spllower)
+LABEL(spllower_end)
/*
* void Xspllower(int s);
Index: src/sys/arch/amd64/conf/XEN3_DOMU
diff -u src/sys/arch/amd64/conf/XEN3_DOMU:1.90.6.1 src/sys/arch/amd64/conf/XEN3_DOMU:1.90.6.2
--- src/sys/arch/amd64/conf/XEN3_DOMU:1.90.6.1 Wed Apr 8 17:56:08 2020
+++ src/sys/arch/amd64/conf/XEN3_DOMU Wed Apr 15 16:04:06 2020
@@ -1,17 +1,19 @@
-# $NetBSD: XEN3_DOMU,v 1.90.6.1 2020/04/08 17:56:08 bouyer Exp $
+# $NetBSD: XEN3_DOMU,v 1.90.6.2 2020/04/15 16:04:06 bouyer Exp $
include "arch/amd64/conf/std.xen"
options XENPV # PV domU support
options MULTIPROCESSOR
+options HZ=20
+
options INCLUDE_CONFIG_FILE # embed config file in kernel binary
#options UVMHIST
#options UVMHIST_PRINT
#options SYSCALL_DEBUG
-#ident "XEN3_DOMU-$Revision: 1.90.6.1 $"
+#ident "XEN3_DOMU-$Revision: 1.90.6.2 $"
maxusers 32 # estimated number of users
Index: src/sys/arch/i386/i386/lock_stubs.S
diff -u src/sys/arch/i386/i386/lock_stubs.S:1.32 src/sys/arch/i386/i386/lock_stubs.S:1.32.6.1
--- src/sys/arch/i386/i386/lock_stubs.S:1.32 Sun Dec 8 20:00:56 2019
+++ src/sys/arch/i386/i386/lock_stubs.S Wed Apr 15 16:04:06 2020
@@ -1,4 +1,4 @@
-/* $NetBSD: lock_stubs.S,v 1.32 2019/12/08 20:00:56 ad Exp $ */
+/* $NetBSD: lock_stubs.S,v 1.32.6.1 2020/04/15 16:04:06 bouyer Exp $ */
/*-
* Copyright (c) 2006, 2007, 2008, 2009 The NetBSD Foundation, Inc.
@@ -35,7 +35,7 @@
*/
#include <machine/asm.h>
-__KERNEL_RCSID(0, "$NetBSD: lock_stubs.S,v 1.32 2019/12/08 20:00:56 ad Exp $");
+__KERNEL_RCSID(0, "$NetBSD: lock_stubs.S,v 1.32.6.1 2020/04/15 16:04:06 bouyer Exp $");
#include "opt_lockdebug.h"
@@ -223,7 +223,6 @@ ENTRY(rw_tryenter)
jmp 3b
END(rw_tryenter)
-#ifndef XENPV
/*
* void mutex_spin_enter(kmutex_t *mtx);
@@ -254,6 +253,7 @@ ENTRY(mutex_spin_enter)
LABEL(mutex_spin_enter_end)
END(mutex_spin_enter)
+#ifndef XENPV
/*
* Release a spin mutex and post a store fence.
*/
@@ -275,7 +275,9 @@ ENTRY(mutex_spin_exit)
.align 32
LABEL(mutex_spin_exit_end)
END(mutex_spin_exit)
-
+#else /* XENPV */
+STRONG_ALIAS(mutex_spin_exit, i686_mutex_spin_exit)
+#endif /* !XENPV */
/*
* Patch for i686 CPUs where cli/sti is prohibitively expensive.
* Must be the same size as mutex_spin_exit().
@@ -307,17 +309,6 @@ LABEL(i686_mutex_spin_exit_patch)
LABEL(i686_mutex_spin_exit_end)
END(i686_mutex_spin_exit)
-#else /* !XENPV */
-
-/* For now; strong alias not working for some reason. */
-ENTRY(mutex_spin_enter)
- jmp _C_LABEL(mutex_vector_enter)
-
-ENTRY(mutex_spin_exit)
- jmp _C_LABEL(mutex_vector_exit)
-
-#endif /* !XENPV */
-
#endif /* !LOCKDEBUG */
/*
Index: src/sys/arch/i386/i386/spl.S
diff -u src/sys/arch/i386/i386/spl.S:1.50.4.5 src/sys/arch/i386/i386/spl.S:1.50.4.6
--- src/sys/arch/i386/i386/spl.S:1.50.4.5 Sun Apr 12 17:25:52 2020
+++ src/sys/arch/i386/i386/spl.S Wed Apr 15 16:04:06 2020
@@ -1,4 +1,4 @@
-/* $NetBSD: spl.S,v 1.50.4.5 2020/04/12 17:25:52 bouyer Exp $ */
+/* $NetBSD: spl.S,v 1.50.4.6 2020/04/15 16:04:06 bouyer Exp $ */
/*
* Copyright (c) 1998, 2007, 2008 The NetBSD Foundation, Inc.
@@ -30,7 +30,7 @@
*/
#include <machine/asm.h>
-__KERNEL_RCSID(0, "$NetBSD: spl.S,v 1.50.4.5 2020/04/12 17:25:52 bouyer Exp $");
+__KERNEL_RCSID(0, "$NetBSD: spl.S,v 1.50.4.6 2020/04/15 16:04:06 bouyer Exp $");
#include "opt_ddb.h"
#include "opt_spldebug.h"
@@ -67,6 +67,7 @@ ENTRY(splraise)
ret
END(splraise)
+#ifndef XENPV
/*
* void spllower(int s);
*
@@ -110,8 +111,10 @@ ENTRY(spllower)
.align 32
LABEL(spllower_end)
END(spllower)
+#else /* XENPV */
+STRONG_ALIAS(spllower, cx8_spllower)
+#endif /* !XENPV */
-#ifndef XENPV
/*
* void cx8_spllower(int s);
*
@@ -151,8 +154,6 @@ LABEL(cx8_spllower_patch)
LABEL(cx8_spllower_end)
END(cx8_spllower)
-#endif /* XENPV */
-
/*
* void Xspllower(int s);
*
Index: src/sys/arch/x86/include/cpufunc.h
diff -u src/sys/arch/x86/include/cpufunc.h:1.37 src/sys/arch/x86/include/cpufunc.h:1.37.6.1
--- src/sys/arch/x86/include/cpufunc.h:1.37 Wed Oct 30 17:06:57 2019
+++ src/sys/arch/x86/include/cpufunc.h Wed Apr 15 16:04:06 2020
@@ -1,4 +1,4 @@
-/* $NetBSD: cpufunc.h,v 1.37 2019/10/30 17:06:57 maxv Exp $ */
+/* $NetBSD: cpufunc.h,v 1.37.6.1 2020/04/15 16:04:06 bouyer Exp $ */
/*
* Copyright (c) 1998, 2007, 2019 The NetBSD Foundation, Inc.
@@ -103,7 +103,7 @@ rdtsc(void)
return (low | ((uint64_t)high << 32));
}
-#ifndef XEN
+#ifndef XENPV
void x86_hotpatch(uint32_t, const uint8_t *, size_t);
void x86_patch_window_open(u_long *, u_long *);
void x86_patch_window_close(u_long, u_long);
Index: src/sys/arch/x86/x86/patch.c
diff -u src/sys/arch/x86/x86/patch.c:1.37.6.2 src/sys/arch/x86/x86/patch.c:1.37.6.3
--- src/sys/arch/x86/x86/patch.c:1.37.6.2 Tue Apr 14 16:53:57 2020
+++ src/sys/arch/x86/x86/patch.c Wed Apr 15 16:04:06 2020
@@ -1,4 +1,4 @@
-/* $NetBSD: patch.c,v 1.37.6.2 2020/04/14 16:53:57 bouyer Exp $ */
+/* $NetBSD: patch.c,v 1.37.6.3 2020/04/15 16:04:06 bouyer Exp $ */
/*-
* Copyright (c) 2007, 2008, 2009 The NetBSD Foundation, Inc.
@@ -34,7 +34,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: patch.c,v 1.37.6.2 2020/04/14 16:53:57 bouyer Exp $");
+__KERNEL_RCSID(0, "$NetBSD: patch.c,v 1.37.6.3 2020/04/15 16:04:06 bouyer Exp $");
#include "opt_lockdebug.h"
#ifdef i386
@@ -247,7 +247,6 @@ x86_patch(bool early)
NULL
);
}
-#endif /* i386 */
#if !defined(SPLDEBUG)
if (!early && (cpu_feature[0] & CPUID_CX8) != 0) {
@@ -257,15 +256,16 @@ x86_patch(bool early)
spllower, spllower_end,
cx8_spllower_patch
);
-#if defined(i386) && !defined(LOCKDEBUG)
+#if !defined(LOCKDEBUG)
patchfunc(
i686_mutex_spin_exit, i686_mutex_spin_exit_end,
mutex_spin_exit, mutex_spin_exit_end,
i686_mutex_spin_exit_patch
);
-#endif /* i386 && !LOCKDEBUG */
+#endif /* !LOCKDEBUG */
}
#endif /* !SPLDEBUG */
+#endif /* i386 */
/*
* On some Opteron revisions, locked operations erroneously