summaryrefslogtreecommitdiff
path: root/Kernel
diff options
context:
space:
mode:
Diffstat (limited to 'Kernel')
-rw-r--r--Kernel/Arch/i386/CPU.cpp4
-rw-r--r--Kernel/Arch/i386/CPU.h2
-rw-r--r--Kernel/Arch/i386/PIT.cpp2
-rw-r--r--Kernel/VM/MemoryManager.cpp1
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