@@ -91,21 +91,41 @@ static int esp_xtensa_dbgstubs_restore(struct target *target)
9191 return ERROR_OK ;
9292}
9393
94- static int esp_xtensa_on_exit (struct target * target , void * priv )
94+ int esp_xtensa_special_breakpoints_clear (struct target * target )
9595{
96- if (target != priv )
97- return ERROR_OK ;
96+ struct esp_xtensa_common * esp_xtensa = target_to_esp_xtensa (target );
9897
99- LOG_DEBUG ("start" );
100- int ret = esp_xtensa_dbgstubs_restore (target );
101- if (ret != ERROR_OK )
102- return ret ;
98+ for (size_t slot = 0 ; slot < ESP_XTENSA_SPECIAL_BREAKPOINTS_MAX_NUM ;
99+ slot ++ ) {
100+ struct esp_xtensa_special_breakpoint * spec_bp =
101+ & esp_xtensa -> spec_brps [slot ];
102+ if (spec_bp -> data .oocd_bp != NULL ) {
103+ int ret = esp_xtensa -> spec_brps_ops .breakpoint_remove (
104+ target ,
105+ spec_bp );
106+ if (ret != ERROR_OK ) {
107+ LOG_ERROR (
108+ "%s: Failed to remove SW flash BP @ "
109+ TARGET_ADDR_FMT " (%d)!" ,
110+ target_name (target ),
111+ spec_bp -> data .oocd_bp -> address ,
112+ ret );
113+ return ret ;
114+ }
115+ }
116+ }
117+ memset (esp_xtensa -> spec_brps ,
118+ 0 ,
119+ ESP_XTENSA_SPECIAL_BREAKPOINTS_MAX_NUM *
120+ sizeof (struct esp_xtensa_special_breakpoint ));
103121 return ERROR_OK ;
104122}
105123
106124static int esp_xtensa_handle_target_event (struct target * target , enum target_event event ,
107125 void * priv )
108126{
127+ int ret ;
128+
109129 if (target != priv )
110130 return ERROR_OK ;
111131
@@ -120,7 +140,7 @@ static int esp_xtensa_handle_target_event(struct target *target, enum target_eve
120140 {
121141 enum target_state old_state = target -> state ;
122142 if (target -> state != TARGET_HALTED ) {
123- int ret = target_halt (target );
143+ ret = target_halt (target );
124144 if (ret != ERROR_OK ) {
125145 LOG_ERROR (
126146 "%s: Failed to halt target to remove flash BPs (%d)!" ,
@@ -137,32 +157,11 @@ static int esp_xtensa_handle_target_event(struct target *target, enum target_eve
137157 return ret ;
138158 }
139159 }
140- struct esp_xtensa_common * esp_xtensa = target_to_esp_xtensa (target );
141- for (size_t slot = 0 ; slot < ESP_XTENSA_SPECIAL_BREAKPOINTS_MAX_NUM ;
142- slot ++ ) {
143- struct esp_xtensa_special_breakpoint * spec_bp =
144- & esp_xtensa -> spec_brps [slot ];
145- if (spec_bp -> data .oocd_bp != NULL ) {
146- int ret = esp_xtensa -> spec_brps_ops .breakpoint_remove (
147- target ,
148- spec_bp );
149- if (ret != ERROR_OK ) {
150- LOG_ERROR (
151- "%s: Failed to remove SW flash BP @ "
152- TARGET_ADDR_FMT " (%d)!" ,
153- target_name (target ),
154- spec_bp -> data .oocd_bp -> address ,
155- ret );
156- return ret ;
157- }
158- }
159- }
160- memset (esp_xtensa -> spec_brps ,
161- 0 ,
162- ESP_XTENSA_SPECIAL_BREAKPOINTS_MAX_NUM *
163- sizeof (struct esp_xtensa_special_breakpoint ));
160+ ret = esp_xtensa_special_breakpoints_clear (target );
161+ if (ret != ERROR_OK )
162+ return ret ;
164163 if (old_state == TARGET_RUNNING ) {
165- int ret = target_resume (target , 1 , 0 , 1 , 0 );
164+ ret = target_resume (target , 1 , 0 , 1 , 0 );
166165 if (ret != ERROR_OK ) {
167166 LOG_ERROR (
168167 "%s: Failed to resume target after flash BPs removal (%d)!" ,
@@ -188,10 +187,7 @@ int esp_xtensa_init_arch_info(struct target *target, struct target *chip_target,
188187{
189188 struct esp_xtensa_common * esp_xtensa ;
190189
191- int ret = target_register_exit_callback (esp_xtensa_on_exit , NULL );
192- if (ret != ERROR_OK )
193- return ret ;
194- ret = target_register_event_callback (esp_xtensa_handle_target_event , target );
190+ int ret = target_register_event_callback (esp_xtensa_handle_target_event , target );
195191 if (ret != ERROR_OK )
196192 return ret ;
197193 if (target != chip_target ) {
@@ -234,6 +230,16 @@ int esp_xtensa_target_init(struct command_context *cmd_ctx, struct target *targe
234230 return ERROR_OK ;
235231}
236232
233+ void esp_xtensa_target_deinit (struct target * target )
234+ {
235+ LOG_DEBUG ("start" );
236+
237+ int ret = esp_xtensa_dbgstubs_restore (target );
238+ if (ret != ERROR_OK )
239+ return ;
240+ xtensa_deinit (target );
241+ }
242+
237243int esp_xtensa_arch_state (struct target * target )
238244{
239245 return ERROR_OK ;
0 commit comments