1711c1711,1712
< fault = make_shared<SyscallFault>();
---
> fault = make_shared<SyscallFault>(
> (PrivilegeMode)xc->readMiscReg(MISCREG_PRV));
1717,1720c1718,1754
< 0x100: eret({{
< fault = make_shared<UnimplementedFault>("eret",
< machInst);
< }}, No_OpClass);
---
> 0x2: uret({{
> STATUS status = xc->readMiscReg(MISCREG_STATUS);
> status.uie = status.upie;
> status.upie = 1;
> xc->setMiscReg(MISCREG_STATUS, status);
> NPC = xc->readMiscReg(MISCREG_UEPC);
> }}, IsReturn);
> 0x102: sret({{
> if (xc->readMiscReg(MISCREG_PRV) == PRV_U) {
> fault = make_shared<IllegalInstFault>(
> "sret in user mode", machInst);
> NPC = NPC;
> } else {
> STATUS status = xc->readMiscReg(MISCREG_STATUS);
> xc->setMiscReg(MISCREG_PRV, status.spp);
> status.sie = status.spie;
> status.spie = 1;
> status.spp = PRV_U;
> xc->setMiscReg(MISCREG_STATUS, status);
> NPC = xc->readMiscReg(MISCREG_SEPC);
> }
> }}, IsReturn);
> 0x302: mret({{
> if (xc->readMiscReg(MISCREG_PRV) != PRV_M) {
> fault = make_shared<IllegalInstFault>(
> "mret at lower privilege", machInst);
> NPC = NPC;
> } else {
> STATUS status = xc->readMiscReg(MISCREG_STATUS);
> xc->setMiscReg(MISCREG_PRV, status.mpp);
> status.mie = status.mpie;
> status.mpie = 1;
> status.mpp = PRV_U;
> xc->setMiscReg(MISCREG_STATUS, status);
> NPC = xc->readMiscReg(MISCREG_MEPC);
> }
> }}, IsReturn);