diff options
author | drath <drath@b42882b7-edfa-0310-969c-e2dbd0fdcd60> | 2006-11-07 10:54:19 +0000 |
---|---|---|
committer | drath <drath@b42882b7-edfa-0310-969c-e2dbd0fdcd60> | 2006-11-07 10:54:19 +0000 |
commit | 03e8f264f4c66baec9b86778d3488b23e0a8c0b6 (patch) | |
tree | c7fb8e62c0461f3832519ed30b72782e251b9b49 /src/target/breakpoints.c | |
parent | 83440065c00cce9d36f23182b439d7bf2306cfb2 (diff) | |
download | openocd+libswd-03e8f264f4c66baec9b86778d3488b23e0a8c0b6.tar.gz openocd+libswd-03e8f264f4c66baec9b86778d3488b23e0a8c0b6.tar.bz2 openocd+libswd-03e8f264f4c66baec9b86778d3488b23e0a8c0b6.tar.xz openocd+libswd-03e8f264f4c66baec9b86778d3488b23e0a8c0b6.zip |
- added support for the oocd-link (http://www.joernonline.de/dw/doku.php?id=en:projects:oocdlink)
- fixed breakpoint handling (this changes the target_t interface)
git-svn-id: svn://svn.berlios.de/openocd/trunk@113 b42882b7-edfa-0310-969c-e2dbd0fdcd60
Diffstat (limited to 'src/target/breakpoints.c')
-rw-r--r-- | src/target/breakpoints.c | 58 |
1 files changed, 35 insertions, 23 deletions
diff --git a/src/target/breakpoints.c b/src/target/breakpoints.c index a30d67a4..8b140b3e 100644 --- a/src/target/breakpoints.c +++ b/src/target/breakpoints.c @@ -56,17 +56,29 @@ int breakpoint_add(target_t *target, u32 address, u32 length, enum breakpoint_ty breakpoint_p = &breakpoint->next; breakpoint = breakpoint->next; } + + (*breakpoint_p) = malloc(sizeof(breakpoint_t)); + (*breakpoint_p)->address = address; + (*breakpoint_p)->length = length; + (*breakpoint_p)->type = type; + (*breakpoint_p)->set = 0; + (*breakpoint_p)->orig_instr = malloc(CEIL(length, 8)); + (*breakpoint_p)->next = NULL; - if ((retval = target->type->add_breakpoint(target, address, length, type)) != ERROR_OK) + if ((retval = target->type->add_breakpoint(target, *breakpoint_p)) != ERROR_OK) { switch (retval) { case ERROR_TARGET_RESOURCE_NOT_AVAILABLE: - INFO("can't add %s breakpoint, resource not available", breakpoint_type_strings[type]); + INFO("can't add %s breakpoint, resource not available", breakpoint_type_strings[(*breakpoint_p)->type]); + free (*breakpoint_p); + *breakpoint_p = NULL; return retval; break; case ERROR_TARGET_NOT_HALTED: INFO("can't add breakpoint while target is running"); + free (*breakpoint_p); + *breakpoint_p = NULL; return retval; break; default: @@ -76,15 +88,9 @@ int breakpoint_add(target_t *target, u32 address, u32 length, enum breakpoint_ty } } - (*breakpoint_p) = malloc(sizeof(breakpoint_t)); - (*breakpoint_p)->address = address; - (*breakpoint_p)->length = length; - (*breakpoint_p)->type = type; - (*breakpoint_p)->set = 0; - (*breakpoint_p)->orig_instr = malloc(CEIL(length, 8)); - (*breakpoint_p)->next = NULL; - - DEBUG("added %s breakpoint at 0x%8.8x of length 0x%8.8x", breakpoint_type_strings[type], address, length); + DEBUG("added %s breakpoint at 0x%8.8x of length 0x%8.8x", + breakpoint_type_strings[(*breakpoint_p)->type], + (*breakpoint_p)->address, (*breakpoint_p)->length); return ERROR_OK; } @@ -159,16 +165,29 @@ int watchpoint_add(target_t *target, u32 address, u32 length, enum watchpoint_rw watchpoint = watchpoint->next; } - if ((retval = target->type->add_watchpoint(target, address, length, rw)) != ERROR_OK) + (*watchpoint_p) = malloc(sizeof(watchpoint_t)); + (*watchpoint_p)->address = address; + (*watchpoint_p)->length = length; + (*watchpoint_p)->value = value; + (*watchpoint_p)->mask = mask; + (*watchpoint_p)->rw = rw; + (*watchpoint_p)->set = 0; + (*watchpoint_p)->next = NULL; + + if ((retval = target->type->add_watchpoint(target, *watchpoint_p)) != ERROR_OK) { switch (retval) { case ERROR_TARGET_RESOURCE_NOT_AVAILABLE: - INFO("can't add %s watchpoint, resource not available", watchpoint_rw_strings[rw]); + INFO("can't add %s watchpoint, resource not available", watchpoint_rw_strings[(*watchpoint_p)->rw]); + free (*watchpoint_p); + *watchpoint_p = NULL; return retval; break; case ERROR_TARGET_NOT_HALTED: INFO("can't add watchpoint while target is running"); + free (*watchpoint_p); + *watchpoint_p = NULL; return retval; break; default: @@ -178,16 +197,9 @@ int watchpoint_add(target_t *target, u32 address, u32 length, enum watchpoint_rw } } - (*watchpoint_p) = malloc(sizeof(watchpoint_t)); - (*watchpoint_p)->address = address; - (*watchpoint_p)->length = length; - (*watchpoint_p)->value = value; - (*watchpoint_p)->mask = mask; - (*watchpoint_p)->rw = rw; - (*watchpoint_p)->set = 0; - (*watchpoint_p)->next = NULL; - - DEBUG("added %s watchpoint at 0x%8.8x of length 0x%8.8x", watchpoint_rw_strings[rw], address, length); + DEBUG("added %s watchpoint at 0x%8.8x of length 0x%8.8x", + watchpoint_rw_strings[(*watchpoint_p)->rw], + (*watchpoint_p)->address, (*watchpoint_p)->length); return ERROR_OK; } |