@@ -251,9 +251,9 @@ typedef struct {
251
251
/* This target was selected using hasel. */
252
252
bool selected ;
253
253
254
- /* When false, we need to set dcsr.ebreak* , halting the target if that's
254
+ /* When false, we need to set dcsr config , halting the target if that's
255
255
* necessary. */
256
- bool dcsr_ebreak_is_set ;
256
+ bool dcsr_config_is_set ;
257
257
258
258
/* This hart was placed into a halt group in examine(). */
259
259
bool haltgroup_supported ;
@@ -1674,7 +1674,7 @@ static int wait_for_authbusy(struct target *target, uint32_t *dmstatus)
1674
1674
return ERROR_OK ;
1675
1675
}
1676
1676
1677
- static int set_dcsr_ebreak (struct target * target , bool step )
1677
+ static int set_dcsr_config (struct target * target , bool step )
1678
1678
{
1679
1679
LOG_TARGET_DEBUG (target , "Set dcsr.ebreak*" );
1680
1680
@@ -1694,14 +1694,15 @@ static int set_dcsr_ebreak(struct target *target, bool step)
1694
1694
dcsr = set_field (dcsr , CSR_DCSR_EBREAKU , config -> dcsr_ebreak_fields [RISCV_MODE_U ]);
1695
1695
dcsr = set_field (dcsr , CSR_DCSR_EBREAKVS , config -> dcsr_ebreak_fields [RISCV_MODE_VS ]);
1696
1696
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 );
1697
1698
if (dcsr != original_dcsr &&
1698
1699
riscv_reg_set (target , GDB_REGNO_DCSR , dcsr ) != ERROR_OK )
1699
1700
return ERROR_FAIL ;
1700
- info -> dcsr_ebreak_is_set = true;
1701
+ info -> dcsr_config_is_set = true;
1701
1702
return ERROR_OK ;
1702
1703
}
1703
1704
1704
- static int halt_set_dcsr_ebreak (struct target * target )
1705
+ static int halt_set_dcsr_config (struct target * target )
1705
1706
{
1706
1707
RISCV_INFO (r );
1707
1708
RISCV013_INFO (info );
@@ -1743,7 +1744,7 @@ static int halt_set_dcsr_ebreak(struct target *target)
1743
1744
1744
1745
r -> prepped = true;
1745
1746
if (riscv013_halt_go (target ) != ERROR_OK ||
1746
- set_dcsr_ebreak (target , false) != ERROR_OK ||
1747
+ set_dcsr_config (target , false) != ERROR_OK ||
1747
1748
riscv013_step_or_resume_current_hart (target , false) != ERROR_OK ) {
1748
1749
result = ERROR_FAIL ;
1749
1750
} else {
@@ -2132,7 +2133,7 @@ static int examine(struct target *target)
2132
2133
if (result != ERROR_OK )
2133
2134
return result ;
2134
2135
2135
- if (set_dcsr_ebreak (target , false) != ERROR_OK )
2136
+ if (set_dcsr_config (target , false) != ERROR_OK )
2136
2137
return ERROR_FAIL ;
2137
2138
2138
2139
if (state_at_examine_start == RISCV_STATE_RUNNING ) {
@@ -2779,7 +2780,7 @@ static int riscv013_get_hart_state(struct target *target, enum riscv_hart_state
2779
2780
return ERROR_FAIL ;
2780
2781
if (get_field (dmstatus , DM_DMSTATUS_ANYHAVERESET )) {
2781
2782
LOG_TARGET_INFO (target , "Hart unexpectedly reset!" );
2782
- info -> dcsr_ebreak_is_set = false;
2783
+ info -> dcsr_config_is_set = false;
2783
2784
/* TODO: Can we make this more obvious to eg. a gdb user? */
2784
2785
uint32_t dmcontrol = DM_DMCONTROL_DMACTIVE |
2785
2786
DM_DMCONTROL_ACKHAVERESET ;
@@ -2830,17 +2831,17 @@ static int handle_became_unavailable(struct target *target,
2830
2831
2831
2832
riscv_reg_cache_invalidate_all (target );
2832
2833
2833
- info -> dcsr_ebreak_is_set = false;
2834
+ info -> dcsr_config_is_set = false;
2834
2835
return ERROR_OK ;
2835
2836
}
2836
2837
2837
2838
static int tick (struct target * target )
2838
2839
{
2839
2840
RISCV013_INFO (info );
2840
- if (!info -> dcsr_ebreak_is_set &&
2841
+ if (!info -> dcsr_config_is_set &&
2841
2842
target -> state == TARGET_RUNNING &&
2842
2843
target_was_examined (target ))
2843
- return halt_set_dcsr_ebreak (target );
2844
+ return halt_set_dcsr_config (target );
2844
2845
return ERROR_OK ;
2845
2846
}
2846
2847
@@ -2939,13 +2940,13 @@ static int assert_reset(struct target *target)
2939
2940
return riscv013_invalidate_cached_progbuf (target );
2940
2941
}
2941
2942
2942
- static bool dcsr_ebreak_config_equals_reset_value (const struct target * target )
2943
+ static bool dcsr_config_equals_reset_value (const struct target * target )
2943
2944
{
2944
2945
const struct riscv_private_config * const config = riscv_private_config (target );
2945
2946
for (int i = 0 ; i < N_RISCV_MODE ; ++ i )
2946
2947
if (config -> dcsr_ebreak_fields [i ])
2947
2948
return false;
2948
- return true ;
2949
+ return ! config -> dcsr_cetrig ;
2949
2950
}
2950
2951
2951
2952
static int deassert_reset (struct target * target )
@@ -3023,7 +3024,7 @@ static int deassert_reset(struct target *target)
3023
3024
target -> state = TARGET_RUNNING ;
3024
3025
target -> debug_reason = DBG_REASON_NOTHALTED ;
3025
3026
}
3026
- info -> dcsr_ebreak_is_set = dcsr_ebreak_config_equals_reset_value (target );
3027
+ info -> dcsr_config_is_set = dcsr_config_equals_reset_value (target );
3027
3028
return ERROR_OK ;
3028
3029
}
3029
3030
@@ -5367,6 +5368,14 @@ static enum riscv_halt_reason riscv013_halt_reason(struct target *target)
5367
5368
return RISCV_HALT_INTERRUPT ;
5368
5369
case CSR_DCSR_CAUSE_GROUP :
5369
5370
return RISCV_HALT_GROUP ;
5371
+ case CSR_DCSR_CAUSE_OTHER :
5372
+ if (get_field (dcsr , CSR_DCSR_EXTCAUSE ) == 0 ) {
5373
+ LOG_TARGET_INFO (target , "halted because of hart in a critical error state." );
5374
+ return RISCV_HALT_CRITERR ;
5375
+ }
5376
+ LOG_TARGET_ERROR (target , "Unknown DCSR extcause field: 0x%"
5377
+ PRIx64 , get_field (dcsr , CSR_DCSR_EXTCAUSE ));
5378
+ return RISCV_HALT_UNKNOWN ;
5370
5379
}
5371
5380
5372
5381
LOG_TARGET_ERROR (target , "Unknown DCSR cause field: 0x%" PRIx64 , get_field (dcsr , CSR_DCSR_CAUSE ));
@@ -5462,7 +5471,7 @@ static int riscv013_on_step_or_resume(struct target *target, bool step)
5462
5471
if (execute_autofence (target ) != ERROR_OK )
5463
5472
return ERROR_FAIL ;
5464
5473
5465
- if (set_dcsr_ebreak (target , step ) != ERROR_OK )
5474
+ if (set_dcsr_config (target , step ) != ERROR_OK )
5466
5475
return ERROR_FAIL ;
5467
5476
5468
5477
if (riscv_reg_flush_all (target ) != ERROR_OK )
0 commit comments