[zion] Move more initialization into the ApicTimer class.

This commit is contained in:
Drew Galbraith 2023-08-01 21:48:20 -07:00
parent d99624daf6
commit f8de60e2dd
3 changed files with 12 additions and 11 deletions

View File

@ -4,11 +4,15 @@
#include "interrupt/apic.h" #include "interrupt/apic.h"
#include "interrupt/timer.h" #include "interrupt/timer.h"
const uint32_t kScheduleFrequency = 20;
ApicTimer* gApicTimer = nullptr; ApicTimer* gApicTimer = nullptr;
void ApicTimer::Init() { void ApicTimer::Init() {
gApicTimer = new ApicTimer(); gApicTimer = new ApicTimer();
gApicTimer->StartCalibration(); gApicTimer->StartCalibration();
asm("sti;");
gApicTimer->WaitCalibration();
asm("cli;");
} }
void ApicTimer::StartCalibration() { void ApicTimer::StartCalibration() {
@ -33,5 +37,6 @@ void ApicTimer::Calibrate() {
void ApicTimer::FinishCalibration() { void ApicTimer::FinishCalibration() {
MaskPit(); MaskPit();
SetLocalTimer(calculated_frequency_ / 20, LAPIC_TIMER_PERIODIC); SetLocalTimer(calculated_frequency_ / kScheduleFrequency,
LAPIC_TIMER_PERIODIC);
} }

View File

@ -11,12 +11,6 @@ class ApicTimer {
// after implementing HPET. // after implementing HPET.
void Calibrate(); void Calibrate();
void WaitCalibration() {
while (calculated_frequency_ == 0) {
asm("hlt;");
}
}
private: private:
struct Calibration { struct Calibration {
uint32_t initial_measurement = 0; uint32_t initial_measurement = 0;
@ -29,6 +23,12 @@ class ApicTimer {
ApicTimer() {} ApicTimer() {}
void StartCalibration(); void StartCalibration();
void FinishCalibration(); void FinishCalibration();
void WaitCalibration() {
while (calculated_frequency_ == 0) {
asm("hlt;");
}
}
}; };
extern ApicTimer* gApicTimer; extern ApicTimer* gApicTimer;

View File

@ -39,11 +39,7 @@ extern "C" void zion() {
dbgln("[boot] Init scheduler."); dbgln("[boot] Init scheduler.");
ProcessManager::Init(); ProcessManager::Init();
Scheduler::Init(); Scheduler::Init();
// Schedule every 50ms.
ApicTimer::Init(); ApicTimer::Init();
asm("sti;");
gApicTimer->WaitCalibration();
asm("cli;");
dbgln("[boot] Loading sys init program."); dbgln("[boot] Loading sys init program.");
LoadInitProgram(); LoadInitProgram();