aboutsummaryrefslogtreecommitdiff
path: root/riscv/insns/wfi.h
diff options
context:
space:
mode:
authorAndrew Waterman <andrew@sifive.com>2020-09-24 17:36:31 -0700
committerAndrew Waterman <andrew@sifive.com>2020-09-24 17:53:27 -0700
commit9ac9ff2c6e27e6a06dd52b79ae0e0d9b99e2bd0b (patch)
tree6ca1029a0e7229bd912ebe357029e3dfad161b19 /riscv/insns/wfi.h
parent14ad0d98e45c74e824592b9f2f8b65cf1c07ead1 (diff)
downloadspike-9ac9ff2c6e27e6a06dd52b79ae0e0d9b99e2bd0b.zip
spike-9ac9ff2c6e27e6a06dd52b79ae0e0d9b99e2bd0b.tar.gz
spike-9ac9ff2c6e27e6a06dd52b79ae0e0d9b99e2bd0b.tar.bz2
correctly respect mstatus.TW and hstatus.VTW
Diffstat (limited to 'riscv/insns/wfi.h')
-rw-r--r--riscv/insns/wfi.h11
1 files changed, 9 insertions, 2 deletions
diff --git a/riscv/insns/wfi.h b/riscv/insns/wfi.h
index edcd863..59ed35b 100644
--- a/riscv/insns/wfi.h
+++ b/riscv/insns/wfi.h
@@ -1,4 +1,11 @@
-if (STATE.v && (STATE.prv == PRV_U || get_field(STATE.hstatus, HSTATUS_VTW)))
+if (STATE.v && STATE.prv == PRV_U) {
require_novirt();
-require_privilege(get_field(STATE.mstatus, MSTATUS_TW) ? PRV_M : PRV_S);
+} else if (get_field(STATE.mstatus, MSTATUS_TW)) {
+ require_privilege(PRV_M);
+} else if (STATE.v) { // VS-mode
+ if (get_field(STATE.hstatus, HSTATUS_VTW))
+ require_novirt();
+} else {
+ require_privilege(PRV_S);
+}
wfi();