mirror of
https://github.com/fergalmoran/ladybird.git
synced 2026-01-06 00:25:12 +00:00
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.
This commit is contained in:
@@ -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()
|
||||
|
||||
@@ -592,4 +592,6 @@ private:
|
||||
u32 m_flags;
|
||||
};
|
||||
|
||||
extern u32 g_in_irq;
|
||||
|
||||
}
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user