summaryrefslogtreecommitdiff
path: root/src/target
diff options
context:
space:
mode:
authordrath <drath@b42882b7-edfa-0310-969c-e2dbd0fdcd60>2006-11-07 10:54:19 +0000
committerdrath <drath@b42882b7-edfa-0310-969c-e2dbd0fdcd60>2006-11-07 10:54:19 +0000
commit03e8f264f4c66baec9b86778d3488b23e0a8c0b6 (patch)
treec7fb8e62c0461f3832519ed30b72782e251b9b49 /src/target
parent83440065c00cce9d36f23182b439d7bf2306cfb2 (diff)
downloadopenocd_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')
-rw-r--r--src/target/arm7_9_common.c17
-rw-r--r--src/target/arm7_9_common.h4
-rw-r--r--src/target/breakpoints.c58
-rw-r--r--src/target/target.h4
4 files changed, 48 insertions, 35 deletions
diff --git a/src/target/arm7_9_common.c b/src/target/arm7_9_common.c
index 7bf042a9..cd7e7fe1 100644
--- a/src/target/arm7_9_common.c
+++ b/src/target/arm7_9_common.c
@@ -253,7 +253,7 @@ int arm7_9_unset_breakpoint(struct target_s *target, breakpoint_t *breakpoint)
return ERROR_OK;
}
-int arm7_9_add_breakpoint(struct target_s *target, u32 address, u32 length, enum breakpoint_type type)
+int arm7_9_add_breakpoint(struct target_s *target, breakpoint_t *breakpoint)
{
armv4_5_common_t *armv4_5 = target->arch_info;
arm7_9_common_t *arm7_9 = armv4_5->arch_info;
@@ -266,28 +266,29 @@ int arm7_9_add_breakpoint(struct target_s *target, u32 address, u32 length, enum
if (arm7_9->force_hw_bkpts)
{
- type = BKPT_HARD;
+ DEBUG("forcing use of hardware breakpoint at address 0x%8.8x", breakpoint->address);
+ breakpoint->type = BKPT_HARD;
}
- if ((type == BKPT_SOFT) && (arm7_9->sw_bkpts_enabled == 0))
+ if ((breakpoint->type == BKPT_SOFT) && (arm7_9->sw_bkpts_enabled == 0))
{
INFO("sw breakpoint requested, but software breakpoints not enabled");
return ERROR_TARGET_RESOURCE_NOT_AVAILABLE;
}
- if ((type == BKPT_HARD) && (arm7_9->wp_available < 1))
+ if ((breakpoint->type == BKPT_HARD) && (arm7_9->wp_available < 1))
{
INFO("no watchpoint unit available for hardware breakpoint");
return ERROR_TARGET_RESOURCE_NOT_AVAILABLE;
}
- if ((length != 2) && (length != 4))
+ if ((breakpoint->length != 2) && (breakpoint->length != 4))
{
INFO("only breakpoints of two (Thumb) or four (ARM) bytes length supported");
return ERROR_TARGET_RESOURCE_NOT_AVAILABLE;
}
- if (type == BKPT_HARD)
+ if (breakpoint->type == BKPT_HARD)
arm7_9->wp_available--;
return ERROR_OK;
@@ -406,7 +407,7 @@ int arm7_9_unset_watchpoint(struct target_s *target, watchpoint_t *watchpoint)
return ERROR_OK;
}
-int arm7_9_add_watchpoint(struct target_s *target, u32 address, u32 length, enum watchpoint_rw rw)
+int arm7_9_add_watchpoint(struct target_s *target, watchpoint_t *watchpoint)
{
armv4_5_common_t *armv4_5 = target->arch_info;
arm7_9_common_t *arm7_9 = armv4_5->arch_info;
@@ -422,7 +423,7 @@ int arm7_9_add_watchpoint(struct target_s *target, u32 address, u32 length, enum
return ERROR_TARGET_RESOURCE_NOT_AVAILABLE;
}
- if ((length != 1) && (length != 2) && (length != 4))
+ if ((watchpoint->length != 1) && (watchpoint->length != 2) && (watchpoint->length != 4))
{
return ERROR_TARGET_RESOURCE_NOT_AVAILABLE;
}
diff --git a/src/target/arm7_9_common.h b/src/target/arm7_9_common.h
index 08468907..fc90c059 100644
--- a/src/target/arm7_9_common.h
+++ b/src/target/arm7_9_common.h
@@ -114,9 +114,9 @@ int arm7_9_bulk_write_memory(target_t *target, u32 address, u32 count, u8 *buffe
int arm7_9_run_algorithm(struct target_s *target, int num_mem_params, mem_param_t *mem_params, int num_reg_prams, reg_param_t *reg_param, u32 entry_point, void *arch_info);
-int arm7_9_add_breakpoint(struct target_s *target, u32 address, u32 length, enum breakpoint_type type);
+int arm7_9_add_breakpoint(struct target_s *target, breakpoint_t *breakpoint);
int arm7_9_remove_breakpoint(struct target_s *target, breakpoint_t *breakpoint);
-int arm7_9_add_watchpoint(struct target_s *target, u32 address, u32 length, enum watchpoint_rw rw);
+int arm7_9_add_watchpoint(struct target_s *target, watchpoint_t *watchpoint);
int arm7_9_remove_watchpoint(struct target_s *target, watchpoint_t *watchpoint);
void arm7_9_enable_eice_step(target_t *target);
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;
}
diff --git a/src/target/target.h b/src/target/target.h
index 72018671..04157fde 100644
--- a/src/target/target.h
+++ b/src/target/target.h
@@ -125,9 +125,9 @@ typedef struct target_type_s
/* target break-/watchpoint control
* rw: 0 = write, 1 = read, 2 = access
*/
- int (*add_breakpoint)(struct target_s *target, u32 address, u32 length, enum breakpoint_type type);
+ int (*add_breakpoint)(struct target_s *target, breakpoint_t *breakpoint);
int (*remove_breakpoint)(struct target_s *target, breakpoint_t *breakpoint);
- int (*add_watchpoint)(struct target_s *target, u32 address, u32 length, enum watchpoint_rw rw);
+ int (*add_watchpoint)(struct target_s *target, watchpoint_t *watchpoint);
int (*remove_watchpoint)(struct target_s *target, watchpoint_t *watchpoint);
/* target algorithm support */