This is an automated email from Gerrit.

"Kirill Radkin <kirill.rad...@syntacore.com>" just uploaded a new patch set to 
Gerrit, which you can find at https://review.openocd.org/c/openocd/+/7834

-- gerrit

commit c33ff64e60c339318dce71460a2ecfd109d5db52
Author: Kirill Radkin <kirill.rad...@syntacore.com>
Date:   Thu Jun 15 18:18:06 2023 +0300

    target: Change functions for delete watchpoints and breakpoints. Now they 
can return something.
    
    Also change policy of removing breakpoints/watchpoints.
    Now internal watch/breakpoint will not be removed in case
    of error during removing triggers from hardware
    
    Change-Id: I9698bba1ea7c9375af692ee2e17563619dbe6080
    Signed-off-by: Kirill Radkin <kirill.rad...@syntacore.com>

diff --git a/src/target/breakpoints.c b/src/target/breakpoints.c
index bbaff4e756..321efd9d33 100644
--- a/src/target/breakpoints.c
+++ b/src/target/breakpoints.c
@@ -270,7 +270,7 @@ int hybrid_breakpoint_add(struct target *target,
 }
 
 /* free up a breakpoint */
-static void breakpoint_free(struct target *target, struct breakpoint 
*breakpoint_to_remove)
+static int breakpoint_free(struct target *target, struct breakpoint 
*breakpoint_to_remove)
 {
        struct breakpoint *breakpoint = target->breakpoints;
        struct breakpoint **breakpoint_p = &target->breakpoints;
@@ -284,14 +284,21 @@ static void breakpoint_free(struct target *target, struct 
breakpoint *breakpoint
        }
 
        if (!breakpoint)
-               return;
+               return ERROR_OK;
 
        retval = target_remove_breakpoint(target, breakpoint);
+       if (retval != ERROR_OK) {
+               LOG_TARGET_ERROR(target, "fail during running target-specific 
part of removing breakpoint %d",
+                                               breakpoint->number);
+               return retval;
+       }
 
        LOG_DEBUG("free BPID: %" PRIu32 " --> %d", breakpoint->unique_id, 
retval);
        (*breakpoint_p) = breakpoint->next;
        free(breakpoint->orig_instr);
        free(breakpoint);
+
+       return ERROR_OK;
 }
 
 static int breakpoint_remove_internal(struct target *target, target_addr_t 
address)
@@ -306,77 +313,108 @@ static int breakpoint_remove_internal(struct target 
*target, target_addr_t addre
        }
 
        if (breakpoint) {
-               breakpoint_free(target, breakpoint);
-               return 1;
+               return breakpoint_free(target, breakpoint);
        } else {
                if (!target->smp)
-                       LOG_ERROR("no breakpoint at address " TARGET_ADDR_FMT " 
found", address);
-               return 0;
+                       LOG_TARGET_ERROR(target, "no breakpoint at address " 
TARGET_ADDR_FMT " found", address);
+               return ERROR_BREAKPOINT_NOT_FOUND;
        }
 }
 
-static void breakpoint_remove_all_internal(struct target *target)
+static int breakpoint_remove_all_internal(struct target *target)
 {
        struct breakpoint *breakpoint = target->breakpoints;
 
        while (breakpoint) {
                struct breakpoint *tmp = breakpoint;
                breakpoint = breakpoint->next;
-               breakpoint_free(target, tmp);
+               int retval = breakpoint_free(target, tmp);
+               if (retval != ERROR_OK)
+                       return retval;
        }
+
+       return ERROR_OK;
 }
 
