[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/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);
}

View File

@ -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;

View File

@ -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();