Benchmarks now run in user-mode.
authorChristopher Celio <celio@eecs.berkeley.edu>
Thu, 10 Oct 2013 22:00:57 +0000 (15:00 -0700)
committerChristopher Celio <celio@eecs.berkeley.edu>
Thu, 10 Oct 2013 22:00:57 +0000 (15:00 -0700)
   - Jump to main performed by eret.
   - Nano trap handler added.
   - FinishTest refactored to perform SYS_exit, placed in util.h.
   - Only SYS_exit with test_result=1 results in a passed test.
   - Any other exceptions/syscalls/test_results end program with FAILED test.
   - PCR status set to S64/U64 if compiled in 64b.

benchmarks/common/crt.S
benchmarks/common/util.h
benchmarks/dgemm/dgemm_main.c
benchmarks/dhrystone/dhrystone_main.c
benchmarks/median/median_main.c
benchmarks/multiply/multiply_main.c
benchmarks/qsort/qsort_main.c
benchmarks/spmv/spmv_main.c
benchmarks/towers/towers_main.c
benchmarks/vvadd/vvadd_main.c

index ac5d9baaec567ca0e7f16d314f641be16e8ad74d..563360a7de7675aea56d3f29f07d17f6c6b40c58 100644 (file)
@@ -44,6 +44,11 @@ _start:
   li  x30,0
   li  x31,0
 
+#ifdef __riscv64
+  setpcr status, SR_S64
+  setpcr status, SR_U64
+#endif
+
   # enable fp
   setpcr status, SR_EF
 
@@ -89,12 +94,43 @@ _start:
   fmv.s.x f31,x0
 1:
 
+  lui a0, %hi(trap_entry)    
+  add a0, a0, %lo(trap_entry)
+  mtpcr a0, evec
+
+  lui a0, %hi(main)    
+  add a0, a0, %lo(main)
+  mtpcr a0, epc
+
   # only allow core 0 to proceed
 1:mfpcr a0, hartid
   bnez a0, 1b
 
   la  sp,stacktop
-  jal main
+  
+  # jmp to main as a user program
+  eret 
+1:b 1b
+
+.align 4
+.globl trap_entry
+trap_entry:                # only check for SYS_exit, otherwise crash out
+  li a3, 1337              # magic "bad things" happened error code
+  mfpcr a1, cause
+  li a2, 6                 # syscall exception number
+  bne a1, a2, exit_error
+handle_syscall:
+  li a1, 93                # SYS_exit number
+  bne v0, a1, exit_error
+  li a1, 1                 # successful exit code
+  move a3, a0
+  bne a3, a1, exit_error
+  mtpcr a1, tohost         # exit successfully (tohost == 1)
+1:b 1b
+exit_error:
+  sll a3, a3, 1
+  or  a3, a3, 1
+  mtpcr a3, tohost
 1:b 1b
 
   .bss
index 83b2b6c4a1638b4262d86ed09427c38e884be5ed..79d9256a7060c0eedfd2919a2ee815e1155b65b5 100644 (file)
@@ -5,6 +5,8 @@
 #ifndef __UTIL_H
 #define __UTIL_H
 
+#include <machine/syscall.h>
+
 #define rdcycle() ({ unsigned long _c; asm volatile ("rdcycle %0" : "=r"(_c) :: "memory"); _c; })
 #define rdinstret() ({ unsigned long _c; asm volatile ("rdinstret %0" : "=r"(_c) :: "memory"); _c; })
                             
@@ -27,6 +29,32 @@ void __attribute__((noinline)) barrier()
 
   __sync_synchronize();
 }
-   
+
+
+
+
+
+void finishTest(int test_result)
+{
+#if HOST_DEBUG
+  if ( test_result == 1 )
+    printf( "*** PASSED ***\n" );
+  else
+    printf( "*** FAILED *** (tohost = %d)\n", test_result);
+  exit(0);
+#else
+   {
+      // perform exit syscall
+      asm volatile(
+          "move a0,%0 ;"
+          "li a1,0    ;"
+          "li a2,0    ;"
+          "li a3,0    ;"
+          "li v0,%1   ;"
+          "syscall" : : "r"(test_result) , "i"(SYS_exit));
+   }
+#endif
+}
+
 #endif //__UTIL_H
 
