+ LOG_ERROR("can't add breakpoint: %s", reason);
+ free((*breakpoint_p)->orig_instr);
+ free(*breakpoint_p);
+ *breakpoint_p = NULL;
+ return retval;
+ }
+
+ LOG_DEBUG("added %s breakpoint at " TARGET_ADDR_FMT " of length 0x%8.8x, (BPID: %" PRIu32 ")",
+ breakpoint_type_strings[(*breakpoint_p)->type],
+ (*breakpoint_p)->address, (*breakpoint_p)->length,
+ (*breakpoint_p)->unique_id);
+
+ return ERROR_OK;
+}
+
+static int context_breakpoint_add_internal(struct target *target,
+ uint32_t asid,
+ uint32_t length,
+ enum breakpoint_type type)
+{
+ struct breakpoint *breakpoint = target->breakpoints;
+ struct breakpoint **breakpoint_p = &target->breakpoints;
+ int retval;
+ int n;
+
+ n = 0;
+ while (breakpoint) {
+ n++;
+ if (breakpoint->asid == asid) {
+ /* FIXME don't assume "same address" means "same
+ * breakpoint" ... check all the parameters before
+ * succeeding.
+ */
+ LOG_ERROR("Duplicate Breakpoint asid: 0x%08" PRIx32 " (BP %" PRIu32 ")",
+ asid, breakpoint->unique_id);
+ return ERROR_TARGET_DUPLICATE_BREAKPOINT;
+ }
+ breakpoint_p = &breakpoint->next;
+ breakpoint = breakpoint->next;
+ }
+
+ (*breakpoint_p) = malloc(sizeof(struct breakpoint));
+ (*breakpoint_p)->address = 0;
+ (*breakpoint_p)->asid = asid;
+ (*breakpoint_p)->length = length;
+ (*breakpoint_p)->type = type;
+ (*breakpoint_p)->set = 0;
+ (*breakpoint_p)->orig_instr = malloc(length);
+ (*breakpoint_p)->next = NULL;
+ (*breakpoint_p)->unique_id = bpwp_unique_id++;
+ retval = target_add_context_breakpoint(target, *breakpoint_p);
+ if (retval != ERROR_OK) {
+ LOG_ERROR("could not add breakpoint");