diff --git a/Kernel/Arch/aarch64/Processor.cpp b/Kernel/Arch/aarch64/Processor.cpp index bc45593931..04b643c348 100644 --- a/Kernel/Arch/aarch64/Processor.cpp +++ b/Kernel/Arch/aarch64/Processor.cpp @@ -121,6 +121,28 @@ void Processor::flush_tlb(Memory::PageDirectory const*, VirtualAddress vaddr, si flush_tlb_local(vaddr, page_count); } +void Processor::leave_critical() +{ + InterruptDisabler disabler; + current().do_leave_critical(); +} + +void Processor::do_leave_critical() +{ + VERIFY(m_in_critical > 0); + if (m_in_critical == 1) { + if (m_in_irq == 0) { + // FIXME: Call deferred_call_execute_pending()! + VERIFY(m_in_critical == 1); + } + m_in_critical = 0; + if (m_in_irq == 0) + check_invoke_scheduler(); + } else { + m_in_critical = m_in_critical - 1; + } +} + u32 Processor::clear_critical() { InterruptDisabler disabler; diff --git a/Kernel/Arch/aarch64/Processor.h b/Kernel/Arch/aarch64/Processor.h index 23e51a7ffe..f6d3bf1a9e 100644 --- a/Kernel/Arch/aarch64/Processor.h +++ b/Kernel/Arch/aarch64/Processor.h @@ -189,12 +189,7 @@ public: current_processor.m_in_critical = current_processor.m_in_critical + 1; } - ALWAYS_INLINE static void leave_critical() - { - auto& current_processor = current(); - current_processor.m_in_critical = current_processor.m_in_critical - 1; - } - + static void leave_critical(); static u32 clear_critical(); ALWAYS_INLINE static void restore_critical(u32 prev_critical) @@ -285,6 +280,8 @@ public: private: Processor(Processor const&) = delete; + void do_leave_critical(); + u32 m_cpu; CPUFeature::Type m_features; u8 m_physical_address_bit_width;