openocd: src/target: replace the GPL-2.0-or-later license tag
[fw/openocd] / src / target / breakpoints.c
index dfec75051a9f106f422c5a9acb85697d5b51809a..b03136786390b7b2925e05701d4e7e502e2e9c93 100644 (file)
@@ -1,22 +1,11 @@
+/* SPDX-License-Identifier: GPL-2.0-or-later */
+
 /***************************************************************************
  *   Copyright (C) 2005 by Dominic Rath                                    *
  *   Dominic.Rath@gmx.de                                                   *
  *                                                                         *
  *   Copyright (C) ST-Ericsson SA 2011                                     *
  *   michel.jaouen@stericsson.com : smp minimum support                    *
- *                                                                         *
- *   This program is free software; you can redistribute it and/or modify  *
- *   it under the terms of the GNU General Public License as published by  *
- *   the Free Software Foundation; either version 2 of the License, or     *
- *   (at your option) any later version.                                   *
- *                                                                         *
- *   This program is distributed in the hope that it will be useful,       *
- *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
- *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
- *   GNU General Public License for more details.                          *
- *                                                                         *
- *   You should have received a copy of the GNU General Public License     *
- *   along with this program.  If not, see <http://www.gnu.org/licenses/>. *
  ***************************************************************************/
 
 #ifdef HAVE_CONFIG_H
@@ -26,6 +15,7 @@
 #include "target.h"
 #include <helper/log.h>
 #include "breakpoints.h"
