restore svstate on exit from trap (mret, sret)
authorLuke Kenneth Casson Leighton <lkcl@lkcl.net>
Thu, 27 Jun 2019 20:57:47 +0000 (21:57 +0100)
committerLuke Kenneth Casson Leighton <lkcl@lkcl.net>
Thu, 27 Jun 2019 20:57:47 +0000 (21:57 +0100)
riscv/insns/mret.h
riscv/insns/sret.h

index 96933cf67262567c2e5cdf39ea73a4f9836d57cc..2e2e81128ba5031da4c307e3c1cf73e8078757da 100644 (file)
@@ -1,9 +1,11 @@
 require_privilege(PRV_M);
 set_pc_and_serialize(p->get_state()->mepc);
 reg_t s = STATE.mstatus;
+reg_t svstate = STATE.mesvstate;
 reg_t prev_prv = get_field(s, MSTATUS_MPP);
 s = set_field(s, MSTATUS_MIE, get_field(s, MSTATUS_MPIE));
 s = set_field(s, MSTATUS_MPIE, 1);
 s = set_field(s, MSTATUS_MPP, PRV_U);
 p->set_privilege(prev_prv);
 p->set_csr(CSR_MSTATUS, s);
+p->set_csr(CSR_SV_STATE, svstate);
index ae841de93f19cc1111761e545780947f4d95fb41..0437bf9cb3d03275669892532829022dfdf0be8a 100644 (file)
@@ -1,9 +1,11 @@
 require_privilege(get_field(STATE.mstatus, MSTATUS_TSR) ? PRV_M : PRV_S);
 set_pc_and_serialize(p->get_state()->sepc);
 reg_t s = STATE.mstatus;
+reg_t svstate = STATE.sesvstate;
 reg_t prev_prv = get_field(s, MSTATUS_SPP);
 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);
 p->set_privilege(prev_prv);
 p->set_csr(CSR_MSTATUS, s);
+p->set_csr(CSR_SV_STATE, svstate);