+ if (target->smp) {
+ struct target_list *head;
+
+ if (type == BKPT_SOFT) {
+ head = list_first_entry(target->smp_targets, struct target_list, lh);
+ return breakpoint_add_internal(head->target, 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;
+ }
+
+ return ERROR_OK;
+ } else {
+ return breakpoint_add_internal(target, address, length, type);
+ }
+}
+
+int context_breakpoint_add(struct target *target,
+ uint32_t asid,
+ uint32_t length,
+ enum breakpoint_type type)
+{
+ if (target->smp) {
+ struct target_list *head;
+
+ 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;
+ }
+
+ return ERROR_OK;
+ } else {
+ return context_breakpoint_add_internal(target, asid, length, type);
+ }
+}
+
+int hybrid_breakpoint_add(struct target *target,
+ target_addr_t address,
+ uint32_t asid,
+ uint32_t length,
+ enum breakpoint_type type)
+{
+ if (target->smp) {
+ struct target_list *head;
+
+ 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;
+ }
+
+ return ERROR_OK;
+ } else
+ return hybrid_breakpoint_add_internal(target, address, asid, length, type);
+}
+
+/* free up a breakpoint */
+static void breakpoint_free(struct target *target, struct breakpoint *breakpoint_to_remove)
+{
+ struct breakpoint *breakpoint = target->breakpoints;
+ struct breakpoint **breakpoint_p = &target->breakpoints;