aboutsummaryrefslogtreecommitdiff
path: root/riscv/insns
diff options
context:
space:
mode:
authorAndrew Waterman <andrew@sifive.com>2024-08-18 18:43:57 -0500
committerGitHub <noreply@github.com>2024-08-18 18:43:57 -0500
commitf09b02460ee17f8d09c84d2752dc006e32700223 (patch)
treec692e3e436569b7bbd6d8721732eef67c049203d /riscv/insns
parent33d80b40d68f7c5c7dd0ea4f6f54ab83848db8da (diff)
parentc302e8bd16f5c05faff4e2ecfdeebcb502a55578 (diff)
downloadriscv-isa-sim-master.zip
riscv-isa-sim-master.tar.gz
riscv-isa-sim-master.tar.bz2
Merge pull request #1722 from ved-rivos/smdbltrpHEADmaster
Add Smdbltrp
Diffstat (limited to 'riscv/insns')
-rw-r--r--riscv/insns/dret.h10
-rw-r--r--riscv/insns/mret.h1
-rw-r--r--riscv/insns/sret.h9
3 files changed, 19 insertions, 1 deletions
diff --git a/riscv/insns/dret.h b/riscv/insns/dret.h
index 60aaf21..0f94f88 100644
--- a/riscv/insns/dret.h
+++ b/riscv/insns/dret.h
@@ -4,8 +4,16 @@ if (ZICFILP_xLPE(STATE.dcsr->v, STATE.dcsr->prv)) {
STATE.elp = STATE.dcsr->pelp;
}
p->set_privilege(STATE.dcsr->prv, STATE.dcsr->v);
-if (STATE.prv < PRV_M)
+if (STATE.prv < PRV_M) {
STATE.mstatus->write(STATE.mstatus->read() & ~MSTATUS_MPRV);
+ STATE.mstatus->write(STATE.mstatus->read() & ~MSTATUS_MDT);
+}
+
+if (STATE.dcsr->prv == PRV_U || STATE.dcsr->v)
+ STATE.mstatus->write(STATE.mstatus->read() & ~MSTATUS_SDT);
+
+if (STATE.dcsr->v && STATE.dcsr->prv == PRV_U)
+ STATE.vsstatus->write(STATE.vsstatus->read() & ~SSTATUS_SDT);
if (STATE.dcsr->prv == PRV_U || STATE.dcsr->v)
STATE.mstatus->write(STATE.mstatus->read() & ~MSTATUS_SDT);
diff --git a/riscv/insns/mret.h b/riscv/insns/mret.h
index 140ebde..4172b75 100644
--- a/riscv/insns/mret.h
+++ b/riscv/insns/mret.h
@@ -13,6 +13,7 @@ if (ZICFILP_xLPE(prev_virt, prev_prv)) {
STATE.elp = static_cast<elp_t>(get_field(s, MSTATUS_MPELP));
}
s = set_field(s, MSTATUS_MPELP, elp_t::NO_LP_EXPECTED);
+s = set_field(s, MSTATUS_MDT, 0);
if (prev_prv == PRV_U || prev_virt)
s = set_field(s, MSTATUS_SDT, 0);
if (prev_virt && prev_prv == PRV_U)
diff --git a/riscv/insns/sret.h b/riscv/insns/sret.h
index fe007d3..efb4fa6 100644
--- a/riscv/insns/sret.h
+++ b/riscv/insns/sret.h
@@ -26,6 +26,15 @@ if (!STATE.v) {
if (ZICFILP_xLPE(prev_virt, prev_prv)) {
STATE.elp = static_cast<elp_t>(get_field(s, SSTATUS_SPELP));
}
+
+if (STATE.prv == PRV_M) {
+ STATE.mstatus->write(STATE.mstatus->read() & ~MSTATUS_MDT);
+ if (prev_prv == PRV_U || prev_virt)
+ STATE.mstatus->write(STATE.mstatus->read() & ~MSTATUS_SDT);
+ if (prev_virt && prev_prv == PRV_U)
+ STATE.vsstatus->write(STATE.vsstatus->read() & ~SSTATUS_SDT);
+}
+
s = set_field(s, SSTATUS_SPELP, elp_t::NO_LP_EXPECTED);
if (STATE.prv == PRV_S) {