From 1b4baaed56828558edbf880c7832c9093fd24543 Mon Sep 17 00:00:00 2001 From: Andreas Kling Date: Fri, 30 Dec 2022 23:14:28 +0100 Subject: [PATCH] Kernel/x86_64: *Restore* interrupt flag in page fault handler If a page fault occurs while interrupts are disabled, we were wrongly enabling interrupts right away in the page fault handler. Instead, we should only do this if interrupts were enabled when the page fault occurred. --- Kernel/Arch/x86_64/Interrupts.cpp | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/Kernel/Arch/x86_64/Interrupts.cpp b/Kernel/Arch/x86_64/Interrupts.cpp index 726c535b5a..7346163493 100644 --- a/Kernel/Arch/x86_64/Interrupts.cpp +++ b/Kernel/Arch/x86_64/Interrupts.cpp @@ -177,13 +177,16 @@ void page_fault_handler(TrapFrame* trap) { clac(); - // NOTE: Once we've extracted the faulting address from CR2, - // we can re-enable interrupts. auto fault_address = read_cr2(); - sti(); auto& regs = *trap->regs; + // NOTE: Once we've extracted the faulting address from CR2, we can re-enable interrupts. + // However, we only do this *if* they were enabled when the page fault occurred. + if (regs.flags() & 0x200) { + sti(); + } + if constexpr (PAGE_FAULT_DEBUG) { u32 fault_page_directory = read_cr3(); dbgln("CPU #{} ring {} {} page fault in PD={:#x}, {}{} {}",