index 72c90efd2d1ad161ab391ed5228a4f050f7a08fe..7fd7dc20cce967a4753003aaa0629d60d564600f 100644 (file)
@@ -2,6 +2,9 @@
 // Double-precision general matrix multiplication benchmark
 //--------------------------------------------------------------------------
 
+int ncores = 1;
+#include "util.h"
+
 //--------------------------------------------------------------------------
 // Macros
 
@@ -61,20 +64,6 @@ void printArray( char name[], long n, const double arr[] )
 }
 #endif
 
-void finishTest( int toHostValue )
-{
-#if HOST_DEBUG
-  if ( toHostValue == 1 )
-    printf( "*** PASSED ***\n" );
-  else
-    printf( "*** FAILED *** (tohost = %d)\n", toHostValue );
-  exit(0);
-#else
-  asm( "mtpcr %0, tohost" : : "r" (toHostValue) );
-  while ( 1 ) { }
-#endif
-}
-
 void setStats( int enable )
 {
 #if ( !HOST_DEBUG && SET_STATS )
index c2a8038de8c8dabbc07a1b022a6e1196e7a9d298..93b79da92b09f25d7ac4f925bac24210868c813f 100644 (file)
@@ -8,6 +8,9 @@
 
 #include "dhrystone.h"
 
+int ncores = 1;
+#include "util.h"
+
 //--------------------------------------------------------------------------
 // Macros
 
@@ -44,20 +47,6 @@ int __attribute__((noinline)) do_fprintf(FILE* f, const char* str, ...)
 }
 #endif
 
-void finishTest( int toHostValue )
-{
-#if HOST_DEBUG
-  if ( toHostValue == 1 )
-    printf( "*** PASSED ***\n" );
-  else
-    printf( "*** FAILED *** (tohost = %d)\n", toHostValue );
-  exit(0);
-#else
-  asm( "mtpcr %0, tohost" : : "r" (toHostValue) );
-  while ( 1 ) { }
-#endif
-}
-
 void setStats( int enable )
 {
 #if ( !HOST_DEBUG && SET_STATS )
index 5c435ddf56e20dc027d2e94cdc1d58dc687e7056..0691becfd5b5788a7ebe61e8532fb66e85c1c946 100644 (file)
@@ -10,6 +10,9 @@
 
 #include "median.h"
 
+int ncores = 1;
+#include "util.h"
+
 //--------------------------------------------------------------------------
 // Macros
 
@@ -67,20 +70,6 @@ void printArray( char name[], int n, int arr[] )
 }
 #endif
 
-void finishTest( int toHostValue )
-{
-#if HOST_DEBUG
-  if ( toHostValue == 1 )
-    printf( "*** PASSED ***\n" );
-  else
-    printf( "*** FAILED *** (tohost = %d)\n", toHostValue );
-  exit(0);
-#else
-  asm( "mtpcr %0, tohost" : : "r" (toHostValue) );
-  while ( 1 ) { }
-#endif
-}
-
 void setStats( int enable )
 {
 #if ( !HOST_DEBUG && SET_STATS )
index f2ce12bdd04d951959dba14179eb763314ddcaa5..ca359eb88cc8405ef7d2d8bb0036e339444f21ec 100644 (file)
@@ -10,6 +10,9 @@
 
 #include "multiply.h"
 
+int ncores = 1;
+#include "util.h"
+
 //--------------------------------------------------------------------------
 // Macros
 
@@ -76,20 +79,6 @@ void printArray( char name[], int n, int arr[] )
 }
 #endif
 
-void finishTest( int toHostValue )
-{
-#if HOST_DEBUG
-  if ( toHostValue == 1 )
-    printf( "*** PASSED ***\n" );
-  else
-    printf( "*** FAILED *** (tohost = %d)\n", toHostValue );
-  exit(0);
-#else
-  asm( "mtpcr %0, tohost" : : "r" (toHostValue) );
-  while ( 1 ) { }
-#endif
-}
-
 void setStats( int enable )
 {
 #if ( !HOST_DEBUG && SET_STATS )
index 486b8fc81df31ce429ebcde4fd7712518930b96b..e61eef2491c94aba3173dcb012ecf535806765d8 100644 (file)
@@ -11,6 +11,9 @@
 // processor simulator itself. You should not change anything except
 // the HOST_DEBUG and PREALLOCATE macros for your timing run.
 
+int ncores = 1;
+#include "util.h"
+
 //--------------------------------------------------------------------------
 // Macros
 
@@ -83,20 +86,6 @@ void printArray( char name[], int n, int arr[] )
 }
 #endif
 
