+ LOG_DEBUG("added %s Context breakpoint at 0x%8.8" PRIx32 " of length 0x%8.8x, (BPID: %" PRIu32 ")",
+ breakpoint_type_strings[(*breakpoint_p)->type],
+ (*breakpoint_p)->asid, (*breakpoint_p)->length,
+ (*breakpoint_p)->unique_id);
+
+ return ERROR_OK;
+}
+
+int hybrid_breakpoint_add_internal(struct target *target,
+ uint32_t address,
+ 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) && (breakpoint->address == address)) {
+ /* FIXME don't assume "same address" means "same
+ * breakpoint" ... check all the parameters before
+ * succeeding.
+ */
+ LOG_DEBUG("Duplicate Hybrid Breakpoint asid: 0x%08" PRIx32 " (BP %" PRIu32 ")",
+ asid, breakpoint->unique_id);
+ return -1;
+ } else if ((breakpoint->address == address) && (breakpoint->asid == 0)) {
+ LOG_DEBUG("Duplicate Breakpoint IVA: 0x%08" PRIx32 " (BP %" PRIu32 ")",
+ address, breakpoint->unique_id);
+ return -1;
+
+ }
+ breakpoint_p = &breakpoint->next;
+ breakpoint = breakpoint->next;
+ }
+ (*breakpoint_p) = malloc(sizeof(struct breakpoint));
+ (*breakpoint_p)->address = address;
+ (*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_hybrid_breakpoint(target, *breakpoint_p);
+ if (retval != ERROR_OK) {
+ LOG_ERROR("could not add breakpoint");
+ free((*breakpoint_p)->orig_instr);
+ free(*breakpoint_p);
+ *breakpoint_p = NULL;
+ return retval;
+ }
+ LOG_DEBUG(
+ "added %s Hybrid breakpoint at address 0x%8.8" PRIx32 " of length 0x%8.8x, (BPID: %" PRIu32 ")",
+ breakpoint_type_strings[(*breakpoint_p)->type],
+ (*breakpoint_p)->address,
+ (*breakpoint_p)->length,
+ (*breakpoint_p)->unique_id);