mret
Machine Exception Return
This instruction is defined by:
-
Sm, version >= 0
This instruction is included in the following profiles:
Execution
-
IDL
-
Sail
if (implemented?(ExtensionName::S) && CSR[mstatus].MPP != 2'b11) {
CSR[mstatus].MPRV = 0;
}
CSR[mstatus].MIE = CSR[mstatus].MPIE;
CSR[mstatus].MPIE = 1;
if (CSR[mstatus].MPP == 2'b00) {
set_mode(PrivilegeMode::U);
} else if (CSR[mstatus].MPP == 2'b01) {
set_mode(PrivilegeMode::S);
} else if (CSR[mstatus].MPP == 2'b11) {
set_mode(PrivilegeMode::M);
}
CSR[mstatus].MPP = implemented?(ExtensionName::U) ? 2'b00 : 2'b11;
$pc = $bits(CSR[mepc]);
{
if cur_privilege != Machine
then { handle_illegal(); RETIRE_FAIL }
else if not(ext_check_xret_priv (Machine))
then { ext_fail_xret_priv(); RETIRE_FAIL }
else {
set_next_pc(exception_handler(cur_privilege, CTL_MRET(), PC));
RETIRE_SUCCESS
}
}