Kernel: Stop idling after handling an IRQ

If we receive an IRQ while the idle task is running, prevent it from
re-halting the CPU after the IRQ handler returns.

Instead have the idle task yield to the scheduler, so we can see if
the IRQ has unblocked something.
This commit is contained in:
Andreas Kling 2019-09-14 19:44:22 +02:00
commit e1481dcb42
Notes: sideshowbarker 2024-07-19 12:06:40 +09:00
4 changed files with 28 additions and 5 deletions

View file

@ -575,3 +575,24 @@ void Scheduler::timer_tick(RegisterDump& regs)
"orl $0x00004000, (%esp)\n"
"popf\n");
}
static bool s_should_stop_idling = false;
void Scheduler::stop_idling()
{
if (current != &s_colonel_process->main_thread())
return;
s_should_stop_idling = true;
}
void Scheduler::idle_loop()
{
for (;;) {
asm("hlt");
if (s_should_stop_idling) {
s_should_stop_idling = false;
yield();
}
}
}