diff options
Diffstat (limited to 'Kernel')
-rw-r--r-- | Kernel/Arch/i386/CPU.cpp | 4 | ||||
-rw-r--r-- | Kernel/Arch/i386/CPU.h | 2 | ||||
-rw-r--r-- | Kernel/Arch/i386/PIT.cpp | 2 | ||||
-rw-r--r-- | Kernel/VM/MemoryManager.cpp | 1 |
4 files changed, 9 insertions, 0 deletions
diff --git a/Kernel/Arch/i386/CPU.cpp b/Kernel/Arch/i386/CPU.cpp index 722f0fd356..afd7b5ecd2 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 25937ffef2..0bc0cc1d1d 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 fac215a126..c74576747b 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 5d9c8430a8..1e71e3172e 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 |