aboutsummaryrefslogtreecommitdiff
path: root/riscv/insns
diff options
context:
space:
mode:
authorAndrew Waterman <andrew@sifive.com>2023-05-24 14:07:14 -0700
committerAndrew Waterman <andrew@sifive.com>2023-05-25 14:35:43 -0700
commit2c6b94e853cc1ee0c51a46859cf92451c0c19491 (patch)
tree7e324eb00527f04dcf7c74e0b93f97bd6011063c /riscv/insns
parent0abf98f6f6d5b23b3d23f0c1af0b77b95a199bfe (diff)
downloadriscv-isa-sim-2c6b94e853cc1ee0c51a46859cf92451c0c19491.zip
riscv-isa-sim-2c6b94e853cc1ee0c51a46859cf92451c0c19491.tar.gz
riscv-isa-sim-2c6b94e853cc1ee0c51a46859cf92451c0c19491.tar.bz2
Refactor set_privilege to subsume set_virt
This cleans up the code and avoids bugs like #1365.
Diffstat (limited to 'riscv/insns')
-rw-r--r--riscv/insns/dret.h3
-rw-r--r--riscv/insns/mnret.h3
-rw-r--r--riscv/insns/mret.h3
-rw-r--r--riscv/insns/sret.h3
4 files changed, 4 insertions, 8 deletions
diff --git a/riscv/insns/dret.h b/riscv/insns/dret.h
index 0540c51..2abcc7d 100644
--- a/riscv/insns/dret.h
+++ b/riscv/insns/dret.h
@@ -1,7 +1,6 @@
require(STATE.debug_mode);
set_pc_and_serialize(STATE.dpc->read());
-p->set_privilege(STATE.dcsr->prv);
-p->set_virt(STATE.dcsr->v);
+p->set_privilege(STATE.dcsr->prv, STATE.dcsr->v);
if (STATE.prv < PRV_M)
STATE.mstatus->write(STATE.mstatus->read() & ~MSTATUS_MPRV);
diff --git a/riscv/insns/mnret.h b/riscv/insns/mnret.h
index bc69510..30f1081 100644
--- a/riscv/insns/mnret.h
+++ b/riscv/insns/mnret.h
@@ -11,5 +11,4 @@ if (prev_prv != PRV_M) {
}
s = set_field(s, MNSTATUS_NMIE, 1);
STATE.mnstatus->write(s);
-p->set_privilege(prev_prv);
-p->set_virt(prev_virt);
+p->set_privilege(prev_prv, prev_virt);
diff --git a/riscv/insns/mret.h b/riscv/insns/mret.h
index 5198b8f..f5f86a2 100644
--- a/riscv/insns/mret.h
+++ b/riscv/insns/mret.h
@@ -10,5 +10,4 @@ s = set_field(s, MSTATUS_MPIE, 1);
s = set_field(s, MSTATUS_MPP, p->extension_enabled('U') ? PRV_U : PRV_M);
s = set_field(s, MSTATUS_MPV, 0);
p->put_csr(CSR_MSTATUS, s);
-p->set_privilege(prev_prv);
-p->set_virt(prev_virt);
+p->set_privilege(prev_prv, prev_virt);
diff --git a/riscv/insns/sret.h b/riscv/insns/sret.h
index 82c238b..4c7305d 100644
--- a/riscv/insns/sret.h
+++ b/riscv/insns/sret.h
@@ -24,5 +24,4 @@ if (!STATE.v) {
STATE.mstatus->write(set_field(STATE.mstatus->read(), MSTATUS_MPRV, 0));
}
-p->set_privilege(prev_prv);
-p->set_virt(prev_virt);
+p->set_privilege(prev_prv, prev_virt);