mret

Machine Exception Return

This instruction is defined by:

Encoding

svg

Synopsis

Returns from an exception in M-mode.

Access

M

HS

U

VS

VU

Always

Never

Never

Never

Never

Decode Variables

Execution

  • Pruned, XLEN == 64

  • Original

if (%%LINK%csr_field;mstatus.MPP;CSR[mstatus].MPP%% != 2'b11) {
  %%LINK%csr_field;mstatus.MPRV;CSR[mstatus].MPRV%% = 0;
}

%%LINK%csr_field;mstatus.MIE;CSR[mstatus].MIE%% = %%LINK%csr_field;mstatus.MPIE;CSR[mstatus].MPIE%%;
%%LINK%csr_field;mstatus.MPIE;CSR[mstatus].MPIE%% = 1;
if (%%LINK%csr_field;mstatus.MPP;CSR[mstatus].MPP%% == 2'b00) {
  %%LINK%func;set_mode;set_mode%%(PrivilegeMode::U);
} else if (%%LINK%csr_field;mstatus.MPP;CSR[mstatus].MPP%% == 2'b01) {
  %%LINK%func;set_mode;set_mode%%(PrivilegeMode::S);
} else if (%%LINK%csr_field;mstatus.MPP;CSR[mstatus].MPP%% == 2'b11) {
  %%LINK%func;set_mode;set_mode%%(PrivilegeMode::M);
}
%%LINK%csr_field;mstatus.MPP;CSR[mstatus].MPP%% = 2'b00;
$pc = $bits(CSR[mepc]);
if (%%LINK%csr_field;mstatus.MPP;CSR[mstatus].MPP%% != 2'b11) {
  %%LINK%csr_field;mstatus.MPRV;CSR[mstatus].MPRV%% = 0;
}
if (%%LINK%func;implemented?;implemented?%%(ExtensionName::Smdbltrp)) {
  if (%%LINK%func;xlen;xlen%%() == 64) {
    %%LINK%csr_field;mstatus.MDT;CSR[mstatus].MDT%% = 1'b0;
  } else {
    %%LINK%csr_field;mstatush.MDT;CSR[mstatush].MDT%% = 1'b0;
  }
}
%%LINK%csr_field;mstatus.MIE;CSR[mstatus].MIE%% = %%LINK%csr_field;mstatus.MPIE;CSR[mstatus].MPIE%%;
%%LINK%csr_field;mstatus.MPIE;CSR[mstatus].MPIE%% = 1;
if (%%LINK%csr_field;mstatus.MPP;CSR[mstatus].MPP%% == 2'b00) {
  %%LINK%func;set_mode;set_mode%%(PrivilegeMode::U);
} else if (%%LINK%csr_field;mstatus.MPP;CSR[mstatus].MPP%% == 2'b01) {
  %%LINK%func;set_mode;set_mode%%(PrivilegeMode::S);
} else if (%%LINK%csr_field;mstatus.MPP;CSR[mstatus].MPP%% == 2'b11) {
  %%LINK%func;set_mode;set_mode%%(PrivilegeMode::M);
}
%%LINK%csr_field;mstatus.MPP;CSR[mstatus].MPP%% = %%LINK%func;implemented?;implemented?%%(ExtensionName::U) ? 2'b00 : 2'b11;
$pc = $bits(CSR[mepc]);