:: commit 906b714c998bee0ed77c3013cdb79b8491b6ad72

mintsuki <mintsuki@protonmail.com> — 2025-02-08 07:53

parents: 1482c6a44c

sys/smp: Use monitor/mwait when available instead of plain pause for spin-loops

diff --git a/common/sys/smp_trampoline.asm_x86 b/common/sys/smp_trampoline.asm_x86
index ecfc3bdb..29d01591 100644
--- a/common/sys/smp_trampoline.asm_x86
+++ b/common/sys/smp_trampoline.asm_x86
@@ -148,14 +148,36 @@ parking64:
     mov eax, 1
     xchg dword [rbx + (passed_info.booted_flag - smp_trampoline_start)], eax
 
-    xor eax, eax
+    ; Check for MONITOR/MWAIT support
+    mov eax, 1
+    xor ecx, ecx
+    cpuid
+    test ecx, (1 << 3)
+    jnz .monitor_spin
+
   .loop:
-    lock xadd qword [rdi + 16], rax
+    mov rax, qword [rdi + 16]
     test rax, rax
     jnz .out
     pause
     jmp .loop
 
+  .monitor_spin:
+    mov rax, qword [rdi + 16]
+    test rax, rax
+    jnz .out
+    lea rax, qword [rdi + 16]
+    xor ecx, ecx
+    xor edx, edx
+    monitor
+    mov rax, qword [rdi + 16]
+    test rax, rax
+    jnz .out
+    xor eax, eax
+    xor ecx, ecx
+    mwait
+    jmp .monitor_spin
+
   .out:
     ; Clear TLB
     mov rbx, cr3
tab: 248 wrap: offon