@@ -251,9 +251,9 @@ typedef struct {
251251 /* This target was selected using hasel. */
252252 bool selected ;
253253
254- /* When false, we need to set dcsr.ebreak*, halting the target if that's
255- * necessary. */
256- bool dcsr_ebreak_is_set ;
254+ /* When false, we need to configure certain bits in the dcsr register.
255+ * To do that, we may momentarily halt the target, if necessary. */
256+ bool dcsr_register_is_set ;
257257
258258 /* This hart was placed into a halt group in examine(). */
259259 bool haltgroup_supported ;
@@ -1674,9 +1674,9 @@ static int wait_for_authbusy(struct target *target, uint32_t *dmstatus)
16741674 return ERROR_OK ;
16751675}
16761676
1677- static int set_dcsr_ebreak (struct target * target , bool step )
1677+ static int set_dcsr_config (struct target * target , bool step )
16781678{
1679- LOG_TARGET_DEBUG (target , "Set dcsr.ebreak* " );
1679+ LOG_TARGET_DEBUG (target , "Set dcsr config " );
16801680
16811681 if (dm013_select_target (target ) != ERROR_OK )
16821682 return ERROR_FAIL ;
@@ -1694,18 +1694,20 @@ static int set_dcsr_ebreak(struct target *target, bool step)
16941694 dcsr = set_field (dcsr , CSR_DCSR_EBREAKU , config -> dcsr_ebreak_fields [RISCV_MODE_U ]);
16951695 dcsr = set_field (dcsr , CSR_DCSR_EBREAKVS , config -> dcsr_ebreak_fields [RISCV_MODE_VS ]);
16961696 dcsr = set_field (dcsr , CSR_DCSR_EBREAKVU , config -> dcsr_ebreak_fields [RISCV_MODE_VU ]);
1697+ dcsr = set_field (dcsr , CSR_DCSR_CETRIG , config -> dcsr_cetrig );
16971698 if (dcsr != original_dcsr &&
16981699 riscv_reg_set (target , GDB_REGNO_DCSR , dcsr ) != ERROR_OK )
16991700 return ERROR_FAIL ;
1700- info -> dcsr_ebreak_is_set = true;
1701+ // TODO: Read back the DCSR and check if these WARL bits are set as the user intended.
1702+ info -> dcsr_register_is_set = true;
17011703 return ERROR_OK ;
17021704}
17031705
1704- static int halt_set_dcsr_ebreak (struct target * target )
1706+ static int halt_set_dcsr_config (struct target * target )
17051707{
17061708 RISCV_INFO (r );
17071709 RISCV013_INFO (info );
1708- LOG_TARGET_DEBUG (target , "Halt to set DCSR.ebreak* " );
1710+ LOG_TARGET_DEBUG (target , "Halt to set dcsr config " );
17091711
17101712 /* Remove this hart from the halt group. This won't work on all targets
17111713 * because the debug spec allows halt groups to be hard-coded, but I
@@ -1743,7 +1745,7 @@ static int halt_set_dcsr_ebreak(struct target *target)
17431745
17441746 r -> prepped = true;
17451747 if (riscv013_halt_go (target ) != ERROR_OK ||
1746- set_dcsr_ebreak (target , false) != ERROR_OK ||
1748+ set_dcsr_config (target , false) != ERROR_OK ||
17471749 riscv013_step_or_resume_current_hart (target , false) != ERROR_OK ) {
17481750 result = ERROR_FAIL ;
17491751 } else {
@@ -2132,7 +2134,7 @@ static int examine(struct target *target)
21322134 if (result != ERROR_OK )
21332135 return result ;
21342136
2135- if (set_dcsr_ebreak (target , false) != ERROR_OK )
2137+ if (set_dcsr_config (target , false) != ERROR_OK )
21362138 return ERROR_FAIL ;
21372139
21382140 if (state_at_examine_start == RISCV_STATE_RUNNING ) {
@@ -2779,7 +2781,7 @@ static int riscv013_get_hart_state(struct target *target, enum riscv_hart_state
27792781 return ERROR_FAIL ;
27802782 if (get_field (dmstatus , DM_DMSTATUS_ANYHAVERESET )) {
27812783 LOG_TARGET_INFO (target , "Hart unexpectedly reset!" );
2782- info -> dcsr_ebreak_is_set = false;
2784+ info -> dcsr_register_is_set = false;
27832785 /* TODO: Can we make this more obvious to eg. a gdb user? */
27842786 uint32_t dmcontrol = DM_DMCONTROL_DMACTIVE |
27852787 DM_DMCONTROL_ACKHAVERESET ;
@@ -2830,17 +2832,17 @@ static int handle_became_unavailable(struct target *target,
28302832
28312833 riscv_reg_cache_invalidate_all (target );
28322834
2833- info -> dcsr_ebreak_is_set = false;
2835+ info -> dcsr_register_is_set = false;
28342836 return ERROR_OK ;
28352837}
28362838
28372839static int tick (struct target * target )
28382840{
28392841 RISCV013_INFO (info );
2840- if (!info -> dcsr_ebreak_is_set &&
2842+ if (!info -> dcsr_register_is_set &&
28412843 target -> state == TARGET_RUNNING &&
28422844 target_was_examined (target ))
2843- return halt_set_dcsr_ebreak (target );
2845+ return halt_set_dcsr_config (target );
28442846 return ERROR_OK ;
28452847}
28462848
@@ -2939,13 +2941,13 @@ static int assert_reset(struct target *target)
29392941 return riscv013_invalidate_cached_progbuf (target );
29402942}
29412943
2942- static bool dcsr_ebreak_config_equals_reset_value (const struct target * target )
2944+ static bool dcsr_config_equals_reset_value (const struct target * target )
29432945{
29442946 const struct riscv_private_config * const config = riscv_private_config (target );
29452947 for (int i = 0 ; i < N_RISCV_MODE ; ++ i )
29462948 if (config -> dcsr_ebreak_fields [i ])
29472949 return false;
2948- return true ;
2950+ return ! config -> dcsr_cetrig ;
29492951}
29502952
29512953static int deassert_reset (struct target * target )
@@ -3023,7 +3025,7 @@ static int deassert_reset(struct target *target)
30233025 target -> state = TARGET_RUNNING ;
30243026 target -> debug_reason = DBG_REASON_NOTHALTED ;
30253027 }
3026- info -> dcsr_ebreak_is_set = dcsr_ebreak_config_equals_reset_value (target );
3028+ info -> dcsr_register_is_set = dcsr_config_equals_reset_value (target );
30273029 return ERROR_OK ;
30283030}
30293031
@@ -5367,6 +5369,16 @@ static enum riscv_halt_reason riscv013_halt_reason(struct target *target)
53675369 return RISCV_HALT_INTERRUPT ;
53685370 case CSR_DCSR_CAUSE_GROUP :
53695371 return RISCV_HALT_GROUP ;
5372+ case CSR_DCSR_CAUSE_OTHER :
5373+ switch (get_field (dcsr , CSR_DCSR_EXTCAUSE )) {
5374+ case 0 :
5375+ LOG_TARGET_WARNING (target , "halted because of hart in a critical error state." );
5376+ return RISCV_HALT_CRITICAL_ERROR ;
5377+ default :
5378+ LOG_TARGET_ERROR (target , "Unknown DCSR extcause field: 0x%"
5379+ PRIx64 , get_field (dcsr , CSR_DCSR_EXTCAUSE ));
5380+ return RISCV_HALT_UNKNOWN ;
5381+ }
53705382 }
53715383
53725384 LOG_TARGET_ERROR (target , "Unknown DCSR cause field: 0x%" PRIx64 , get_field (dcsr , CSR_DCSR_CAUSE ));
@@ -5462,7 +5474,7 @@ static int riscv013_on_step_or_resume(struct target *target, bool step)
54625474 if (execute_autofence (target ) != ERROR_OK )
54635475 return ERROR_FAIL ;
54645476
5465- if (set_dcsr_ebreak (target , step ) != ERROR_OK )
5477+ if (set_dcsr_config (target , step ) != ERROR_OK )
54665478 return ERROR_FAIL ;
54675479
54685480 if (riscv_reg_flush_all (target ) != ERROR_OK )
0 commit comments