git: 20c09e6fece2 - main - amd64: use WRMSRNS immediate form to update splitlock control, when available

From: Konstantin Belousov <kib_at_FreeBSD.org>
Date: Tue, 22 Sep 2026 15:41:53 UTC
The branch main has been updated by kib:

URL: https://cgit.FreeBSD.org/src/commit/?id=20c09e6fece29dbcf4835b4dd90e969f1b9b3e59

commit 20c09e6fece29dbcf4835b4dd90e969f1b9b3e59
Author:     Konstantin Belousov <kib@FreeBSD.org>
AuthorDate: 2026-09-19 07:54:00 +0000
Commit:     Konstantin Belousov <kib@FreeBSD.org>
CommitDate: 2026-09-22 15:40:41 +0000

    amd64: use WRMSRNS immediate form to update splitlock control, when available
    
    Reviewed by:    markj
    Sponsored by:   The FreeBSD Foundation
    MFC after:      1 week
    Differential revision:  https://reviews.freebsd.org/D59815
---
 sys/amd64/amd64/machdep.c | 38 ++++++++++++++++++++++++++++++++++----
 1 file changed, 34 insertions(+), 4 deletions(-)

diff --git a/sys/amd64/amd64/machdep.c b/sys/amd64/amd64/machdep.c
index a1b2d116295f..099bc7163bde 100644
--- a/sys/amd64/amd64/machdep.c
+++ b/sys/amd64/amd64/machdep.c
@@ -1929,13 +1929,28 @@ safe_read(vm_offset_t addr, char *valp)
 	return (uiomove_mem(UIO_MEM_KMEM, &uio));
 }
 
-void
-enable_splitlock_ac(void)
+static void
+enable_splitlock_ac_wrmsr(void)
 {
 	MPASS(ia32_splitlock);
 	wrmsr(MSR_MEMORY_CTL, PCPU_GET(msr_memctl) | MSR_MEMORY_CTL_SPLITLOCK);
 }
 
+static void
+enable_splitlock_ac_wrmsrimm(void)
+{
+	MPASS(ia32_splitlock);
+	wrmsr_imm(MSR_MEMORY_CTL, PCPU_GET(msr_memctl) |
+	    MSR_MEMORY_CTL_SPLITLOCK);
+}
+
+DEFINE_IFUNC(, void, enable_splitlock_ac, (void))
+{
+	if ((cpu_stdext_feature5 & CPUID_STDEXT5_MSR_IMM) != 0)
+		return (enable_splitlock_ac_wrmsrimm);
+	return (enable_splitlock_ac_wrmsr);
+}
+
 void
 enable_splitlock(struct thread *td)
 {
@@ -1946,13 +1961,28 @@ enable_splitlock(struct thread *td)
 	critical_exit();
 }
 
-void
-disable_splitlock_ac(void)
+static void
+disable_splitlock_ac_wrmsr(void)
 {
 	MPASS(ia32_splitlock);
 	wrmsr(MSR_MEMORY_CTL, PCPU_GET(msr_memctl) & ~MSR_MEMORY_CTL_SPLITLOCK);
 }
 
+static void
+disable_splitlock_ac_wrmsrimm(void)
+{
+	MPASS(ia32_splitlock);
+	wrmsr_imm(MSR_MEMORY_CTL, PCPU_GET(msr_memctl) &
+	    ~MSR_MEMORY_CTL_SPLITLOCK);
+}
+
+DEFINE_IFUNC(, void, disable_splitlock_ac, (void))
+{
+	if ((cpu_stdext_feature5 & CPUID_STDEXT5_MSR_IMM) != 0)
+		return (disable_splitlock_ac_wrmsrimm);
+	return (disable_splitlock_ac_wrmsr);
+}
+
 void
 disable_splitlock(struct thread *td)
 {