aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-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();