aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--benchmarks/common/crt.S19
-rw-r--r--benchmarks/common/syscalls.c2
2 files changed, 18 insertions, 3 deletions
diff --git a/benchmarks/common/crt.S b/benchmarks/common/crt.S
index 19ff3b2..0c99c4a 100644
--- a/benchmarks/common/crt.S
+++ b/benchmarks/common/crt.S
@@ -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
diff --git a/benchmarks/common/syscalls.c b/benchmarks/common/syscalls.c
index 4c494f1..3c08bc2 100644
--- a/benchmarks/common/syscalls.c
+++ b/benchmarks/common/syscalls.c
@@ -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);