summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/target/arm7_9_common.c12
-rw-r--r--src/target/breakpoints.c10
-rw-r--r--src/target/cortex_m3.c7
-rw-r--r--src/target/target.c8
-rw-r--r--src/target/target_type.h12
-rw-r--r--src/target/xscale.c12
6 files changed, 23 insertions, 38 deletions
diff --git a/src/target/arm7_9_common.c b/src/target/arm7_9_common.c
index f7b86693..b5553cd8 100644
--- a/src/target/arm7_9_common.c
+++ b/src/target/arm7_9_common.c
@@ -426,12 +426,6 @@ int arm7_9_add_breakpoint(struct target *target, struct breakpoint *breakpoint)
{
struct arm7_9_common *arm7_9 = target_to_arm7_9(target);
- if (target->state != TARGET_HALTED)
- {
- LOG_WARNING("target not halted");
- return ERROR_TARGET_NOT_HALTED;
- }
-
if (arm7_9->breakpoint_count == 0)
{
/* make sure we don't have any dangling breakpoints. This is vital upon
@@ -631,12 +625,6 @@ int arm7_9_add_watchpoint(struct target *target, struct watchpoint *watchpoint)
{
struct arm7_9_common *arm7_9 = target_to_arm7_9(target);
- if (target->state != TARGET_HALTED)
- {
- LOG_WARNING("target not halted");
- return ERROR_TARGET_NOT_HALTED;
- }
-
if (arm7_9->wp_available < 1)
{
return ERROR_TARGET_RESOURCE_NOT_AVAILABLE;
diff --git a/src/target/breakpoints.c b/src/target/breakpoints.c
index 16ab7e0c..2542c41a 100644
--- a/src/target/breakpoints.c
+++ b/src/target/breakpoints.c
@@ -109,6 +109,7 @@ static void breakpoint_free(struct target *target, struct breakpoint *breakpoint
{
struct breakpoint *breakpoint = target->breakpoints;
struct breakpoint **breakpoint_p = &target->breakpoints;
+ int retval;
while (breakpoint)
{
@@ -121,9 +122,9 @@ static void breakpoint_free(struct target *target, struct breakpoint *breakpoint
if (breakpoint == NULL)
return;
- target_remove_breakpoint(target, breakpoint);
+ retval = target_remove_breakpoint(target, breakpoint);
- LOG_DEBUG("BPID: %d", breakpoint->unique_id );
+ LOG_DEBUG("free BPID: %d --> %d", breakpoint->unique_id, retval);
(*breakpoint_p) = breakpoint->next;
free(breakpoint->orig_instr);
free(breakpoint);
@@ -249,6 +250,7 @@ static void watchpoint_free(struct target *target, struct watchpoint *watchpoint
{
struct watchpoint *watchpoint = target->watchpoints;
struct watchpoint **watchpoint_p = &target->watchpoints;
+ int retval;
while (watchpoint)
{
@@ -260,8 +262,8 @@ static void watchpoint_free(struct target *target, struct watchpoint *watchpoint
if (watchpoint == NULL)
return;
- target_remove_watchpoint(target, watchpoint);
- LOG_DEBUG("WPID: %d", watchpoint->unique_id );
+ retval = target_remove_watchpoint(target, watchpoint);
+ LOG_DEBUG("free WPID: %d --> %d", watchpoint->unique_id, retval);
(*watchpoint_p) = watchpoint->next;
free(watchpoint);
}
diff --git a/src/target/cortex_m3.c b/src/target/cortex_m3.c
index 7cfe540a..ad59c785 100644
--- a/src/target/cortex_m3.c
+++ b/src/target/cortex_m3.c
@@ -1141,13 +1141,6 @@ cortex_m3_add_watchpoint(struct target *target, struct watchpoint *watchpoint)
{
struct cortex_m3_common *cortex_m3 = target_to_cm3(target);
- /* REVISIT why check? DWT can be updated with core running ... */
- if (target->state != TARGET_HALTED)
- {
- LOG_WARNING("target not halted");
- return ERROR_TARGET_NOT_HALTED;
- }
-
if (cortex_m3->dwt_comp_available < 1)
{
LOG_DEBUG("no comparators?");
diff --git a/src/target/target.c b/src/target/target.c
index a2bd8868..28387f44 100644
--- a/src/target/target.c
+++ b/src/target/target.c
@@ -606,6 +606,10 @@ int target_bulk_write_memory(struct target *target,
int target_add_breakpoint(struct target *target,
struct breakpoint *breakpoint)
{
+ if (target->state != TARGET_HALTED) {
+ LOG_WARNING("target %s is not halted", target->cmd_name);
+ return ERROR_TARGET_NOT_HALTED;
+ }
return target->type->add_breakpoint(target, breakpoint);
}
int target_remove_breakpoint(struct target *target,
@@ -617,6 +621,10 @@ int target_remove_breakpoint(struct target *target,
int target_add_watchpoint(struct target *target,
struct watchpoint *watchpoint)
{
+ if (target->state != TARGET_HALTED) {
+ LOG_WARNING("target %s is not halted", target->cmd_name);
+ return ERROR_TARGET_NOT_HALTED;
+ }
return target->type->add_watchpoint(target, watchpoint);
}
int target_remove_watchpoint(struct target *target,
diff --git a/src/target/target_type.h b/src/target/target_type.h
index 333b58b4..d141608b 100644
--- a/src/target/target_type.h
+++ b/src/target/target_type.h
@@ -124,18 +124,24 @@ struct target_type
* Target must be halted while this is invoked as this
* will actually set up breakpoints on target.
*
- * The breakpoint hardware will be set up upon adding the first breakpoint.
+ * The breakpoint hardware will be set up upon adding the
+ * first breakpoint.
*
* Upon GDB connection all breakpoints/watchpoints are cleared.
*/
int (*add_breakpoint)(struct target *target, struct breakpoint *breakpoint);
- /* remove breakpoint. hw will only be updated if the target is currently halted.
+ /* remove breakpoint. hw will only be updated if the target
+ * is currently halted.
* However, this method can be invoked on unresponsive targets.
*/
int (*remove_breakpoint)(struct target *target, struct breakpoint *breakpoint);
+
+ /* add watchpoint ... see add_breakpoint() comment above. */
int (*add_watchpoint)(struct target *target, struct watchpoint *watchpoint);
- /* remove watchpoint. hw will only be updated if the target is currently halted.
+
+ /* remove watchpoint. hw will only be updated if the target
+ * is currently halted.
* However, this method can be invoked on unresponsive targets.
*/
int (*remove_watchpoint)(struct target *target, struct watchpoint *watchpoint);
diff --git a/src/target/xscale.c b/src/target/xscale.c
index 1a18ab85..49653a96 100644
--- a/src/target/xscale.c
+++ b/src/target/xscale.c
@@ -2137,12 +2137,6 @@ static int xscale_add_breakpoint(struct target *target,
{
struct xscale_common *xscale = target_to_xscale(target);
- if (target->state != TARGET_HALTED)
- {
- LOG_WARNING("target not halted");
- return ERROR_TARGET_NOT_HALTED;
- }
-
if ((breakpoint->type == BKPT_HARD) && (xscale->ibcr_available < 1))
{
LOG_INFO("no breakpoint unit available for hardware breakpoint");
@@ -2300,12 +2294,6 @@ static int xscale_add_watchpoint(struct target *target,
{
struct xscale_common *xscale = target_to_xscale(target);
- if (target->state != TARGET_HALTED)
- {
- LOG_WARNING("target not halted");
- return ERROR_TARGET_NOT_HALTED;
- }
-
if (xscale->dbr_available < 1)
{
return ERROR_TARGET_RESOURCE_NOT_AVAILABLE;