mret

Machine-mode Return from Trap

This instruction is defined by:

Encoding

svg

Synopsis

Return from machine mode after handling a trap.

Access

M HS U VS VU

Always

Never

Never

Never

Never

Decode Variables

Execution

  • Pruned, XLEN == 64

  • Original

if (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 = 2'b00;
$pc = $bits(CSR[CSR[mepc]]);
if (CSR[mstatus].MPP != 2'b11) {
  CSR[mstatus].MPRV = 0;
}
if (implemented?(ExtensionName::Smdbltrp)) {
  if (xlen() == 64) {
    CSR[mstatus].MDT = 1'b0;
  } else {
    CSR[mstatush].MDT = 1'b0;
  }
}
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[CSR[mepc]]);