breakpoints: Add target logging to breakpoints and watchpoints

This patch adds target logging to breakpoint
handling code. This makes it easier to
debug multicore/multithread systems.

Change-Id: I6bea8079a457070a8f63d0ce381a4ece6f5a190a
Signed-off-by: Marek Vrbka <marek.vrbka@codasip.com>
Reviewed-on: https://review.openocd.org/c/openocd/+/7922
Tested-by: jenkins
Reviewed-by: Antonio Borneo <borneo.antonio@gmail.com>
Reviewed-by: Tomas Vanek <vanekt@fbl.cz>
This commit is contained in:
Marek Vrbka 2023-09-29 13:14:10 +02:00 committed by Antonio Borneo
parent 7c60f6593e
commit 851d1ad87a
2 changed files with 19 additions and 21 deletions

View File

@ -52,7 +52,7 @@ static int breakpoint_add_internal(struct target *target,
* breakpoint" ... check all the parameters before * breakpoint" ... check all the parameters before
* succeeding. * succeeding.
*/ */
LOG_ERROR("Duplicate Breakpoint address: " TARGET_ADDR_FMT " (BP %" PRIu32 ")", LOG_TARGET_ERROR(target, "Duplicate Breakpoint address: " TARGET_ADDR_FMT " (BP %" PRIu32 ")",
address, breakpoint->unique_id); address, breakpoint->unique_id);
return ERROR_TARGET_DUPLICATE_BREAKPOINT; return ERROR_TARGET_DUPLICATE_BREAKPOINT;
} }
@ -83,16 +83,15 @@ static int breakpoint_add_internal(struct target *target,
default: default:
reason = "unknown reason"; reason = "unknown reason";
fail: fail:
LOG_ERROR("can't add breakpoint: %s", reason); LOG_TARGET_ERROR(target, "can't add breakpoint: %s", reason);
free((*breakpoint_p)->orig_instr); free((*breakpoint_p)->orig_instr);
free(*breakpoint_p); free(*breakpoint_p);
*breakpoint_p = NULL; *breakpoint_p = NULL;
return retval; return retval;
} }
LOG_DEBUG("[%d] added %s breakpoint at " TARGET_ADDR_FMT LOG_TARGET_DEBUG(target, "added %s breakpoint at " TARGET_ADDR_FMT
" of length 0x%8.8x, (BPID: %" PRIu32 ")", " of length 0x%8.8x, (BPID: %" PRIu32 ")",
target->coreid,
breakpoint_type_strings[(*breakpoint_p)->type], breakpoint_type_strings[(*breakpoint_p)->type],
(*breakpoint_p)->address, (*breakpoint_p)->length, (*breakpoint_p)->address, (*breakpoint_p)->length,
(*breakpoint_p)->unique_id); (*breakpoint_p)->unique_id);
@ -134,14 +133,14 @@ static int context_breakpoint_add_internal(struct target *target,
(*breakpoint_p)->unique_id = bpwp_unique_id++; (*breakpoint_p)->unique_id = bpwp_unique_id++;
retval = target_add_context_breakpoint(target, *breakpoint_p); retval = target_add_context_breakpoint(target, *breakpoint_p);
if (retval != ERROR_OK) { if (retval != ERROR_OK) {
LOG_ERROR("could not add breakpoint"); LOG_TARGET_ERROR(target, "could not add breakpoint");
free((*breakpoint_p)->orig_instr); free((*breakpoint_p)->orig_instr);
free(*breakpoint_p); free(*breakpoint_p);
*breakpoint_p = NULL; *breakpoint_p = NULL;
return retval; return retval;
} }
LOG_DEBUG("added %s Context breakpoint at 0x%8.8" PRIx32 " of length 0x%8.8x, (BPID: %" PRIu32 ")", LOG_TARGET_DEBUG(target, "added %s Context breakpoint at 0x%8.8" PRIx32 " of length 0x%8.8x, (BPID: %" PRIu32 ")",
breakpoint_type_strings[(*breakpoint_p)->type], breakpoint_type_strings[(*breakpoint_p)->type],
(*breakpoint_p)->asid, (*breakpoint_p)->length, (*breakpoint_p)->asid, (*breakpoint_p)->length,
(*breakpoint_p)->unique_id); (*breakpoint_p)->unique_id);
@ -165,11 +164,11 @@ static int hybrid_breakpoint_add_internal(struct target *target,
* breakpoint" ... check all the parameters before * breakpoint" ... check all the parameters before
* succeeding. * succeeding.
*/ */
LOG_ERROR("Duplicate Hybrid Breakpoint asid: 0x%08" PRIx32 " (BP %" PRIu32 ")", LOG_TARGET_ERROR(target, "Duplicate Hybrid Breakpoint asid: 0x%08" PRIx32 " (BP %" PRIu32 ")",
asid, breakpoint->unique_id); asid, breakpoint->unique_id);
return ERROR_TARGET_DUPLICATE_BREAKPOINT; return ERROR_TARGET_DUPLICATE_BREAKPOINT;
} else if ((breakpoint->address == address) && (breakpoint->asid == 0)) { } else if ((breakpoint->address == address) && (breakpoint->asid == 0)) {
LOG_ERROR("Duplicate Breakpoint IVA: " TARGET_ADDR_FMT " (BP %" PRIu32 ")", LOG_TARGET_ERROR(target, "Duplicate Breakpoint IVA: " TARGET_ADDR_FMT " (BP %" PRIu32 ")",
address, breakpoint->unique_id); address, breakpoint->unique_id);
return ERROR_TARGET_DUPLICATE_BREAKPOINT; return ERROR_TARGET_DUPLICATE_BREAKPOINT;
@ -190,13 +189,13 @@ static int hybrid_breakpoint_add_internal(struct target *target,
retval = target_add_hybrid_breakpoint(target, *breakpoint_p); retval = target_add_hybrid_breakpoint(target, *breakpoint_p);
if (retval != ERROR_OK) { if (retval != ERROR_OK) {
LOG_ERROR("could not add breakpoint"); LOG_TARGET_ERROR(target, "could not add breakpoint");
free((*breakpoint_p)->orig_instr); free((*breakpoint_p)->orig_instr);
free(*breakpoint_p); free(*breakpoint_p);
*breakpoint_p = NULL; *breakpoint_p = NULL;
return retval; return retval;
} }
LOG_DEBUG( LOG_TARGET_DEBUG(target,
"added %s Hybrid breakpoint at address " TARGET_ADDR_FMT " of length 0x%8.8x, (BPID: %" PRIu32 ")", "added %s Hybrid breakpoint at address " TARGET_ADDR_FMT " of length 0x%8.8x, (BPID: %" PRIu32 ")",
breakpoint_type_strings[(*breakpoint_p)->type], breakpoint_type_strings[(*breakpoint_p)->type],
(*breakpoint_p)->address, (*breakpoint_p)->address,
@ -298,7 +297,7 @@ static int breakpoint_free(struct target *target, struct breakpoint *breakpoint_
return retval; return retval;
} }
LOG_DEBUG("free BPID: %" PRIu32 " --> %d", breakpoint->unique_id, retval); LOG_TARGET_DEBUG(target, "free BPID: %" PRIu32 " --> %d", breakpoint->unique_id, retval);
(*breakpoint_p) = breakpoint->next; (*breakpoint_p) = breakpoint->next;
free(breakpoint->orig_instr); free(breakpoint->orig_instr);
free(breakpoint); free(breakpoint);
@ -404,7 +403,7 @@ static int watchpoint_free(struct target *target, struct watchpoint *watchpoint_
return retval; return retval;
} }
LOG_DEBUG("free WPID: %d --> %d", watchpoint->unique_id, retval); LOG_TARGET_DEBUG(target, "free WPID: %d --> %d", watchpoint->unique_id, retval);
(*watchpoint_p) = watchpoint->next; (*watchpoint_p) = watchpoint->next;
free(watchpoint); free(watchpoint);
@ -514,7 +513,7 @@ static int watchpoint_add_internal(struct target *target, target_addr_t address,
|| watchpoint->value != value || watchpoint->value != value
|| watchpoint->mask != mask || watchpoint->mask != mask
|| watchpoint->rw != rw) { || watchpoint->rw != rw) {
LOG_ERROR("address " TARGET_ADDR_FMT LOG_TARGET_ERROR(target, "address " TARGET_ADDR_FMT
" already has watchpoint %d", " already has watchpoint %d",
address, watchpoint->unique_id); address, watchpoint->unique_id);
return ERROR_FAIL; return ERROR_FAIL;
@ -548,7 +547,7 @@ static int watchpoint_add_internal(struct target *target, target_addr_t address,
default: default:
reason = "unrecognized error"; reason = "unrecognized error";
bye: bye:
LOG_ERROR("can't add %s watchpoint at " TARGET_ADDR_FMT ", %s", LOG_TARGET_ERROR(target, "can't add %s watchpoint at " TARGET_ADDR_FMT ", %s",
watchpoint_rw_strings[(*watchpoint_p)->rw], watchpoint_rw_strings[(*watchpoint_p)->rw],
address, reason); address, reason);
free(*watchpoint_p); free(*watchpoint_p);
@ -556,9 +555,8 @@ bye:
return retval; return retval;
} }
LOG_DEBUG("[%d] added %s watchpoint at " TARGET_ADDR_FMT LOG_TARGET_DEBUG(target, "added %s watchpoint at " TARGET_ADDR_FMT
" of length 0x%8.8" PRIx32 " (WPID: %d)", " of length 0x%8.8" PRIx32 " (WPID: %d)",
target->coreid,
watchpoint_rw_strings[(*watchpoint_p)->rw], watchpoint_rw_strings[(*watchpoint_p)->rw],
(*watchpoint_p)->address, (*watchpoint_p)->address,
(*watchpoint_p)->length, (*watchpoint_p)->length,
@ -674,7 +672,7 @@ int watchpoint_hit(struct target *target, enum watchpoint_rw *rw,
*rw = hit_watchpoint->rw; *rw = hit_watchpoint->rw;
*address = hit_watchpoint->address; *address = hit_watchpoint->address;
LOG_DEBUG("Found hit watchpoint at " TARGET_ADDR_FMT " (WPID: %d)", LOG_TARGET_DEBUG(target, "Found hit watchpoint at " TARGET_ADDR_FMT " (WPID: %d)",
hit_watchpoint->address, hit_watchpoint->address,
hit_watchpoint->unique_id); hit_watchpoint->unique_id);

View File

@ -3974,7 +3974,7 @@ static int handle_bp_command_set(struct command_invocation *cmd,
} else if (addr == 0) { } else if (addr == 0) {
if (!target->type->add_context_breakpoint) { if (!target->type->add_context_breakpoint) {
LOG_ERROR("Context breakpoint not available"); LOG_TARGET_ERROR(target, "Context breakpoint not available");
return ERROR_TARGET_RESOURCE_NOT_AVAILABLE; return ERROR_TARGET_RESOURCE_NOT_AVAILABLE;
} }
retval = context_breakpoint_add(target, asid, length, hw); retval = context_breakpoint_add(target, asid, length, hw);
@ -3984,7 +3984,7 @@ static int handle_bp_command_set(struct command_invocation *cmd,
} else { } else {
if (!target->type->add_hybrid_breakpoint) { if (!target->type->add_hybrid_breakpoint) {
LOG_ERROR("Hybrid breakpoint not available"); LOG_TARGET_ERROR(target, "Hybrid breakpoint not available");
return ERROR_TARGET_RESOURCE_NOT_AVAILABLE; return ERROR_TARGET_RESOURCE_NOT_AVAILABLE;
} }
retval = hybrid_breakpoint_add(target, addr, asid, length, hw); retval = hybrid_breakpoint_add(target, addr, asid, length, hw);
@ -4121,7 +4121,7 @@ COMMAND_HANDLER(handle_wp_command)
type = WPT_ACCESS; type = WPT_ACCESS;
break; break;
default: default:
LOG_ERROR("invalid watchpoint mode ('%c')", CMD_ARGV[2][0]); LOG_TARGET_ERROR(target, "invalid watchpoint mode ('%c')", CMD_ARGV[2][0]);
return ERROR_COMMAND_SYNTAX_ERROR; return ERROR_COMMAND_SYNTAX_ERROR;
} }
/* fall through */ /* fall through */
@ -4137,7 +4137,7 @@ COMMAND_HANDLER(handle_wp_command)
int retval = watchpoint_add(target, addr, length, type, int retval = watchpoint_add(target, addr, length, type,
data_value, data_mask); data_value, data_mask);
if (retval != ERROR_OK) if (retval != ERROR_OK)
LOG_ERROR("Failure setting watchpoints"); LOG_TARGET_ERROR(target, "Failure setting watchpoints");
return retval; return retval;
} }