From f525f2ef0d95f68d5db02849133f730baa245812 Mon Sep 17 00:00:00 2001 From: =?utf8?q?=C3=98yvind=20Harboe?= Date: Thu, 8 Oct 2009 14:53:25 +0200 Subject: [PATCH] Stop GDB when polling fails, srst assert or powerdropout is detected --- src/server/gdb_server.c | 2 +- src/target/target.c | 18 ++++++++++++++++-- src/target/target.h | 10 ++++++++-- 3 files changed, 25 insertions(+), 5 deletions(-) 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, -- 2.39.5