Rework benchmarks to run in M-mode
authorAndrew Waterman <waterman@cs.berkeley.edu>
Tue, 15 Mar 2016 00:47:25 +0000 (17:47 -0700)
committerAndrew Waterman <waterman@cs.berkeley.edu>
Tue, 15 Mar 2016 00:47:25 +0000 (17:47 -0700)
This broadens their utility and lets them use the M-mode counters directly.

benchmarks/common/crt.S
benchmarks/common/syscalls.c
benchmarks/common/test.ld
benchmarks/common/util.h
benchmarks/dhrystone/dhrystone.h
benchmarks/mm/mm_main.c

index 29c1d4dd1b08f90d617eee74e517daf993fc1a8c..919461b8c35b178cc5e20d5a5553379af044582c 100644 (file)
 #endif
 
   .text
 #endif
 
   .text
-  .align 6
-user_trap_entry:
-  j trap_entry
-
-  .align 6
-supervisor_trap_entry:
-  j supervisor_trap_entry
+  .globl _start
+_start:
+  j handle_reset
 
 
-  .align 6
-hypervisor_trap_entry:
-  j hypervisor_trap_entry
+nmi_vector:
+  j nmi_vector
 
 
-  .align 6
-machine_trap_entry:
+trap_vector:
   j trap_entry
 
   j trap_entry
 
-  .align 6
-  .globl _start
-_start:
+handle_reset:
   li  x1, 0
   li  x2, 0
   li  x3, 0
   li  x1, 0
   li  x2, 0
   li  x3, 0
@@ -64,8 +56,6 @@ _start:
   li  x30,0
   li  x31,0
 
   li  x30,0
   li  x31,0
 
-  li t0, MSTATUS_MPP;  csrc mstatus, t0    # run tests in user mode
-  li t0, MSTATUS_MPIE; csrs mstatus, t0    # enable interrupts in user mode
   li t0, MSTATUS_FS;   csrs mstatus, t0    # enable FPU
   li t0, MSTATUS_XS;   csrs mstatus, t0    # enable accelerator
 
   li t0, MSTATUS_FS;   csrs mstatus, t0    # enable FPU
   li t0, MSTATUS_XS;   csrs mstatus, t0    # enable accelerator
 
@@ -146,9 +136,7 @@ _start:
   sll sp, sp, STKSHIFT
   add sp, sp, tp
 
   sll sp, sp, STKSHIFT
   add sp, sp, tp
 
-  la t0, _init
-  csrw mepc, t0
-  eret
+  j _init
 
 trap_entry:
   addi sp, sp, -272
 
 trap_entry:
   addi sp, sp, -272
@@ -191,6 +179,10 @@ trap_entry:
   jal handle_trap
   csrw mepc, a0
 
   jal handle_trap
   csrw mepc, a0
 
+  # Remain in M-mode after eret
+  li t0, MSTATUS_MPP
+  csrs mstatus, t0
+
   LREG x1, 1*REGBYTES(sp)
   LREG x2, 2*REGBYTES(sp)
   LREG x3, 3*REGBYTES(sp)
   LREG x1, 1*REGBYTES(sp)
   LREG x2, 2*REGBYTES(sp)
   LREG x3, 3*REGBYTES(sp)
index ce6d6535176ca80f62900ddd865244c2a5b22252..d391013450b10cb22401de1ca551f38ca4483234 100644 (file)
@@ -49,7 +49,7 @@ static int handle_stats(int enable)
     if (!enable) { csr -= counters[i]; counter_names[i] = #name; } \
     counters[i++] = csr; \
   } while (0)
     if (!enable) { csr -= counters[i]; counter_names[i] = #name; } \
     counters[i++] = csr; \
   } while (0)
-  READ_CTR(cycle);   READ_CTR(instret);
+  READ_CTR(mcycle);  READ_CTR(minstret);
   READ_CTR(uarch0);  READ_CTR(uarch1);  READ_CTR(uarch2);  READ_CTR(uarch3);
   READ_CTR(uarch4);  READ_CTR(uarch5);  READ_CTR(uarch6);  READ_CTR(uarch7);
   READ_CTR(uarch8);  READ_CTR(uarch9);  READ_CTR(uarch10); READ_CTR(uarch11);
   READ_CTR(uarch0);  READ_CTR(uarch1);  READ_CTR(uarch2);  READ_CTR(uarch3);
   READ_CTR(uarch4);  READ_CTR(uarch5);  READ_CTR(uarch6);  READ_CTR(uarch7);
   READ_CTR(uarch8);  READ_CTR(uarch9);  READ_CTR(uarch10); READ_CTR(uarch11);
