git: c52f99acee2a - stable/15 - amd64: use WRMSRNS immediate form to update splitlock control, when available

From: Konstantin Belousov <kib_at_FreeBSD.org>
Date: Tue, 29 Sep 2026 00:32:00 UTC
The branch stable/15 has been updated by kib:

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

commit c52f99acee2a65b8e58b9cc50a00130eb238f909
Author:     Konstantin Belousov <kib@FreeBSD.org>
AuthorDate: 2026-09-19 07:54:00 +0000
Commit:     Konstantin Belousov <kib@FreeBSD.org>
CommitDate: 2026-09-29 00:27:15 +0000

    amd64: use WRMSRNS immediate form to update splitlock control, when available
    
    (cherry picked from commit 20c09e6fece29dbcf4835b4dd90e969f1b9b3e59)
---
 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 c871838c9c7b..038abe929753 100644
--- a/sys/amd64/amd64/machdep.c
+++ b/sys/amd64/amd64/machdep.c
@@ -1930,13 +1930,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)
 {
@@ -1947,13 +1962,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)
 {