aboutsummaryrefslogtreecommitdiff
path: root/benchmarks/common/syscalls.c
diff options
context:
space:
mode:
Diffstat (limited to 'benchmarks/common/syscalls.c')
-rw-r--r--benchmarks/common/syscalls.c15
1 files changed, 14 insertions, 1 deletions
diff --git a/benchmarks/common/syscalls.c b/benchmarks/common/syscalls.c
index d506536..fbbb880 100644
--- a/benchmarks/common/syscalls.c
+++ b/benchmarks/common/syscalls.c
@@ -34,6 +34,13 @@ static long counters[NUM_COUNTERS];
static char* counter_names[NUM_COUNTERS];
static int handle_stats(int enable)
{
+ //use csrs to set stats register
+ if(enable) {
+ asm volatile (R"(
+ addi v0, x0, 1
+ csrrs v0, stats, v0
+ )" : : : "v0");
+ }
int i = 0;
#define READ_CTR(name) do { \
while (i >= NUM_COUNTERS) ; \
@@ -47,6 +54,12 @@ static int handle_stats(int enable)
READ_CTR(uarch8); READ_CTR(uarch9); READ_CTR(uarch10); READ_CTR(uarch11);
READ_CTR(uarch12); READ_CTR(uarch13); READ_CTR(uarch14); READ_CTR(uarch15);
#undef READ_CTR
+ if(!enable) {
+ asm volatile (R"(
+ addi v0, x0, 1
+ csrrc v0, stats, v0
+ )" : : : "v0");
+ }
return 0;
}
@@ -59,7 +72,7 @@ static void tohost_exit(int code)
long handle_trap(long cause, long epc, long regs[32])
{
int csr_insn;
- asm volatile ("lw %0, 1f; j 2f; 1: csrr v0, uarch0; 2:" : "=r"(csr_insn));
+ asm volatile ("lw %0, 1f; j 2f; 1: csrr v0, stats; 2:" : "=r"(csr_insn));
long sys_ret = 0;
if (cause == CAUSE_ILLEGAL_INSTRUCTION &&