aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorKirill Radkin <kirill.radkin@syntacore.com>2023-10-18 19:13:25 +0300
committerAntonio Borneo <borneo.antonio@gmail.com>2023-11-18 11:19:45 +0000
commit7c60f6593edd692cff90b8486412a9b8adba28d2 (patch)
tree494a2d65883763d6931540ebb5157b03a765e22e /src
parentf8096ce68724d15d0ef9a7edfd6d2aaa0f83a6e5 (diff)
downloadriscv-openocd-7c60f6593edd692cff90b8486412a9b8adba28d2.zip
riscv-openocd-7c60f6593edd692cff90b8486412a9b8adba28d2.tar.gz
riscv-openocd-7c60f6593edd692cff90b8486412a9b8adba28d2.tar.bz2
breakpoints: Fix endless loop in bp/wp_clear_target
If we can't remove bp/wp, we will stuck in endless loop Change-Id: I44c0a164db1d15c0a0637d33c75087a49cf5c0f4 Signed-off-by: Kirill Radkin <kirill.radkin@syntacore.com> Reviewed-on: https://review.openocd.org/c/openocd/+/7940 Tested-by: jenkins Reviewed-by: Anatoly P <kupokupokupopo@gmail.com> Reviewed-by: Tim Newsome <tim@sifive.com> Reviewed-by: Jan Matyas <jan.matyas@codasip.com> Reviewed-by: Antonio Borneo <borneo.antonio@gmail.com>
Diffstat (limited to 'src')
-rw-r--r--src/target/breakpoints.c35
1 files changed, 12 insertions, 23 deletions
diff --git a/src/target/breakpoints.c b/src/target/breakpoints.c
index d9c12f5..d4662c4 100644
--- a/src/target/breakpoints.c
+++ b/src/target/breakpoints.c
@@ -326,6 +326,8 @@ static int breakpoint_remove_internal(struct target *target, target_addr_t addre
static int breakpoint_remove_all_internal(struct target *target)
{
+ LOG_TARGET_DEBUG(target, "Delete all breakpoints");
+
struct breakpoint *breakpoint = target->breakpoints;
int retval = ERROR_OK;
@@ -464,22 +466,6 @@ int watchpoint_remove_all(struct target *target)
return breakpoint_watchpoint_remove_all(target, WATCHPOINT);
}
-static int breakpoint_clear_target_internal(struct target *target)
-{
- LOG_DEBUG("Delete all breakpoints for target: %s",
- target_name(target));
-
- int retval = ERROR_OK;
-
- while (target->breakpoints) {
- int status = breakpoint_free(target, target->breakpoints);
- if (status != ERROR_OK)
- retval = status;
- }
-
- return retval;
-}
-
int breakpoint_clear_target(struct target *target)
{
int retval = ERROR_OK;
@@ -489,13 +475,13 @@ int breakpoint_clear_target(struct target *target)
foreach_smp_target(head, target->smp_targets) {
struct target *curr = head->target;
- int status = breakpoint_clear_target_internal(curr);
+ int status = breakpoint_remove_all_internal(curr);
if (status != ERROR_OK)
retval = status;
}
} else {
- retval = breakpoint_clear_target_internal(target);
+ retval = breakpoint_remove_all_internal(target);
}
return retval;
@@ -659,16 +645,19 @@ int watchpoint_remove(struct target *target, target_addr_t address)
int watchpoint_clear_target(struct target *target)
{
- int retval = ERROR_OK;
-
LOG_DEBUG("Delete all watchpoints for target: %s",
target_name(target));
- while (target->watchpoints) {
- int status = watchpoint_free(target, target->watchpoints);
+
+ struct watchpoint *watchpoint = target->watchpoints;
+ int retval = ERROR_OK;
+
+ while (watchpoint) {
+ struct watchpoint *tmp = watchpoint;
+ watchpoint = watchpoint->next;
+ int status = watchpoint_free(target, tmp);
if (status != ERROR_OK)
retval = status;
}
-
return retval;
}