From f8de60e2dd6b0765bd2f647f6b435bdc91923c85 Mon Sep 17 00:00:00 2001 From: Drew Galbraith Date: Tue, 1 Aug 2023 21:48:20 -0700 Subject: [PATCH] [zion] Move more initialization into the ApicTimer class. --- zion/interrupt/apic_timer.cpp | 7 ++++++- zion/interrupt/apic_timer.h | 12 ++++++------ zion/zion.cpp | 4 ---- 3 files changed, 12 insertions(+), 11 deletions(-) diff --git a/zion/interrupt/apic_timer.cpp b/zion/interrupt/apic_timer.cpp index 53c98d4..d686cfb 100644 --- a/zion/interrupt/apic_timer.cpp +++ b/zion/interrupt/apic_timer.cpp @@ -4,11 +4,15 @@ #include "interrupt/apic.h" #include "interrupt/timer.h" +const uint32_t kScheduleFrequency = 20; ApicTimer* gApicTimer = nullptr; void ApicTimer::Init() { gApicTimer = new ApicTimer(); gApicTimer->StartCalibration(); + asm("sti;"); + gApicTimer->WaitCalibration(); + asm("cli;"); } void ApicTimer::StartCalibration() { @@ -33,5 +37,6 @@ void ApicTimer::Calibrate() { void ApicTimer::FinishCalibration() { MaskPit(); - SetLocalTimer(calculated_frequency_ / 20, LAPIC_TIMER_PERIODIC); + SetLocalTimer(calculated_frequency_ / kScheduleFrequency, + LAPIC_TIMER_PERIODIC); } diff --git a/zion/interrupt/apic_timer.h b/zion/interrupt/apic_timer.h index 7036566..bdf2712 100644 --- a/zion/interrupt/apic_timer.h +++ b/zion/interrupt/apic_timer.h @@ -11,12 +11,6 @@ class ApicTimer { // after implementing HPET. void Calibrate(); - void WaitCalibration() { - while (calculated_frequency_ == 0) { - asm("hlt;"); - } - } - private: struct Calibration { uint32_t initial_measurement = 0; @@ -29,6 +23,12 @@ class ApicTimer { ApicTimer() {} void StartCalibration(); void FinishCalibration(); + + void WaitCalibration() { + while (calculated_frequency_ == 0) { + asm("hlt;"); + } + } }; extern ApicTimer* gApicTimer; diff --git a/zion/zion.cpp b/zion/zion.cpp index 7402787..9e223b8 100644 --- a/zion/zion.cpp +++ b/zion/zion.cpp @@ -39,11 +39,7 @@ extern "C" void zion() { dbgln("[boot] Init scheduler."); ProcessManager::Init(); Scheduler::Init(); - // Schedule every 50ms. ApicTimer::Init(); - asm("sti;"); - gApicTimer->WaitCalibration(); - asm("cli;"); dbgln("[boot] Loading sys init program."); LoadInitProgram();