From de74304510abfdb1197f697a224d99daa46067af Mon Sep 17 00:00:00 2001 From: Augustin Cavalier Date: Mon, 9 Mar 2026 13:36:11 -0400 Subject: [PATCH] kernel/x86: Always call arch_cpu_global_tlb_invalidate with interrupts disabled. Fixes a race. Discovered by SED4906. Change-Id: I2b267312e9f3ff32bafa2ac2784f5d4a9905e24e Reviewed-on: https://review.haiku-os.org/c/haiku/+/10416 Reviewed-by: waddlesplash --- src/system/kernel/arch/x86/arch_cpu.cpp | 5 +---- src/system/kernel/arch/x86/paging/X86VMTranslationMap.cpp | 2 ++ 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/src/system/kernel/arch/x86/arch_cpu.cpp b/src/system/kernel/arch/x86/arch_cpu.cpp index 6924dd53b7..d195c8988b 100644 --- a/src/system/kernel/arch/x86/arch_cpu.cpp +++ b/src/system/kernel/arch/x86/arch_cpu.cpp @@ -1994,16 +1994,13 @@ void arch_cpu_global_tlb_invalidate() { uint32 flags = x86_read_cr4(); - - if (flags & IA32_CR4_GLOBAL_PAGES) { + if ((flags & IA32_CR4_GLOBAL_PAGES) != 0) { // disable and reenable the global pages to flush all TLBs regardless // of the global page bit x86_write_cr4(flags & ~IA32_CR4_GLOBAL_PAGES); x86_write_cr4(flags | IA32_CR4_GLOBAL_PAGES); } else { - cpu_status state = disable_interrupts(); arch_cpu_user_tlb_invalidate(0); - restore_interrupts(state); } } diff --git a/src/system/kernel/arch/x86/paging/X86VMTranslationMap.cpp b/src/system/kernel/arch/x86/paging/X86VMTranslationMap.cpp index ab695d15b5..5687599b5a 100644 --- a/src/system/kernel/arch/x86/paging/X86VMTranslationMap.cpp +++ b/src/system/kernel/arch/x86/paging/X86VMTranslationMap.cpp @@ -104,7 +104,9 @@ X86VMTranslationMap::Flush() fInvalidPagesCount); if (fIsKernelMap) { + cpu_status state = disable_interrupts(); arch_cpu_global_tlb_invalidate(); + restore_interrupts(state); smp_send_broadcast_ici(SMP_MSG_GLOBAL_INVALIDATE_PAGES, 0, 0, 0, NULL, SMP_MSG_FLAG_SYNC); } else {