diff --git a/Kernel/Arch/aarch64/Processor.cpp b/Kernel/Arch/aarch64/Processor.cpp index 46397173174..0433bf9bd66 100644 --- a/Kernel/Arch/aarch64/Processor.cpp +++ b/Kernel/Arch/aarch64/Processor.cpp @@ -11,6 +11,7 @@ #include #include #include +#include #include #include #include @@ -60,7 +61,13 @@ void Processor::flush_tlb(Memory::PageDirectory const*, VirtualAddress vaddr, si u32 Processor::clear_critical() { - TODO_AARCH64(); + InterruptDisabler disabler; + auto prev_critical = in_critical(); + auto& proc = current(); + proc.m_in_critical = 0; + if (proc.m_in_irq == 0) + proc.check_invoke_scheduler(); + return prev_critical; } u32 Processor::smp_wake_n_idle_processors(u32 wake_count) diff --git a/Kernel/Arch/aarch64/Processor.h b/Kernel/Arch/aarch64/Processor.h index 26940b1d6e3..8bca91d5875 100644 --- a/Kernel/Arch/aarch64/Processor.h +++ b/Kernel/Arch/aarch64/Processor.h @@ -192,8 +192,7 @@ public: ALWAYS_INLINE static void restore_critical(u32 prev_critical) { - (void)prev_critical; - TODO_AARCH64(); + current().m_in_critical = prev_critical; } ALWAYS_INLINE static u32 in_critical()