-void breakpoint_remove(struct target *target, target_addr_t address)
+int breakpoint_remove(struct target *target, target_addr_t address)
 {
+       int retval = ERROR_OK;
        if (target->smp) {
                unsigned int num_breakpoints = 0;
                struct target_list *head;
 
                foreach_smp_target(head, target->smp_targets) {
                        struct target *curr = head->target;
-                       num_breakpoints += breakpoint_remove_internal(curr, 
address);
+                       int status = breakpoint_remove_internal(curr, address);
+
+                       if (status == ERROR_OK) {
+                               num_breakpoints++;
+                       } else {
+                               LOG_TARGET_ERROR(curr, "fail during removing 
breakpoint at address" TARGET_ADDR_FMT, address);
+                               retval = status;
+                       }
                }
-               if (!num_breakpoints)
+               if (num_breakpoints == 0)
                        LOG_ERROR("no breakpoint at address " TARGET_ADDR_FMT " 
found", address);
        } else {
-               breakpoint_remove_internal(target, address);
+               retval = breakpoint_remove_internal(target, address);
        }
+
+       return retval;
 }
 
-void breakpoint_remove_all(struct target *target)
+int breakpoint_remove_all(struct target *target)
 {
+       int retval;
        if (target->smp) {
                struct target_list *head;
 
                foreach_smp_target(head, target->smp_targets) {
                        struct target *curr = head->target;
-                       breakpoint_remove_all_internal(curr);
+                       retval = breakpoint_remove_all_internal(curr);
+
+                       if (retval != ERROR_OK)
+                               return retval;
                }
        } else {
-               breakpoint_remove_all_internal(target);
+               retval = breakpoint_remove_all_internal(target);
        }
+
+       return retval;
 }
 
-static void breakpoint_clear_target_internal(struct target *target)
+static int breakpoint_clear_target_internal(struct target *target)
 {
        LOG_DEBUG("Delete all breakpoints for target: %s",
                target_name(target));
-       while (target->breakpoints)
-               breakpoint_free(target, target->breakpoints);
+       while (target->breakpoints) {
+               int retval = breakpoint_free(target, target->breakpoints);
+               if (retval != ERROR_OK)
+                       return retval;
+       }
+
+       return ERROR_OK;
 }
 
-void breakpoint_clear_target(struct target *target)
+int breakpoint_clear_target(struct target *target)
 {
+       int retval = ERROR_OK;
+
        if (target->smp) {
                struct target_list *head;
 
                foreach_smp_target(head, target->smp_targets) {
                        struct target *curr = head->target;
-                       breakpoint_clear_target_internal(curr);
+                       int status = breakpoint_clear_target_internal(curr);
+
+                       if (status != ERROR_OK)
+                               retval = status;
                }
        } else {
-               breakpoint_clear_target_internal(target);
+               retval = breakpoint_clear_target_internal(target);
        }
+
+       return retval;
 }
 
 struct breakpoint *breakpoint_find(struct target *target, target_addr_t 
address)
@@ -479,7 +517,7 @@ int watchpoint_add(struct target *target, target_addr_t 
address,
        }
 }
 
-static void watchpoint_free(struct target *target, struct watchpoint 
*watchpoint_to_remove)
+static int watchpoint_free(struct target *target, struct watchpoint 
*watchpoint_to_remove)
 {
        struct watchpoint *watchpoint = target->watchpoints;
        struct watchpoint **watchpoint_p = &target->watchpoints;
@@ -493,11 +531,19 @@ static void watchpoint_free(struct target *target, struct 
watchpoint *watchpoint
        }
 
        if (!watchpoint)
-               return;
+               return ERROR_OK;
        retval = target_remove_watchpoint(target, watchpoint);
+       if (retval != ERROR_OK) {
+               LOG_TARGET_ERROR(target, "fail during running target-specific 
part of removing watchpoint %d",
+                                               watchpoint->number);
+               return retval;
+       }
+
        LOG_DEBUG("free WPID: %d --> %d", watchpoint->unique_id, retval);
        (*watchpoint_p) = watchpoint->next;
        free(watchpoint);
+
+       return ERROR_OK;
 }
 
 static int watchpoint_remove_internal(struct target *target, target_addr_t 
address)
@@ -511,38 +557,54 @@ static int watchpoint_remove_internal(struct target 
*target, target_addr_t addre
        }
 
        if (watchpoint) {
-               watchpoint_free(target, watchpoint);
-               return 1;
+               return watchpoint_free(target, watchpoint);
        } else {
                if (!target->smp)
-                       LOG_ERROR("no watchpoint at address " TARGET_ADDR_FMT " 
found", address);
-               return 0;
+                       LOG_TARGET_ERROR(target, "no watchpoint at address " 
TARGET_ADDR_FMT " found", address);
+               return ERROR_WATCHPOINT_NOT_FOUND;
        }
 }
 
-void watchpoint_remove(struct target *target, target_addr_t address)
+int watchpoint_remove(struct target *target, target_addr_t address)
 {
+       int retval = ERROR_OK;
        if (target->smp) {
                unsigned int num_watchpoints = 0;
                struct target_list *head;
 
                foreach_smp_target(head, target->smp_targets) {
                        struct target *curr = head->target;
-                       num_watchpoints += watchpoint_remove_internal(curr, 
address);
+                       int status = watchpoint_remove_internal(curr, address);
+
+                       if (status == ERROR_OK) {
+                               num_watchpoints++;
+                       } else {
+                               LOG_TARGET_ERROR(curr, "fail during removing 
watchpoint at address" TARGET_ADDR_FMT, address);
+                               retval = status;
+                       }
                }
                if (num_watchpoints == 0)
-                       LOG_ERROR("no watchpoint at address " TARGET_ADDR_FMT " 
num_watchpoints", address);
+                       LOG_ERROR("no watchpoint at address " TARGET_ADDR_FMT " 
found", address);
        } else {
-               watchpoint_remove_internal(target, address);
+               retval = watchpoint_remove_internal(target, address);
        }
+
+       return retval;
 }
 
-void watchpoint_clear_target(struct target *target)
+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)
-               watchpoint_free(target, target->watchpoints);
+       while (target->watchpoints) {
+               int status = watchpoint_free(target, target->watchpoints);
+               if (status != ERROR_OK)
+                       retval = status;
+       }
+
+       return retval;
 }
 
 int watchpoint_hit(struct target *target, enum watchpoint_rw *rw,
diff --git a/src/target/breakpoints.h b/src/target/breakpoints.h
index a9ae484357..885afbe4a6 100644
--- a/src/target/breakpoints.h
+++ b/src/target/breakpoints.h
@@ -48,15 +48,15 @@ struct watchpoint {
        int unique_id;
 };
 
-void breakpoint_clear_target(struct target *target);
+int breakpoint_clear_target(struct target *target);
 int breakpoint_add(struct target *target,
                target_addr_t address, uint32_t length, enum breakpoint_type 
type);
 int context_breakpoint_add(struct target *target,
                uint32_t asid, uint32_t length, enum breakpoint_type type);
 int hybrid_breakpoint_add(struct target *target,
                target_addr_t address, uint32_t asid, uint32_t length, enum 
breakpoint_type type);
-void breakpoint_remove(struct target *target, target_addr_t address);
-void breakpoint_remove_all(struct target *target);
+int breakpoint_remove(struct target *target, target_addr_t address);
+int breakpoint_remove_all(struct target *target);
 
 struct breakpoint *breakpoint_find(struct target *target, target_addr_t 
address);
 
@@ -66,11 +66,11 @@ static inline void breakpoint_hw_set(struct breakpoint 
*breakpoint, unsigned int
        breakpoint->number = hw_number;
 }
 
-void watchpoint_clear_target(struct target *target);
+int watchpoint_clear_target(struct target *target);
 int watchpoint_add(struct target *target,
                target_addr_t address, uint32_t length,
                enum watchpoint_rw rw, uint32_t value, uint32_t mask);
-void watchpoint_remove(struct target *target, target_addr_t address);
+int watchpoint_remove(struct target *target, target_addr_t address);
 
 /* report type and address of just hit watchpoint */
 int watchpoint_hit(struct target *target, enum watchpoint_rw *rw,
@@ -82,4 +82,7 @@ static inline void watchpoint_set(struct watchpoint 
*watchpoint, unsigned int nu
        watchpoint->number = number;
 }
 
+#define ERROR_BREAKPOINT_NOT_FOUND (-1600)
+#define ERROR_WATCHPOINT_NOT_FOUND (-1601)
+
 #endif /* OPENOCD_TARGET_BREAKPOINTS_H */
diff --git a/src/target/target.c b/src/target/target.c
index 5858aa573b..188fbe1ba4 100644
--- a/src/target/target.c
+++ b/src/target/target.c
@@ -4034,21 +4034,26 @@ COMMAND_HANDLER(handle_bp_command)
 
 COMMAND_HANDLER(handle_rbp_command)
 {
+       int retval;
+
        if (CMD_ARGC != 1)
                return ERROR_COMMAND_SYNTAX_ERROR;
 
        struct target *target = get_current_target(CMD_CTX);
 
        if (!strcmp(CMD_ARGV[0], "all")) {
-               breakpoint_remove_all(target);
+               retval = breakpoint_remove_all(target);
        } else {
                target_addr_t addr;
                COMMAND_PARSE_ADDRESS(CMD_ARGV[0], addr);
 
-               breakpoint_remove(target, addr);
+               retval = breakpoint_remove(target, addr);
        }
 
-       return ERROR_OK;
+       if (retval != ERROR_OK)
+               LOG_ERROR("Failure removing breakpoints");
+
+       return retval;
 }
 
 COMMAND_HANDLER(handle_wp_command)
@@ -4128,11 +4133,15 @@ COMMAND_HANDLER(handle_rwp_command)
        COMMAND_PARSE_ADDRESS(CMD_ARGV[0], addr);
 
        struct target *target = get_current_target(CMD_CTX);
-       watchpoint_remove(target, addr);
+       int retval = watchpoint_remove(target, addr);
 
-       return ERROR_OK;
+       if (retval != ERROR_OK)
+               LOG_ERROR("Failure removing watchpoints");
+
+       return retval;
 }
 
+
 /**
  * Translate a virtual address to a physical address.
  *

-- 

Reply via email to