Browse Source

Fix SRET clearing MPRV

Attempting to clear MPRV via sstatus is fruitless.  Use mstatus instead.
pull/815/head
Andrew Waterman 5 years ago
parent
commit
12131ba08c
  1. 4
      riscv/insns/sret.h

4
riscv/insns/sret.h

@ -8,14 +8,14 @@ if (STATE.v) {
}
reg_t next_pc = p->get_state()->sepc->read();
set_pc_and_serialize(next_pc);
reg_t s = STATE.sstatus->read();
reg_t s = STATE.mstatus->read();
reg_t prev_prv = get_field(s, MSTATUS_SPP);
if (prev_prv != PRV_M)
s = set_field(s, MSTATUS_MPRV, 0);
s = set_field(s, MSTATUS_SIE, get_field(s, MSTATUS_SPIE));
s = set_field(s, MSTATUS_SPIE, 1);
s = set_field(s, MSTATUS_SPP, PRV_U);
STATE.sstatus->write(s);
STATE.mstatus->write(s);
p->set_privilege(prev_prv);
if (!STATE.v) {
reg_t prev_virt = get_field(prev_hstatus, HSTATUS_SPV);

Loading…
Cancel
Save