Adding support for perfctr in trad_proc timer handler
authorYu Zhu <yuzhu@parcad.millennium.berkeley.edu>
Fri, 7 May 2010 02:03:00 +0000 (19:03 -0700)
committerKevin Klues <klueska@cs.berkeley.edu>
Thu, 3 Nov 2011 00:35:47 +0000 (17:35 -0700)
kern/arch/i686/perfmon.h
kern/arch/i686/smp_boot.c
kern/src/timer.c

index c03c59d..051f336 100644 (file)
 
 
 static __inline uint64_t
-read_pmc(void)
-{
+read_pmc(uint32_t index)
+{                                                                                                    
     uint64_t pmc;
-    __asm __volatile("rdpmc" : "=A" (pmc));
-    return pmc;
+
+    __asm __volatile("rdpmc" : "=A" (pmc) : "c" (index)); 
+    return pmc;                                                                                      
 }
 
 void perfmon_init();
index 98bcdd8..d17c9c8 100644 (file)
@@ -324,6 +324,10 @@ void smp_percpu_init(void)
        STAILQ_INIT(&per_cpu_info[coreid].immed_amsgs);
        spinlock_init(&per_cpu_info[coreid].routine_amsg_lock);
        STAILQ_INIT(&per_cpu_info[coreid].routine_amsgs);
+       
+       /* need to init perfctr before potentiall using it in timer handler */
+       perfmon_init();
+
 #ifdef __CONFIG_EXPER_TRADPROC__
        per_cpu_info[coreid].ticks = 0;
        spinlock_init(&per_cpu_info[coreid].runqueue_lock);
@@ -334,5 +338,4 @@ void smp_percpu_init(void)
        set_core_timer(TIMER_uSEC);
 #endif
 
-  perfmon_init();
 }
index 1212ecd..716f9a4 100644 (file)
@@ -9,6 +9,12 @@
 #include <ros/timer.h>
 #include <stdio.h>
 #include <schedule.h>
+<<<<<<< HEAD
+=======
+#include <multiboot.h>
+#include <pmap.h>
+#include <arch/perfmon.h>
+>>>>>>> 3611594... adding support for perfctr in trad_proc timer handler
 
 /* timing_overhead
  * Any user space process that links to this file will get its own copy.  
@@ -83,6 +89,28 @@ void train_timing()
 void timer_interrupt(struct trapframe *tf, void *data)
 {
 #ifdef __CONFIG_EXPER_TRADPROC__
+
+       #ifdef __sparc_v8__
+       # define num_misses read_perfctr(core_id(),22)
+       #else
+       # define num_misses (read_pmc(1))
+       #endif
+
+       // cause M misses and run for N usec
+       #define M 1000
+       #define N 10
+       unsigned int lfsr = 1+read_tsc()%7;
+
+       uint64_t t0 = read_tsc();
+       uint64_t misses0 = num_misses;
+       while(num_misses-misses0 < M)
+       {
+               int x;
+               x = *(volatile int*)KADDR((4*lfsr) % maxaddrpa);
+               lfsr = (lfsr >> 1) ^ (unsigned int)(0 - ((lfsr & 1u) & 0xd0000001u));
+       }
+       while((read_tsc()-t0)/(system_timing.tsc_freq/1000000) < N);
+
        /* about every 10 ticks (100ms) run the load balancer.  Offset by coreid so
         * it's not as horrible.  */
        if (per_cpu_info[core_id()].ticks % 10 == core_id())