X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=Kernel%2Farch%2Fx86%2Ftime.c;h=22ea6181e45bbbcfbbbb6be36eca6b094eb28656;hb=30e2436921e53b149d65403430048e39a44cad4b;hp=c38a9cd43c2f17b8cd75c53468f28da40f468247;hpb=3998cfbbadb005bf3ad52ea2538dc21f82864ddc;p=tpg%2Facess2.git diff --git a/Kernel/arch/x86/time.c b/Kernel/arch/x86/time.c index c38a9cd4..22ea6181 100644 --- a/Kernel/arch/x86/time.c +++ b/Kernel/arch/x86/time.c @@ -9,22 +9,48 @@ #define TIMER_QUANTUM 100 // 2^(15-rate), 15: 1HZ, 5: 1024Hz, 2: 8192Hz // (Max: 15, Min: 2) - 15 = 1Hz, 13 = 4Hz, 12 = 8Hz, 11 = 16Hz 10 = 32Hz, 2 = 8192Hz -#define TIMER_RATE 12 -//#define TIMER_RATE 15 +//#define TIMER_RATE 10 // 32 Hz +//#define TIMER_RATE 12 // 8 Hz +#define TIMER_RATE 14 // 2Hz +//#define TIMER_RATE 15 // 1HZ #define TIMER_FREQ (0x8000>>TIMER_RATE) //Hz #define MS_PER_TICK_WHOLE (1000/(TIMER_FREQ)) #define MS_PER_TICK_FRACT ((0x80000000*(1000%TIMER_FREQ))/TIMER_FREQ) // === IMPORTS === -extern Sint64 giTimestamp; -extern Uint64 giTicks; -extern Uint64 giPartMiliseconds; +extern volatile Sint64 giTimestamp; +extern volatile Uint64 giTicks; +extern volatile Uint64 giPartMiliseconds; extern void Timer_CallTimers(void); +// === GLOBALS === +volatile Uint64 giTime_TSCAtLastTick = 0; +volatile Uint64 giTime_TSCPerTick = 0; + // === PROTOTYPES === +//Sint64 now(void); + int Time_Setup(void); void Time_Interrupt(int); +Uint64 Time_ReadTSC(void); // === CODE === +/** + * \fn Sint64 now() + * \brief Return the current timestamp + */ +Sint64 now(void) +{ + Uint64 tsc = Time_ReadTSC(); + tsc -= giTime_TSCAtLastTick; + tsc *= MS_PER_TICK_WHOLE; + if( giTime_TSCPerTick ) { + tsc /= giTime_TSCPerTick; + } + else + tsc = 0; + return giTimestamp + tsc; +} + /** * \fn int Time_Setup(void) * \brief Sets the system time from the Realtime-Clock @@ -67,12 +93,19 @@ int Time_Setup(void) } /** - * \fn void Time_Interrupt(void) * \brief Called on the timekeeping IRQ + * \param irq IRQ number (unused) */ void Time_Interrupt(int irq) { //Log("RTC Tick"); + Uint64 curTSC = Time_ReadTSC(); + + if( giTime_TSCAtLastTick ) + { + giTime_TSCPerTick = curTSC - giTime_TSCAtLastTick; + } + giTime_TSCAtLastTick = curTSC; giTicks ++; giTimestamp += MS_PER_TICK_WHOLE; @@ -107,3 +140,10 @@ void Time_TimerThread(void) } } #endif + +Uint64 Time_ReadTSC(void) +{ + Uint32 a, d; + __asm__ __volatile__ ("rdtsc" : "=a" (a), "=d" (d)); + return ((Uint64)d << 32) | a; +}