#include #include #include #include static volatile UInt64 sTimerCounter = 0; void TimerInitialize() { GICEnableInterrupt(kTimerIRQ); TimerReset(kTimerFrequency); } void TimerReset(UInt64 interval) { UInt64 frequency; __asm__ volatile ("mrs %0, cntfrq_el0" : "=r"(frequency)); __asm__ volatile ("msr cntv_tval_el0, %0" :: "r"(frequency /interval)); __asm__ volatile ("msr cntv_ctl_el0, %0" :: "r"((UInt64)1)); } Address TimerHandler(ExceptionsContext* frame) { sTimerCounter++; TimerReset(kTimerFrequency); return SchedulerNext((Address)frame); } UInt64 TimerGetCounter() { return sTimerCounter; }