return;
}
+ if (state.dcsr.cause) {
+ state.pc = DEBUG_ROM_EXCEPTION;
+ return;
+ }
+
// by default, trap to M-mode, unless delegated to S-mode
reg_t bit = t.cause();
reg_t deleg = state.medeleg;
set_csr(CSR_MSTATUS, s);
set_privilege(PRV_S);
} else {
- if (state.dcsr.cause) {
- state.pc = DEBUG_ROM_EXCEPTION;
- state.dpc = epc;
- } else {
- state.pc = state.mtvec;
- state.mepc = epc;
- }
+ state.pc = state.mtvec;
+ state.mepc = epc;
state.mcause = t.cause();
if (t.has_badaddr())
state.mbadaddr = t.get_badaddr();
case CSR_MCAUSE: state.mcause = val; break;
case CSR_MBADADDR: state.mbadaddr = val; break;
case CSR_DCSR:
- // TODO: Use get_field style
state.dcsr.prv = get_field(val, DCSR_PRV);
state.dcsr.step = get_field(val, DCSR_STEP);
// TODO: ndreset and fullreset