@@ -823,8 +823,10 @@ const char* processor_t::get_privilege_string()
823823
824824void processor_t::enter_debug_mode (uint8_t cause)
825825{
826+ const bool has_zicfilp = extension_enabled (EXT_ZICFILP);
826827 state.debug_mode = true ;
827- state.dcsr ->write_cause_and_prv (cause, state.prv , state.v );
828+ state.dcsr ->update_fields (cause, state.prv , state.v , state.elp );
829+ state.elp = elp_t ::NO_LP_EXPECTED;
828830 set_privilege (PRV_M, false );
829831 state.dpc ->write (state.pc );
830832 state.pc = DEBUG_ROM_ENTRY;
@@ -893,6 +895,8 @@ void processor_t::take_trap(trap_t& t, reg_t epc)
893895 s = set_field (s, MSTATUS_SPIE, get_field (s, MSTATUS_SIE));
894896 s = set_field (s, MSTATUS_SPP, state.prv );
895897 s = set_field (s, MSTATUS_SIE, 0 );
898+ s = set_field (s, MSTATUS_SPELP, state.elp );
899+ state.elp = elp_t ::NO_LP_EXPECTED;
896900 state.sstatus ->write (s);
897901 set_privilege (PRV_S, true );
898902 } else if (state.prv <= PRV_S && bit < max_xlen && ((hsdeleg >> bit) & 1 )) {
@@ -909,6 +913,8 @@ void processor_t::take_trap(trap_t& t, reg_t epc)
909913 s = set_field (s, MSTATUS_SPIE, get_field (s, MSTATUS_SIE));
910914 s = set_field (s, MSTATUS_SPP, state.prv );
911915 s = set_field (s, MSTATUS_SIE, 0 );
916+ s = set_field (s, MSTATUS_SPELP, state.elp );
917+ state.elp = elp_t ::NO_LP_EXPECTED;
912918 state.nonvirtual_sstatus ->write (s);
913919 if (extension_enabled (' H' )) {
914920 s = state.hstatus ->read ();
@@ -940,6 +946,8 @@ void processor_t::take_trap(trap_t& t, reg_t epc)
940946 s = set_field (s, MSTATUS_MIE, 0 );
941947 s = set_field (s, MSTATUS_MPV, curr_virt);
942948 s = set_field (s, MSTATUS_GVA, t.has_gva ());
949+ s = set_field (s, MSTATUS_MPELP, state.elp );
950+ state.elp = elp_t ::NO_LP_EXPECTED;
943951 state.mstatus ->write (s);
944952 if (state.mstatush ) state.mstatush ->write (s >> 32 ); // log mstatush change
945953 set_privilege (PRV_M, false );
0 commit comments