-void finishTest( int toHostValue )
-{
-#if HOST_DEBUG
-  if ( toHostValue == 1 )
-    printf( "*** PASSED ***\n" );
-  else
-    printf( "*** FAILED *** (tohost = %d)\n", toHostValue );
-  exit(0);
-#else
-  asm( "mtpcr %0, tohost" : : "r" (toHostValue) );
-  while ( 1 ) { }
-#endif
-}
-
 void setStats( int enable )
 {
 #if ( !HOST_DEBUG && SET_STATS )
index afb1cf176858ba4d754c80ee9d2d34b246db7f08..d765ca2bbdae90c8c6e21d9dd97d613489837666 100644 (file)
@@ -2,6 +2,9 @@
 // Double-precision general matrix multiplication benchmark
 //--------------------------------------------------------------------------
 
+int ncores = 1;
+#include "util.h"
+
 //--------------------------------------------------------------------------
 // Macros
 
@@ -61,20 +64,6 @@ void printArray( char name[], long n, const double arr[] )
 }
 #endif
 
-void finishTest( int toHostValue )
-{
-#if HOST_DEBUG
-  if ( toHostValue == 1 )
-    printf( "*** PASSED ***\n" );
-  else
-    printf( "*** FAILED *** (tohost = %d)\n", toHostValue );
-  exit(0);
-#else
-  asm( "mtpcr %0, tohost" : : "r" (toHostValue) );
-  while ( 1 ) { }
-#endif
-}
-
 void setStats( int enable )
 {
 #if ( !HOST_DEBUG && SET_STATS )
index aa616653a366994c3fc947b3bcf7f143025addaa..724b73bf255802da0e657c0746f954f74e337bbe 100644 (file)
@@ -16,6 +16,9 @@
 // smips processor simulator itself. You should not change anything except
 // the HOST_DEBUG and PREALLOCATE macros for your timing run.
 
+int ncores = 1;
+#include "util.h"
+
 //--------------------------------------------------------------------------
 // Macros
 
 //--------------------------------------------------------------------------
 // Helper functions
 
-void finishTest( int toHostValue )
-{
-#if HOST_DEBUG
-  if ( toHostValue == 1 )
-    printf( "*** PASSED ***\n" );
-  else
-    printf( "*** FAILED *** (tohost = %d)\n", toHostValue );
-  exit(0);
-#else
-  asm( "mtpcr %0, tohost" : : "r" (toHostValue) );
-  while ( 1 ) { }
-#endif
-}
-
 void setStats( int enable )
 {
 #if ( !HOST_DEBUG && SET_STATS )
index 70b3f75e1116c5d3ae7dcf8890771420e6bbeccb..0be305159eb456fd0cbaf4aac94c06c2bb169f4e 100644 (file)
 // not on the smips processor simulator itself. You should not change
 // anything except the HOST_DEBUG and PREALLOCATE macros for your timing
 // runs.
-
+int ncores = 1;
+#include "util.h"
 //--------------------------------------------------------------------------
 // Macros
 
@@ -68,19 +71,19 @@ void printArray( char name[], int n, int arr[] )
 }
 #endif
 
-void finishTest( int toHostValue )
-{
-#if HOST_DEBUG
-  if ( toHostValue == 1 )
-    printf( "*** PASSED ***\n" );
-  else
-    printf( "*** FAILED *** (tohost = %d)\n", toHostValue );
-  exit(0);
-#else
-  asm( "mtpcr %0, tohost" : : "r" (toHostValue) );
-  while ( 1 ) { }
-#endif
-}
+//void finishTest( int toHostValue )
+//{
+//#if HOST_DEBUG
+//  if ( toHostValue == 1 )
+//    printf( "*** PASSED ***\n" );
+//  else
+//    printf( "*** FAILED *** (tohost = %d)\n", toHostValue );
+//  exit(0);
+//#else
+//  asm( "mtpcr %0, tohost" : : "r" (toHostValue) );
+//  while ( 1 ) { }
+//#endif
+//}
 
 void setStats( int enable )
 {