From d46071c08f19edca854dc7af0e1f0d0887201cb1 Mon Sep 17 00:00:00 2001 From: Andreas Kling Date: Fri, 21 Feb 2020 12:26:12 +0100 Subject: [PATCH] Kernel: Assert on page fault during IRQ We're not equipped to deal with page faults during an IRQ handler, so add an assertion so we can immediately tell what's wrong. This is why profiling sometimes hangs the system -- walking the stack of the profiled thread causes a page fault and things fall apart. --- Kernel/Arch/i386/CPU.cpp | 4 ++++ Kernel/Arch/i386/CPU.h | 2 ++ Kernel/Arch/i386/PIT.cpp | 2 ++ Kernel/VM/MemoryManager.cpp | 1 + 4 files changed, 9 insertions(+) diff --git a/Kernel/Arch/i386/CPU.cpp b/Kernel/Arch/i386/CPU.cpp index 722f0fd356b..afd7b5ecd25 100644 --- a/Kernel/Arch/i386/CPU.cpp +++ b/Kernel/Arch/i386/CPU.cpp @@ -545,14 +545,18 @@ void load_task_register(u16 selector) asm("ltr %0" ::"r"(selector)); } +u32 g_in_irq; + void handle_irq(RegisterState regs) { clac(); + ++g_in_irq; ASSERT(regs.isr_number >= 0x50 && regs.isr_number <= 0x5f); u8 irq = (u8)(regs.isr_number - 0x50); if (s_irq_handler[irq]) s_irq_handler[irq]->handle_irq(); PIC::eoi(irq); + --g_in_irq; } void sse_init() diff --git a/Kernel/Arch/i386/CPU.h b/Kernel/Arch/i386/CPU.h index 25937ffef24..0bc0cc1d1d2 100644 --- a/Kernel/Arch/i386/CPU.h +++ b/Kernel/Arch/i386/CPU.h @@ -592,4 +592,6 @@ private: u32 m_flags; }; +extern u32 g_in_irq; + } diff --git a/Kernel/Arch/i386/PIT.cpp b/Kernel/Arch/i386/PIT.cpp index fac215a126a..c74576747b0 100644 --- a/Kernel/Arch/i386/PIT.cpp +++ b/Kernel/Arch/i386/PIT.cpp @@ -67,6 +67,7 @@ static u32 s_seconds_since_boot; void timer_interrupt_handler(RegisterState regs) { clac(); + ++g_in_irq; IRQHandlerScope scope(IRQ_TIMER); if (++s_ticks_this_second >= TICKS_PER_SECOND) { // FIXME: Synchronize with the RTC somehow to prevent drifting apart. @@ -74,6 +75,7 @@ void timer_interrupt_handler(RegisterState regs) s_ticks_this_second = 0; } Scheduler::timer_tick(regs); + --g_in_irq; } namespace PIT { diff --git a/Kernel/VM/MemoryManager.cpp b/Kernel/VM/MemoryManager.cpp index 5d9c8430a8a..1e71e3172ea 100644 --- a/Kernel/VM/MemoryManager.cpp +++ b/Kernel/VM/MemoryManager.cpp @@ -281,6 +281,7 @@ PageFaultResponse MemoryManager::handle_page_fault(const PageFault& fault) { ASSERT_INTERRUPTS_DISABLED(); ASSERT(Thread::current); + ASSERT(!g_in_irq); #ifdef PAGE_FAULT_DEBUG dbgprintf("MM: handle_page_fault(%w) at V%p\n", fault.code(), fault.vaddr().get()); #endif