*/
static int arm7_9_clear_watchpoints(arm7_9_common_t *arm7_9)
{
*/
static int arm7_9_clear_watchpoints(arm7_9_common_t *arm7_9)
{
embeddedice_write_reg(&arm7_9->eice_cache->reg_list[EICE_W0_CONTROL_VALUE], 0x0);
embeddedice_write_reg(&arm7_9->eice_cache->reg_list[EICE_W1_CONTROL_VALUE], 0x0);
arm7_9->sw_breakpoints_added = 0;
embeddedice_write_reg(&arm7_9->eice_cache->reg_list[EICE_W0_CONTROL_VALUE], 0x0);
embeddedice_write_reg(&arm7_9->eice_cache->reg_list[EICE_W1_CONTROL_VALUE], 0x0);
arm7_9->sw_breakpoints_added = 0;
{
LOG_ERROR("BUG: no hardware comparator available");
}
{
LOG_ERROR("BUG: no hardware comparator available");
}
+ LOG_DEBUG("BPID: %d (0x%08" PRIx32 ") using hw wp: %d",
+ breakpoint->unique_id,
+ breakpoint->address,
+ breakpoint->set );
LOG_ERROR("BUG: both watchpoints used, but wp_available >= 1");
return ERROR_FAIL;
}
LOG_ERROR("BUG: both watchpoints used, but wp_available >= 1");
return ERROR_FAIL;
}
+ LOG_DEBUG("SW BP using hw wp: %d",
+ arm7_9->sw_breakpoints_added );
return jtag_execute_queue();
}
return jtag_execute_queue();
}
arm7_9_common_t *arm7_9 = armv4_5->arch_info;
int retval = ERROR_OK;
arm7_9_common_t *arm7_9 = armv4_5->arch_info;
int retval = ERROR_OK;
+ LOG_DEBUG("BPID: %d, Address: 0x%08" PRIx32,
+ breakpoint->unique_id,
+ breakpoint->address );
+
if (target->state != TARGET_HALTED)
{
LOG_WARNING("target not halted");
if (target->state != TARGET_HALTED)
{
LOG_WARNING("target not halted");
armv4_5_common_t *armv4_5 = target->arch_info;
arm7_9_common_t *arm7_9 = armv4_5->arch_info;
armv4_5_common_t *armv4_5 = target->arch_info;
arm7_9_common_t *arm7_9 = armv4_5->arch_info;
+ LOG_DEBUG("BPID: %d, Address: 0x%08" PRIx32,
+ breakpoint->unique_id,
+ breakpoint->address );
+
if (!breakpoint->set)
{
LOG_WARNING("breakpoint not set");
if (!breakpoint->set)
{
LOG_WARNING("breakpoint not set");
if (breakpoint->type == BKPT_HARD)
{
if (breakpoint->type == BKPT_HARD)
{
+ LOG_DEBUG("BPID: %d Releasing hw wp: %d",
+ breakpoint->unique_id,
+ breakpoint->set );
if (breakpoint->set == 1)
{
embeddedice_set_reg(&arm7_9->eice_cache->reg_list[EICE_W0_CONTROL_VALUE], 0x0);
if (breakpoint->set == 1)
{
embeddedice_set_reg(&arm7_9->eice_cache->reg_list[EICE_W0_CONTROL_VALUE], 0x0);
{
if ((breakpoint = breakpoint_find(target, buf_get_u32(armv4_5->core_cache->reg_list[15].value, 0, 32))))
{
{
if ((breakpoint = breakpoint_find(target, buf_get_u32(armv4_5->core_cache->reg_list[15].value, 0, 32))))
{
- LOG_DEBUG("unset breakpoint at 0x%8.8" PRIx32 "", breakpoint->address);
+ LOG_DEBUG("unset breakpoint at 0x%8.8" PRIx32 " (id: %d)", breakpoint->address, breakpoint->unique_id );
if ((retval = arm7_9_unset_breakpoint(target, breakpoint)) != ERROR_OK)
{
return retval;
if ((retval = arm7_9_unset_breakpoint(target, breakpoint)) != ERROR_OK)
{
return retval;
+// monotonic counter/id-number for breakpoints and watch points
+static int bpwp_unique_id;
+
int breakpoint_add(target_t *target, uint32_t address, uint32_t length, enum breakpoint_type type)
{
breakpoint_t *breakpoint = target->breakpoints;
breakpoint_t **breakpoint_p = &target->breakpoints;
int retval;
int breakpoint_add(target_t *target, uint32_t address, uint32_t length, enum breakpoint_type type)
{
breakpoint_t *breakpoint = target->breakpoints;
breakpoint_t **breakpoint_p = &target->breakpoints;
int retval;
- if (breakpoint->address == address)
+ n++;
+ if (breakpoint->address == address){
+ LOG_DEBUG("Duplicate Breakpoint address: 0x%08" PRIx32 " (BP %d)",
+ address, breakpoint->unique_id );
breakpoint_p = &breakpoint->next;
breakpoint = breakpoint->next;
}
breakpoint_p = &breakpoint->next;
breakpoint = breakpoint->next;
}
(*breakpoint_p)->set = 0;
(*breakpoint_p)->orig_instr = malloc(length);
(*breakpoint_p)->next = NULL;
(*breakpoint_p)->set = 0;
(*breakpoint_p)->orig_instr = malloc(length);
(*breakpoint_p)->next = NULL;
+ (*breakpoint_p)->unique_id = bpwp_unique_id++;
if ((retval = target_add_breakpoint(target, *breakpoint_p)) != ERROR_OK)
{
switch (retval)
{
case ERROR_TARGET_RESOURCE_NOT_AVAILABLE:
if ((retval = target_add_breakpoint(target, *breakpoint_p)) != ERROR_OK)
{
switch (retval)
{
case ERROR_TARGET_RESOURCE_NOT_AVAILABLE:
- LOG_INFO("can't add %s breakpoint, resource not available", breakpoint_type_strings[(*breakpoint_p)->type]);
+ LOG_INFO("can't add %s breakpoint, resource not available (BPID=%d)",
+ breakpoint_type_strings[(*breakpoint_p)->type],
+ (*breakpoint_p)->unique_id );
+
free((*breakpoint_p)->orig_instr);
free(*breakpoint_p);
*breakpoint_p = NULL;
return retval;
break;
case ERROR_TARGET_NOT_HALTED:
free((*breakpoint_p)->orig_instr);
free(*breakpoint_p);
*breakpoint_p = NULL;
return retval;
break;
case ERROR_TARGET_NOT_HALTED:
- LOG_INFO("can't add breakpoint while target is running");
+ LOG_INFO("can't add breakpoint while target is running (BPID: %d)",
+ (*breakpoint_p)->unique_id );
free((*breakpoint_p)->orig_instr);
free(*breakpoint_p);
*breakpoint_p = NULL;
free((*breakpoint_p)->orig_instr);
free(*breakpoint_p);
*breakpoint_p = NULL;
- LOG_DEBUG("added %s breakpoint at 0x%8.8" PRIx32 " of length 0x%8.8x",
- breakpoint_type_strings[(*breakpoint_p)->type],
- (*breakpoint_p)->address, (*breakpoint_p)->length);
+ LOG_DEBUG("added %s breakpoint at 0x%8.8" PRIx32 " of length 0x%8.8x, (BPID: %d)",
+ breakpoint_type_strings[(*breakpoint_p)->type],
+ (*breakpoint_p)->address, (*breakpoint_p)->length,
+ (*breakpoint_p)->unique_id );
target_remove_breakpoint(target, breakpoint);
target_remove_breakpoint(target, breakpoint);
+ LOG_DEBUG("BPID: %d", breakpoint->unique_id );
(*breakpoint_p) = breakpoint->next;
free(breakpoint->orig_instr);
free(breakpoint);
(*breakpoint_p) = breakpoint->next;
free(breakpoint->orig_instr);
free(breakpoint);
void breakpoint_clear_target(target_t *target)
{
breakpoint_t *breakpoint;
void breakpoint_clear_target(target_t *target)
{
breakpoint_t *breakpoint;
+ LOG_DEBUG("Delete all breakpoints for target: %s", target_get_name( target ));
while ((breakpoint = target->breakpoints) != NULL)
{
breakpoint_free(target, breakpoint);
while ((breakpoint = target->breakpoints) != NULL)
{
breakpoint_free(target, breakpoint);
(*watchpoint_p)->rw = rw;
(*watchpoint_p)->set = 0;
(*watchpoint_p)->next = NULL;
(*watchpoint_p)->rw = rw;
(*watchpoint_p)->set = 0;
(*watchpoint_p)->next = NULL;
+ (*watchpoint_p)->unique_id = bpwp_unique_id++;
if ((retval = target_add_watchpoint(target, *watchpoint_p)) != ERROR_OK)
{
switch (retval)
{
case ERROR_TARGET_RESOURCE_NOT_AVAILABLE:
if ((retval = target_add_watchpoint(target, *watchpoint_p)) != ERROR_OK)
{
switch (retval)
{
case ERROR_TARGET_RESOURCE_NOT_AVAILABLE:
- LOG_INFO("can't add %s watchpoint, resource not available", watchpoint_rw_strings[(*watchpoint_p)->rw]);
+ LOG_INFO("can't add %s watchpoint, resource not available (WPID: %d)",
+ watchpoint_rw_strings[(*watchpoint_p)->rw],
+ (*watchpoint_p)->unique_id );
free (*watchpoint_p);
*watchpoint_p = NULL;
return retval;
break;
case ERROR_TARGET_NOT_HALTED:
free (*watchpoint_p);
*watchpoint_p = NULL;
return retval;
break;
case ERROR_TARGET_NOT_HALTED:
- LOG_INFO("can't add watchpoint while target is running");
+ LOG_INFO("can't add watchpoint while target is running (WPID: %d)",
+ (*watchpoint_p)->unique_id );
free (*watchpoint_p);
*watchpoint_p = NULL;
return retval;
free (*watchpoint_p);
*watchpoint_p = NULL;
return retval;
- LOG_DEBUG("added %s watchpoint at 0x%8.8" PRIx32 " of length 0x%8.8x",
- watchpoint_rw_strings[(*watchpoint_p)->rw],
- (*watchpoint_p)->address, (*watchpoint_p)->length);
+ LOG_DEBUG("added %s watchpoint at 0x%8.8" PRIx32 " of length 0x%8.8x (WPID: %d)",
+ watchpoint_rw_strings[(*watchpoint_p)->rw],
+ (*watchpoint_p)->address,
+ (*watchpoint_p)->length,
+ (*watchpoint_p)->unique_id );
if (watchpoint == NULL)
return;
target_remove_watchpoint(target, watchpoint);
if (watchpoint == NULL)
return;
target_remove_watchpoint(target, watchpoint);
+ LOG_DEBUG("WPID: %d", watchpoint->unique_id );
(*watchpoint_p) = watchpoint->next;
free(watchpoint);
}
(*watchpoint_p) = watchpoint->next;
free(watchpoint);
}
void watchpoint_clear_target(target_t *target)
{
watchpoint_t *watchpoint;
void watchpoint_clear_target(target_t *target)
{
watchpoint_t *watchpoint;
+ LOG_DEBUG("Delete all watchpoints for target: %s", target_get_name( target ));
while ((watchpoint = target->watchpoints) != NULL)
{
watchpoint_free(target, watchpoint);
while ((watchpoint = target->watchpoints) != NULL)
{
watchpoint_free(target, watchpoint);
int set;
uint8_t *orig_instr;
struct breakpoint_s *next;
int set;
uint8_t *orig_instr;
struct breakpoint_s *next;
} breakpoint_t;
typedef struct watchpoint_s
} breakpoint_t;
typedef struct watchpoint_s
enum watchpoint_rw rw;
int set;
struct watchpoint_s *next;
enum watchpoint_rw rw;
int set;
struct watchpoint_s *next;
} watchpoint_t;
extern void breakpoint_clear_target(struct target_s *target);
} watchpoint_t;
extern void breakpoint_clear_target(struct target_s *target);
/* Single step past breakpoint at current address */
if ((breakpoint = breakpoint_find(target, resume_pc)))
{
/* Single step past breakpoint at current address */
if ((breakpoint = breakpoint_find(target, resume_pc)))
{
- LOG_DEBUG("unset breakpoint at 0x%8.8" PRIx32 "", breakpoint->address);
+ LOG_DEBUG("unset breakpoint at 0x%8.8" PRIx32 " (ID: %d)",
+ breakpoint->address,
+ breakpoint->unique_id );
cortex_m3_unset_breakpoint(target, breakpoint);
cortex_m3_single_step_core(target);
cortex_m3_set_breakpoint(target, breakpoint);
cortex_m3_unset_breakpoint(target, breakpoint);
cortex_m3_single_step_core(target);
cortex_m3_set_breakpoint(target, breakpoint);
- LOG_WARNING("breakpoint already set");
+ LOG_WARNING("breakpoint (BPID: %d) already set", breakpoint->unique_id);
breakpoint->set = 0x11; /* Any nice value but 0 */
}
breakpoint->set = 0x11; /* Any nice value but 0 */
}
+ LOG_DEBUG("BPID: %d, Type: %d, Address: 0x%08" PRIx32 " Length: %d (set=%d)",
+ breakpoint->unique_id,
+ (int)(breakpoint->type),
+ breakpoint->address,
+ breakpoint->length,
+ breakpoint->set);
+
+ LOG_DEBUG("BPID: %d, Type: %d, Address: 0x%08" PRIx32 " Length: %d (set=%d)",
+ breakpoint->unique_id,
+ (int)(breakpoint->type),
+ breakpoint->address,
+ breakpoint->length,
+ breakpoint->set);
+
if (breakpoint->type == BKPT_HARD)
{
int fp_num = breakpoint->set - 1;
if (breakpoint->type == BKPT_HARD)
{
int fp_num = breakpoint->set - 1;
- LOG_WARNING("watchpoint already set");
+ LOG_WARNING("watchpoint (%d) already set", watchpoint->unique_id );
- LOG_WARNING("Cannot watch data values"); /* Move this test to add_watchpoint */
+ /* Move this test to add_watchpoint */
+ LOG_WARNING("Cannot watch data values (id: %d)",
+ watchpoint->unique_id );
+ LOG_DEBUG("Watchpoint (ID: %d) address: 0x%08" PRIx32 " set=%d ",
+ watchpoint->unique_id, watchpoint->address, watchpoint->set );
- LOG_WARNING("watchpoint not set");
+ LOG_WARNING("watchpoint (wpid: %d) not set", watchpoint->unique_id );
+ LOG_DEBUG("Watchpoint (ID: %d) address: 0x%08" PRIx32 " set=%d ",
+ watchpoint->unique_id, watchpoint->address,watchpoint->set );
+
dwt_num = watchpoint->set - 1;
if ((dwt_num < 0) || (dwt_num >= cortex_m3->dwt_num_comp))
dwt_num = watchpoint->set - 1;
if ((dwt_num < 0) || (dwt_num >= cortex_m3->dwt_num_comp))
}
cortex_m3->dwt_comp_available--;
}
cortex_m3->dwt_comp_available--;
+ LOG_DEBUG("dwt_comp_available: %d", cortex_m3->dwt_comp_available);
}
cortex_m3->dwt_comp_available++;
}
cortex_m3->dwt_comp_available++;
+ LOG_DEBUG("dwt_comp_available: %d", cortex_m3->dwt_comp_available);
bp_num++;
if (bp_num >= mips32->num_inst_bpoints)
{
bp_num++;
if (bp_num >= mips32->num_inst_bpoints)
{
- LOG_DEBUG("ERROR Can not find free FP Comparator");
+ LOG_DEBUG("ERROR Can not find free FP Comparator(bpid: %d)",
+ breakpoint->unique_id );
LOG_WARNING("ERROR Can not find free FP Comparator");
exit(-1);
}
LOG_WARNING("ERROR Can not find free FP Comparator");
exit(-1);
}
target_write_u32(target, comparator_list[bp_num].reg_address, comparator_list[bp_num].bp_value);
target_write_u32(target, comparator_list[bp_num].reg_address + 0x08, 0x00000000);
target_write_u32(target, comparator_list[bp_num].reg_address + 0x18, 1);
target_write_u32(target, comparator_list[bp_num].reg_address, comparator_list[bp_num].bp_value);
target_write_u32(target, comparator_list[bp_num].reg_address + 0x08, 0x00000000);
target_write_u32(target, comparator_list[bp_num].reg_address + 0x18, 1);
- LOG_DEBUG("bp_num %i bp_value 0x%" PRIx32 "", bp_num, comparator_list[bp_num].bp_value);
+ LOG_DEBUG("bpid: %d, bp_num %i bp_value 0x%" PRIx32 "",
+ breakpoint->unique_id,
+ bp_num, comparator_list[bp_num].bp_value);
}
else if (breakpoint->type == BKPT_SOFT)
{
}
else if (breakpoint->type == BKPT_SOFT)
{
+ LOG_DEBUG("bpid: %d", breakpoint->unique_id );
if (breakpoint->length == 4)
{
uint32_t verify = 0xffffffff;
if (breakpoint->length == 4)
{
uint32_t verify = 0xffffffff;
int bp_num = breakpoint->set - 1;
if ((bp_num < 0) || (bp_num >= mips32->num_inst_bpoints))
{
int bp_num = breakpoint->set - 1;
if ((bp_num < 0) || (bp_num >= mips32->num_inst_bpoints))
{
- LOG_DEBUG("Invalid FP Comparator number in breakpoint");
+ LOG_DEBUG("Invalid FP Comparator number in breakpoint (bpid: %d)",
+ breakpoint->unique_id);
+ LOG_DEBUG("bpid: %d - releasing hw: %d",
+ breakpoint->unique_id,
+ bp_num );
comparator_list[bp_num].used = 0;
comparator_list[bp_num].bp_value = 0;
target_write_u32(target, comparator_list[bp_num].reg_address + 0x18, 0);
comparator_list[bp_num].used = 0;
comparator_list[bp_num].bp_value = 0;
target_write_u32(target, comparator_list[bp_num].reg_address + 0x18, 0);
}
else
{
/* restore original instruction (kept in target endianness) */
}
else
{
/* restore original instruction (kept in target endianness) */
+ LOG_DEBUG("bpid: %d", breakpoint->unique_id);
if (breakpoint->length == 4)
{
uint32_t current_instr;
if (breakpoint->length == 4)
{
uint32_t current_instr;
Linking to existing account procedure
If you already have an account and want to add another login method
you
MUST first sign in with your existing account and
then change URL to read
https://review.openocd.org/login/?link
to get to this page again but this time it'll work for linking. Thank you.
SSH host keys fingerprints
1024 SHA256:YKx8b7u5ZWdcbp7/4AeXNaqElP49m6QrwfXaqQGJAOk gerrit-code-review@openocd.zylin.com (DSA)
384 SHA256:jHIbSQa4REvwCFG4cq5LBlBLxmxSqelQPem/EXIrxjk gerrit-code-review@openocd.org (ECDSA)
521 SHA256:UAOPYkU9Fjtcao0Ul/Rrlnj/OsQvt+pgdYSZ4jOYdgs gerrit-code-review@openocd.org (ECDSA)
256 SHA256:A13M5QlnozFOvTllybRZH6vm7iSt0XLxbA48yfc2yfY gerrit-code-review@openocd.org (ECDSA)
256 SHA256:spYMBqEYoAOtK7yZBrcwE8ZpYt6b68Cfh9yEVetvbXg gerrit-code-review@openocd.org (ED25519)
+--[ED25519 256]--+
|=.. |
|+o.. . |
|*.o . . |
|+B . . . |
|Bo. = o S |
|Oo.+ + = |
|oB=.* = . o |
| =+=.+ + E |
|. .=o . o |
+----[SHA256]-----+
2048 SHA256:0Onrb7/PHjpo6iVZ7xQX2riKN83FJ3KGU0TvI0TaFG4 gerrit-code-review@openocd.zylin.com (RSA)