Don't rely on reset values of MSTATUS_UA/SA
authorAndrew Waterman <waterman@cs.berkeley.edu>
Tue, 21 Apr 2015 21:58:47 +0000 (14:58 -0700)
committerAndrew Waterman <waterman@cs.berkeley.edu>
Tue, 21 Apr 2015 21:58:47 +0000 (14:58 -0700)
benchmarks/common/crt.S
benchmarks/common/syscalls.c

index 19ff3b262f065873ed20bdd51d95b998f53509cd..0c99c4a913df39a71c008ee1b9b38838500ff4f3 100644 (file)
@@ -67,8 +67,23 @@ _start:
   li t0, MSTATUS_FS;   csrs mstatus, t0    # enable FPU
   li t0, MSTATUS_XS;   csrs mstatus, t0    # enable accelerator
 
-#ifndef __riscv64
-  li t0, MSTATUS_UA;   csrc mstatus, t0    # disable RV64 for user mode
+  li t0, ((MSTATUS64_UA & ~(MSTATUS64_UA << 1)) * UA_RV64) >> 31
+  sll t0, t0, 31
+  li t1, ((MSTATUS64_SA & ~(MSTATUS64_SA << 1)) * UA_RV64) >> 31
+  sll t1, t1, 31
+#ifdef __riscv64
+  # make sure processor supports RV64 if this was compiled for RV64
+  bnez t0, 1f
+  li a0, 1234
+  j tohost_exit
+1:
+  # enable RV64 for user and supervisor
+  csrs mstatus, t0
+  csrs mstatus, t1
+#else
+  # disable RV64 for user and supervisor
+  csrc mstatus, t0
+  csrc mstatus, t1
 #endif
 
   csrr t0, mstatus
index 4c494f1b253807ee2fe36a0dcce9661d2aed3126..3c08bc2f9a59089b46db462e592faf33b404bedd 100644 (file)
@@ -60,7 +60,7 @@ static int handle_stats(int enable)
   return 0;
 }
 
-static void tohost_exit(int code)
+void tohost_exit(long code)
 {
   write_csr(tohost, (code << 1) | 1);
   while (1);