Usermode/libc - Fix strchr and strrchr behavior
[tpg/acess2.git] / KernelLand / Kernel / arch / x86 / time.c
index 9b59b30..b367c50 100644 (file)
@@ -4,6 +4,7 @@
  * arch/x86/time.c
  */
 #include <acess.h>
+#include <timers.h>
 
 // === MACROS ===
 #define        TIMER_QUANTUM   100
@@ -15,6 +16,7 @@
 #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)
+#define US_PER_TICK    (1000*1000/(TIMER_FREQ))
 
 // === IMPORTS ===
 extern volatile Sint64 giTimestamp;
@@ -101,6 +103,7 @@ void Time_Interrupt(int IRQ, void *Ptr)
        if( giTime_TSCAtLastTick )
        {
                giTime_TSCPerTick = curTSC - giTime_TSCAtLastTick;
+               //Debug("TSC Frequency is %llu-%llu = %llu Hz", curTSC, giTime_TSCAtLastTick, giTime_TSCPerTick*2);
        }
        giTime_TSCAtLastTick = curTSC;
        
@@ -119,6 +122,21 @@ void Time_Interrupt(int IRQ, void *Ptr)
        inb(0x71);      // Just throw away contents.
 }
 
+void Time_MicroSleep(Uint16 Microsecs) // max 64 ms
+{
+       Uint64  cur_tsc = Time_ReadTSC();
+       // tsc_per_us * Microsec
+       Uint64  delta_tsc = (Uint64)Microsecs * giTime_TSCPerTick / US_PER_TICK;
+       Uint64  tgt_tsc = cur_tsc + delta_tsc;
+
+       if( tgt_tsc < cur_tsc )
+               while(Time_ReadTSC() > cur_tsc)
+                       ;       
+
+       while( Time_ReadTSC() < tgt_tsc )
+               ;
+}
+
 Uint64 Time_ReadTSC(void)
 {
        Uint32  a, d;

UCC git Repository :: git.ucc.asn.au