29 lines
708 B
C
29 lines
708 B
C
#include <Arch/Timer.h>
|
|
#include <Arch/GIC.h>
|
|
#include <OS/Scheduler.h>
|
|
#include <Arch/Exceptions.h>
|
|
|
|
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;
|
|
}
|