diff options
author | Andrew Waterman <andrew@sifive.com> | 2023-05-24 14:07:14 -0700 |
---|---|---|
committer | Andrew Waterman <andrew@sifive.com> | 2023-05-25 14:35:43 -0700 |
commit | 2c6b94e853cc1ee0c51a46859cf92451c0c19491 (patch) | |
tree | 7e324eb00527f04dcf7c74e0b93f97bd6011063c /riscv/insns | |
parent | 0abf98f6f6d5b23b3d23f0c1af0b77b95a199bfe (diff) | |
download | riscv-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.h | 3 | ||||
-rw-r--r-- | riscv/insns/mnret.h | 3 | ||||
-rw-r--r-- | riscv/insns/mret.h | 3 | ||||
-rw-r--r-- | riscv/insns/sret.h | 3 |
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); |