+#include "smp.h"
 
 static const char * const breakpoint_type_strings[] = {
        "hardware",
@@ -70,7 +60,7 @@ static int breakpoint_add_internal(struct target *target,
        (*breakpoint_p)->asid = 0;
        (*breakpoint_p)->length = length;
        (*breakpoint_p)->type = type;
-       (*breakpoint_p)->set = 0;
+       (*breakpoint_p)->is_set = false;
        (*breakpoint_p)->orig_instr = malloc(length);
        (*breakpoint_p)->next = NULL;
        (*breakpoint_p)->unique_id = bpwp_unique_id++;
@@ -133,7 +123,7 @@ static int context_breakpoint_add_internal(struct target *target,
        (*breakpoint_p)->asid = asid;
        (*breakpoint_p)->length = length;
        (*breakpoint_p)->type = type;
-       (*breakpoint_p)->set = 0;
+       (*breakpoint_p)->is_set = false;
        (*breakpoint_p)->orig_instr = malloc(length);
        (*breakpoint_p)->next = NULL;
        (*breakpoint_p)->unique_id = bpwp_unique_id++;
@@ -187,7 +177,7 @@ static int hybrid_breakpoint_add_internal(struct target *target,
        (*breakpoint_p)->asid = asid;
        (*breakpoint_p)->length = length;
        (*breakpoint_p)->type = type;
-       (*breakpoint_p)->set = 0;
+       (*breakpoint_p)->is_set = false;
        (*breakpoint_p)->orig_instr = malloc(length);
        (*breakpoint_p)->next = NULL;
        (*breakpoint_p)->unique_id = bpwp_unique_id++;
@@ -216,22 +206,22 @@ int breakpoint_add(struct target *target,
        uint32_t length,
        enum breakpoint_type type)
 {
-       int retval = ERROR_OK;
        if (target->smp) {
                struct target_list *head;
-               struct target *curr;
-               head = target->head;
-               if (type == BKPT_SOFT)
+
+               if (type == BKPT_SOFT) {
+                       head = list_first_entry(target->smp_targets, struct target_list, lh);
                        return breakpoint_add_internal(head->target, address, length, type);
+               }
 
-               while (head != (struct target_list *)NULL) {
-                       curr = head->target;
-                       retval = breakpoint_add_internal(curr, address, length, type);
+               foreach_smp_target(head, target->smp_targets) {
+                       struct target *curr = head->target;
+                       int retval = breakpoint_add_internal(curr, address, length, type);
                        if (retval != ERROR_OK)
                                return retval;
-                       head = head->next;
                }
-               return retval;
+
+               return ERROR_OK;
        } else {
                return breakpoint_add_internal(target, address, length, type);
        }
@@ -242,19 +232,17 @@ int context_breakpoint_add(struct target *target,
        uint32_t length,
        enum breakpoint_type type)
 {
-       int retval = ERROR_OK;
        if (target->smp) {
                struct target_list *head;
-               struct target *curr;
-               head = target->head;
-               while (head != (struct target_list *)NULL) {
-                       curr = head->target;
-                       retval = context_breakpoint_add_internal(curr, asid, length, type);
+
+               foreach_smp_target(head, target->smp_targets) {
+                       struct target *curr = head->target;
+                       int retval = context_breakpoint_add_internal(curr, asid, length, type);
                        if (retval != ERROR_OK)
                                return retval;
-                       head = head->next;
                }
-               return retval;
+
+               return ERROR_OK;
        } else {
                return context_breakpoint_add_internal(target, asid, length, type);
        }
@@ -266,19 +254,17 @@ int hybrid_breakpoint_add(struct target *target,
        uint32_t length,
        enum breakpoint_type type)
 {
-       int retval = ERROR_OK;
        if (target->smp) {
                struct target_list *head;
-               struct target *curr;
-               head = target->head;
-               while (head != (struct target_list *)NULL) {
-                       curr = head->target;
-                       retval = hybrid_breakpoint_add_internal(curr, address, asid, length, type);
+
+               foreach_smp_target(head, target->smp_targets) {
+                       struct target *curr = head->target;
+                       int retval = hybrid_breakpoint_add_internal(curr, address, asid, length, type);
                        if (retval != ERROR_OK)
                                return retval;
-                       head = head->next;
                }
-               return retval;
+
+               return ERROR_OK;
        } else
                return hybrid_breakpoint_add_internal(target, address, asid, length, type);
 }
@@ -345,12 +331,10 @@ void breakpoint_remove(struct target *target, target_addr_t address)
        if (target->smp) {
                unsigned int num_breakpoints = 0;
                struct target_list *head;
-               struct target *curr;
-               head = target->head;
-               while (head != (struct target_list *)NULL) {
-                       curr = head->target;
+
+               foreach_smp_target(head, target->smp_targets) {
+                       struct target *curr = head->target;
                        num_breakpoints += breakpoint_remove_internal(curr, address);
-                       head = head->next;
                }
                if (!num_breakpoints)
                        LOG_ERROR("no breakpoint at address " TARGET_ADDR_FMT " found", address);
@@ -363,12 +347,10 @@ void breakpoint_remove_all(struct target *target)
 {
        if (target->smp) {
                struct target_list *head;
-               struct target *curr;
-               head = target->head;
-               while (head != (struct target_list *)NULL) {
-                       curr = head->target;
+
+               foreach_smp_target(head, target->smp_targets) {
+                       struct target *curr = head->target;
                        breakpoint_remove_all_internal(curr);
-                       head = head->next;
                }
        } else {
                breakpoint_remove_all_internal(target);
@@ -387,12 +369,10 @@ void breakpoint_clear_target(struct target *target)
 {
        if (target->smp) {
                struct target_list *head;
-               struct target *curr;
-               head = target->head;
-               while (head != (struct target_list *)NULL) {
-                       curr = head->target;
+
+               foreach_smp_target(head, target->smp_targets) {
+                       struct target *curr = head->target;
                        breakpoint_clear_target_internal(curr);
-                       head = head->next;
                }
        } else {
                breakpoint_clear_target_internal(target);
@@ -482,21 +462,17 @@ bye:
 int watchpoint_add(struct target *target, target_addr_t address,
                uint32_t length, enum watchpoint_rw rw, uint32_t value, uint32_t mask)
 {
-       int retval = ERROR_OK;
        if (target->smp) {
                struct target_list *head;
-               struct target *curr;
-               head = target->head;
 
-               while (head != (struct target_list *)NULL) {
-                       curr = head->target;
-                       retval = watchpoint_add_internal(curr, address, length, rw, value,
-                                       mask);
+               foreach_smp_target(head, target->smp_targets) {
+                       struct target *curr = head->target;
+                       int retval = watchpoint_add_internal(curr, address, length, rw, value, mask);
                        if (retval != ERROR_OK)
                                return retval;
-                       head = head->next;
                }
-               return retval;
+
+               return ERROR_OK;
        } else {
                return watchpoint_add_internal(target, address, length, rw, value,
                                mask);
@@ -549,12 +525,10 @@ void watchpoint_remove(struct target *target, target_addr_t address)
        if (target->smp) {
                unsigned int num_watchpoints = 0;
                struct target_list *head;
-               struct target *curr;
-               head = target->head;
-               while (head) {
-                       curr = head->target;
+
+               foreach_smp_target(head, target->smp_targets) {
+                       struct target *curr = head->target;
                        num_watchpoints += watchpoint_remove_internal(curr, address);
-                       head = head->next;
                }
                if (num_watchpoints == 0)
                        LOG_ERROR("no watchpoint at address " TARGET_ADDR_FMT " num_watchpoints", address);