@@ -69,13 +69,13 @@ void tohost_exit(long code)
 long handle_trap(long cause, long epc, long regs[32])
 {
   int* csr_insn;
 long handle_trap(long cause, long epc, long regs[32])
 {
   int* csr_insn;
-  asm ("jal %0, 1f; csrr a0, stats; 1:" : "=r"(csr_insn));
+  asm ("jal %0, 1f; csrr a0, 0x0; 1:" : "=r"(csr_insn));
   long sys_ret = 0;
 
   if (cause == CAUSE_ILLEGAL_INSTRUCTION &&
       (*(int*)epc & *csr_insn) == *csr_insn)
     ;
   long sys_ret = 0;
 
   if (cause == CAUSE_ILLEGAL_INSTRUCTION &&
       (*(int*)epc & *csr_insn) == *csr_insn)
     ;
-  else if (cause != CAUSE_USER_ECALL)
+  else if (cause != CAUSE_MACHINE_ECALL)
     tohost_exit(1337);
   else if (regs[17] == SYS_exit)
     tohost_exit(regs[10]);
     tohost_exit(1337);
   else if (regs[17] == SYS_exit)
     tohost_exit(regs[10]);
index db4ec452ea4c484c70048a5176a4b351e16b7c6c..00eb4a2b965d5fec989dcb83a86976eca0395b68 100644 (file)
@@ -21,7 +21,7 @@ SECTIONS
 {
 
   /* text: test code section */
 {
 
   /* text: test code section */
-  . = 0x100;
+  . = 0x0;
   .text : 
   {
     crt.o(.text)
   .text : 
   {
     crt.o(.text)
index 2fcc89dffa18848ee03086243e0074d1150acac4..c35bf7cde831b39354e7da5791737694840adb54 100644 (file)
@@ -126,9 +126,9 @@ static uint64_t lfsr(uint64_t x)
 #define stringify_1(s) #s
 #define stringify(s) stringify_1(s)
 #define stats(code, iter) do { \
 #define stringify_1(s) #s
 #define stringify(s) stringify_1(s)
 #define stats(code, iter) do { \
-    unsigned long _c = -rdcycle(), _i = -rdinstret(); \
+    unsigned long _c = -read_csr(mcycle), _i = -read_csr(minstret); \
     code; \
     code; \
-    _c += rdcycle(), _i += rdinstret(); \
+    _c += read_csr(mcycle), _i += read_csr(minstret); \
     if (cid == 0) \
       printf("\n%s: %ld cycles, %ld.%ld cycles/iter, %ld.%ld CPI\n", \
              stringify(code), _c, _c/iter, 10*_c/iter%10, _c/_i, 10*_c/_i%10); \
     if (cid == 0) \
       printf("\n%s: %ld cycles, %ld.%ld cycles/iter, %ld.%ld CPI\n", \
              stringify(code), _c, _c/iter, 10*_c/iter%10, _c/_i, 10*_c/_i%10); \
index 37535e77beec2d81ab826177ec16dcf6dca98447..89616afd3b45fec691f538ee101e9038db426b6e 100644 (file)
@@ -384,8 +384,8 @@ extern clock_t      clock();
 #define HZ 1000000
 #define Too_Small_Time 1
 #define CLOCK_TYPE "rdcycle()"
 #define HZ 1000000
 #define Too_Small_Time 1
 #define CLOCK_TYPE "rdcycle()"
-#define Start_Timer() Begin_Time = rdcycle()
-#define Stop_Timer() End_Time = rdcycle()
+#define Start_Timer() Begin_Time = read_csr(mcycle)
+#define Stop_Timer() End_Time = read_csr(mcycle)
 
 #else
                 /* Use times(2) time function unless    */
 
 #else
                 /* Use times(2) time function unless    */
index 8b6a0933f096eb8202efe48586c077726da38fb7..4d08b152350e33fc2a5419375a825cacce2d8acb 100644 (file)
@@ -31,11 +31,11 @@ void thread_entry(int cid, int nc)
   size_t instret, cycles;
   for (int i = 0; i < R; i++)
   {
   size_t instret, cycles;
   for (int i = 0; i < R; i++)
   {
-    instret = -rdinstret();
-    cycles = -rdcycle();
+    instret = -read_csr(minstret);
+    cycles = -read_csr(mcycle);
     mm(m, n, p, a, p, b, n, c, n);
     mm(m, n, p, a, p, b, n, c, n);
-    instret += rdinstret();
-    cycles += rdcycle();
+    instret += read_csr(minstret);
+    cycles += read_csr(mcycle);
   }
 
   asm volatile("fence");
   }
 
   asm volatile("fence");