From 51bc87d15a63756604e7c8ee05f0f498cf20d581 Mon Sep 17 00:00:00 2001 From: Andreas Kling Date: Wed, 17 Aug 2022 19:35:14 +0200 Subject: [PATCH] Kernel/x86: Disable interrupts when leaving critical sections This fixes an issue where we could get preempted after acquiring the current Processor pointer, but before calling methods on it. I strongly suspect this was the cause of "Processor::current() == this" assertion failures. --- Kernel/Arch/x86/common/Processor.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Kernel/Arch/x86/common/Processor.cpp b/Kernel/Arch/x86/common/Processor.cpp index 57dcc13bdf..46902160f3 100644 --- a/Kernel/Arch/x86/common/Processor.cpp +++ b/Kernel/Arch/x86/common/Processor.cpp @@ -990,7 +990,7 @@ void Processor::exit_trap(TrapFrame& trap) void Processor::check_invoke_scheduler() { - InterruptDisabler disabler; + VERIFY_INTERRUPTS_DISABLED(); VERIFY(!m_in_irq); VERIFY(!m_in_critical); VERIFY(&Processor::current() == this); @@ -1667,6 +1667,7 @@ u64 Processor::time_spent_idle() const void Processor::leave_critical() { + InterruptDisabler disabler; current().do_leave_critical(); } @@ -1688,6 +1689,7 @@ void Processor::do_leave_critical() u32 Processor::clear_critical() { + InterruptDisabler disabler; auto prev_critical = in_critical(); write_gs_ptr(__builtin_offsetof(Processor, m_in_critical), 0); auto& proc = current();