1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-03 05:32:13 +00:00

Kernel: Set up and calibrate APIC timer, and enable timer on all CPUs

This enables the APIC timer on all CPUs, which means Scheduler::timer_tick
is now called on all CPUs independently. We still don't do anything on
the APs as it instantly crashes due to a number of other problems.
This commit is contained in:
Tom 2020-10-25 09:13:47 -06:00 committed by Andreas Kling
parent 9d347352a1
commit fe615e601a
14 changed files with 478 additions and 70 deletions

View file

@ -777,15 +777,19 @@ void Scheduler::timer_tick(const RegisterState& regs)
ASSERT_INTERRUPTS_DISABLED();
ASSERT(Processor::current().in_irq());
if (Processor::current().id() > 0)
return;
auto current_thread = Processor::current().current_thread();
if (!current_thread)
return;
++g_uptime;
bool is_bsp = Processor::current().id() == 0;
if (!is_bsp)
return; // TODO: This prevents scheduling on other CPUs!
if (is_bsp) {
// TODO: We should probably move this out of the scheduler
++g_uptime;
g_timeofday = TimeManagement::now_as_timeval();
g_timeofday = TimeManagement::now_as_timeval();
}
if (current_thread->process().is_profiling()) {
SmapDisabler disabler;
@ -799,7 +803,8 @@ void Scheduler::timer_tick(const RegisterState& regs)
}
}
TimerQueue::the().fire();
if (is_bsp)
TimerQueue::the().fire();
if (current_thread->tick())
return;