summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorDavid Brownell <dbrownell@users.sourceforge.net>2009-10-08 07:32:47 -0700
committerDavid Brownell <dbrownell@users.sourceforge.net>2009-10-08 07:32:47 -0700
commit22aff82cae0de384f931b4cea89c4f52ec976407 (patch)
treee2de51541c735b15110bfe792f4926fc448d7179 /src
parent6efaa95c44f57d1789ca8cd6cec8bba2f75b0cb5 (diff)
parent4aacf01e194d09fb55dc759fc42ac42c8432c015 (diff)
downloadopenocd+libswd-22aff82cae0de384f931b4cea89c4f52ec976407.tar.gz
openocd+libswd-22aff82cae0de384f931b4cea89c4f52ec976407.tar.bz2
openocd+libswd-22aff82cae0de384f931b4cea89c4f52ec976407.tar.xz
openocd+libswd-22aff82cae0de384f931b4cea89c4f52ec976407.zip
Merge branch 'master' of ssh://dbrownell@openocd.git.sourceforge.net/gitroot/openocd/openocd
Diffstat (limited to 'src')
-rw-r--r--src/helper/jim.c5
-rw-r--r--src/server/gdb_server.c2
-rw-r--r--src/target/target.c18
-rw-r--r--src/target/target.h10
4 files changed, 29 insertions, 6 deletions
diff --git a/src/helper/jim.c b/src/helper/jim.c
index c1ba0d9d..48e21e9e 100644
--- a/src/helper/jim.c
+++ b/src/helper/jim.c
@@ -3,11 +3,14 @@
* Copyright 2005 Salvatore Sanfilippo <antirez@invece.org>
* Copyright 2005 Clemens Hintze <c.hintze@gmx.net>
* Copyright 2005 patthoyts - Pat Thoyts <patthoyts@users.sf.net>
- * Copyright 2008 oharboe - Øyvind Harboe - oyvind.harboe@zylin.com
+ * Copyright 2008,2009 oharboe - Øyvind Harboe - oyvind.harboe@zylin.com
* Copyright 2008 Andrew Lunn <andrew@lunn.ch>
* Copyright 2008 Duane Ellis <openocd@duaneellis.com>
* Copyright 2008 Uwe Klein <uklein@klein-messgeraete.de>
* Copyright 2008 Steve Bennett <steveb@workware.net.au>
+ * Copyright 2009 Nico Coesel <ncoesel@dealogic.nl>
+ * Copyright 2009 Zachary T Welch zw@superlucidity.net
+ * Copyright 2009 David Brownell
*
* The FreeBSD license
*
diff --git a/src/server/gdb_server.c b/src/server/gdb_server.c
index 44d9de83..a0077e93 100644
--- a/src/server/gdb_server.c
+++ b/src/server/gdb_server.c
@@ -714,7 +714,7 @@ int gdb_target_callback_event_handler(struct target_s *target, enum target_event
target_handle_event(target, event);
switch (event)
{
- case TARGET_EVENT_EARLY_HALTED:
+ case TARGET_EVENT_GDB_HALT:
gdb_frontend_halted(target, connection);
break;
case TARGET_EVENT_HALTED:
diff --git a/src/target/target.c b/src/target/target.c
index 0040ba0a..253a7e46 100644
--- a/src/target/target.c
+++ b/src/target/target.c
@@ -157,7 +157,7 @@ static const Jim_Nvp nvp_target_event[] = {
{ .value = TARGET_EVENT_OLD_gdb_program_config , .name = "old-gdb_program_config" },
{ .value = TARGET_EVENT_OLD_pre_resume , .name = "old-pre_resume" },
- { .value = TARGET_EVENT_EARLY_HALTED, .name = "early-halted" },
+ { .value = TARGET_EVENT_GDB_HALT, .name = "gdb-halt" },
{ .value = TARGET_EVENT_HALTED, .name = "halted" },
{ .value = TARGET_EVENT_RESUMED, .name = "resumed" },
{ .value = TARGET_EVENT_RESUME_START, .name = "resume-start" },
@@ -821,7 +821,7 @@ int target_call_event_callbacks(target_t *target, enum target_event event)
if (event == TARGET_EVENT_HALTED)
{
/* execute early halted first */
- target_call_event_callbacks(target, TARGET_EVENT_EARLY_HALTED);
+ target_call_event_callbacks(target, TARGET_EVENT_GDB_HALT);
}
LOG_DEBUG("target event %i (%s)",
@@ -1658,6 +1658,15 @@ static int sense_handler(void)
return ERROR_OK;
}
+static void target_call_event_callbacks_all(enum target_event e) {
+ target_t *target;
+ target = all_targets;
+ while (target) {
+ target_call_event_callbacks(target, e);
+ target = target->next;
+ }
+}
+
/* process target state changes */
int handle_target(void *priv)
{
@@ -1676,6 +1685,7 @@ int handle_target(void *priv)
int did_something = 0;
if (runSrstAsserted)
{
+ target_call_event_callbacks_all(TARGET_EVENT_GDB_HALT);
Jim_Eval(interp, "srst_asserted");
did_something = 1;
}
@@ -1686,6 +1696,7 @@ int handle_target(void *priv)
}
if (runPowerDropout)
{
+ target_call_event_callbacks_all(TARGET_EVENT_GDB_HALT);
Jim_Eval(interp, "power_dropout");
did_something = 1;
}
@@ -1726,7 +1737,10 @@ int handle_target(void *priv)
{
/* polling may fail silently until the target has been examined */
if ((retval = target_poll(target)) != ERROR_OK)
+ {
+ target_call_event_callbacks(target, TARGET_EVENT_GDB_HALT);
return retval;
+ }
}
}
diff --git a/src/target/target.h b/src/target/target.h
index 0ff2258a..6547d4d7 100644
--- a/src/target/target.h
+++ b/src/target/target.h
@@ -163,8 +163,14 @@ enum target_event
/* allow GDB to do stuff before others handle the halted event,
* this is in lieu of defining ordering of invocation of events,
- * which would be more complicated */
- TARGET_EVENT_EARLY_HALTED,
+ * which would be more complicated
+ *
+ * Telling GDB to halt does not mean that the target stopped running,
+ * simply that we're dropping out of GDB's waiting for step or continue.
+ *
+ * This can be useful when e.g. detecting power dropout.
+ */
+ TARGET_EVENT_GDB_HALT,
TARGET_EVENT_HALTED, /* target entered debug state from normal execution or reset */
TARGET_EVENT_RESUMED, /* target resumed to normal execution */
TARGET_EVENT_RESUME_START,