#pragma once #include class ApicTimer { public: static void Init(); // FIXME: The calibration is not currently very accurate due to time taken // handling the PIT interrupts. It would probably be good to revisit this // after implementing HPET. void Calibrate(); private: struct Calibration { uint32_t initial_measurement = 0; uint32_t tick_count = 0; }; Calibration calibration_; uint64_t calculated_frequency_ = 0; ApicTimer() {} void StartCalibration(); void FinishCalibration(); void WaitCalibration() { while (calculated_frequency_ == 0) { asm("hlt;"); } } }; extern ApicTimer* gApicTimer;