Browse Source

Implement elp state holding mechanism for mnstatus

pull/1901/head
Binno 2 years ago
parent
commit
c1d797abdc
  1. 1
      riscv/csrs.cc
  2. 6
      riscv/insns/mnret.h

1
riscv/csrs.cc

@ -585,6 +585,7 @@ bool mnstatus_csr_t::unlogged_write(const reg_t val) noexcept {
// NMIE can be set but not cleared
const reg_t mask = (~read() & MNSTATUS_NMIE)
| (proc->extension_enabled('H') ? MNSTATUS_MNPV : 0)
| (proc->extension_enabled(EXT_ZICFILP) ? MNSTATUS_MNPELP : 0)
| MNSTATUS_MNPP;
const reg_t requested_mnpp = proc->legalize_privilege(get_field(val, MNSTATUS_MNPP));

6
riscv/insns/mnret.h

@ -10,5 +10,11 @@ if (prev_prv != PRV_M) {
STATE.mstatus->write(mstatus);
}
s = set_field(s, MNSTATUS_NMIE, 1);
if (ZICFILP_xLPE(prev_virt, prev_prv)) {
STATE.elp = static_cast<elp_t>(get_field(s, MNSTATUS_MNPELP));
}
if (p->extension_enabled(EXT_ZICFILP)) {
s = set_field(s, MNSTATUS_MNPELP, elp_t::NO_LP_EXPECTED);
}
STATE.mnstatus->write(s);
p->set_privilege(prev_prv, prev_virt);

Loading…
Cancel
Save