mirror of
https://github.com/RGBCube/serenity
synced 2025-07-25 16:47:36 +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:
parent
2a679f228e
commit
d46071c08f
4 changed files with 9 additions and 0 deletions
|
@ -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
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue