_M procs start up at _start/hart_entry for vcore0
[akaros.git] / kern / src / timer.c
index 9c3f323..d708616 100644 (file)
@@ -1,5 +1,12 @@
-#include <arch/x86.h>
-#include <arch/timer.h>
+
+// zra: why is this in the kernel?
+
+#ifdef __SHARC__
+#pragma nosharc
+#endif
+
+#include <arch/arch.h>
+#include <ros/timer.h>
 
 /* timing_overhead
  * Any user space process that links to this file will get its own copy.  
@@ -13,7 +20,7 @@ uint64_t timing_overhead = 0;
  * value.  It is pusposefully annotated with a noinline so that the overheads 
  * assocaited with calling it are as deterministic as possible.
  */
-uint64_t start_timing() __attribute__((noinline))
+uint64_t start_timing()
 {
     return read_tsc_serialized();
 }
@@ -27,9 +34,12 @@ uint64_t start_timing() __attribute__((noinline))
  * This function is purposefully annotated with a noinline so that 
  * the overheads assocaited with calling it are as deterministic as possible.
  */
-uint64_t stop_timing(uint64_t val) __attribute__((noinline))
+uint64_t stop_timing(uint64_t val)
 {
-    return (read_tsc_serialized() - val - timing_overhead);
+    uint64_t diff = (read_tsc_serialized() - val - timing_overhead);
+       if ((int64_t) diff < 0) 
+               return 1;
+       return diff;
 }
 
 /* train_timing()
@@ -40,7 +50,8 @@ uint64_t stop_timing(uint64_t val) __attribute__((noinline))
 void train_timing() 
 {
        int i;
-       register uint64_t cum_overhead = 0;
+       // set training overhead to be something large
+       register uint64_t training_overhead = 0xffffffff;
        register uint64_t time, diff;
 
        //Do this 3 times outside the loop to warm up cpuid
@@ -50,7 +61,6 @@ void train_timing()
        diff = stop_timing(time);
        time = start_timing();
        diff = stop_timing(time);
-
        for(i=0; i<10000; i++) {
                time = start_timing();
                diff = stop_timing(time);
@@ -59,8 +69,8 @@ void train_timing()
                 * to the cumulative error, otherwise, just diff itself
                 */
                if((int64_t)diff < 0)
-                       diff = (uint64_t)(~0) - diff + 1; 
-               cum_overhead += diff;
+                       diff = (uint64_t)(~0) - diff + 1;
+               training_overhead = MIN(training_overhead, diff);
        }
-       timing_overhead = (cum_overhead/i);
+       timing_overhead = training_overhead;
 }