aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPrashanth Mundkur <prashanth.mundkur@gmail.com>2019-01-25 19:07:12 -0800
committerPrashanth Mundkur <prashanth.mundkur@gmail.com>2019-01-25 19:07:12 -0800
commit802070807a98ee42d6d5c2933c2f0f1a13ae2509 (patch)
treebb661b025b3314b2f7c1b9b95ab77390917f380f
parent89cf6f8525ba5ecb67d29302b7cf3233e7553ba4 (diff)
downloadsail-riscv-802070807a98ee42d6d5c2933c2f0f1a13ae2509.zip
sail-riscv-802070807a98ee42d6d5c2933c2f0f1a13ae2509.tar.gz
sail-riscv-802070807a98ee42d6d5c2933c2f0f1a13ae2509.tar.bz2
Account for U-mode availability in xRET.
-rw-r--r--model/riscv_sys.sail3
1 files changed, 2 insertions, 1 deletions
diff --git a/model/riscv_sys.sail b/model/riscv_sys.sail
index d97f63e..591f496 100644
--- a/model/riscv_sys.sail
+++ b/model/riscv_sys.sail
@@ -966,7 +966,7 @@ function handle_exception(cur_priv : Privilege, ctl : ctl_result,
mstatus->MIE() = mstatus.MPIE();
mstatus->MPIE() = true;
cur_privilege = privLevel_of_bits(mstatus.MPP());
- mstatus->MPP() = privLevel_to_bits(User);
+ mstatus->MPP() = privLevel_to_bits(if haveUsrMode() then User else Machine);
print_reg("CSR mstatus <- " ^ BitStr(mstatus.bits()) ^ " (input: " ^ BitStr(mstatus.bits()) ^ ")"); // Spike compatible log
print_platform("ret-ing from " ^ prev_priv ^ " to " ^ cur_privilege);
@@ -979,6 +979,7 @@ function handle_exception(cur_priv : Privilege, ctl : ctl_result,
mstatus->SIE() = mstatus.SPIE();
mstatus->SPIE() = true;
cur_privilege = if mstatus.SPP() == true then Supervisor else User;
+ /* S-mode implies that U-mode is supported (issue #331 on riscv-isa-manual). */
mstatus->SPP() = false;
print_reg("CSR mstatus <- " ^ BitStr(mstatus.bits()) ^ " (input: " ^ BitStr(mstatus.bits()) ^ ")"); // Spike compatible log