Browse Source

Stop GDB when polling fails, srst assert or powerdropout is detected

tags/v0.3.0-rc0
Øyvind Harboe 14 years ago
parent
commit
f525f2ef0d
3 changed files with 25 additions and 5 deletions
  1. +1
    -1
      src/server/gdb_server.c
  2. +16
    -2
      src/target/target.c
  3. +8
    -2
      src/target/target.h

+ 1
- 1
src/server/gdb_server.c View File

@@ -714,7 +714,7 @@ int gdb_target_callback_event_handler(struct target_s *target, enum target_event
target_handle_event(target, event); target_handle_event(target, event);
switch (event) switch (event)
{ {
case TARGET_EVENT_EARLY_HALTED:
case TARGET_EVENT_GDB_HALT:
gdb_frontend_halted(target, connection); gdb_frontend_halted(target, connection);
break; break;
case TARGET_EVENT_HALTED: case TARGET_EVENT_HALTED:


+ 16
- 2
src/target/target.c View File

@@ -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_gdb_program_config , .name = "old-gdb_program_config" },
{ .value = TARGET_EVENT_OLD_pre_resume , .name = "old-pre_resume" }, { .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_HALTED, .name = "halted" },
{ .value = TARGET_EVENT_RESUMED, .name = "resumed" }, { .value = TARGET_EVENT_RESUMED, .name = "resumed" },
{ .value = TARGET_EVENT_RESUME_START, .name = "resume-start" }, { .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) if (event == TARGET_EVENT_HALTED)
{ {
/* execute early halted first */ /* 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)", LOG_DEBUG("target event %i (%s)",
@@ -1658,6 +1658,15 @@ static int sense_handler(void)
return ERROR_OK; 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 */ /* process target state changes */
int handle_target(void *priv) int handle_target(void *priv)
{ {
@@ -1676,6 +1685,7 @@ int handle_target(void *priv)
int did_something = 0; int did_something = 0;
if (runSrstAsserted) if (runSrstAsserted)
{ {
target_call_event_callbacks_all(TARGET_EVENT_GDB_HALT);
Jim_Eval(interp, "srst_asserted"); Jim_Eval(interp, "srst_asserted");
did_something = 1; did_something = 1;
} }
@@ -1686,6 +1696,7 @@ int handle_target(void *priv)
} }
if (runPowerDropout) if (runPowerDropout)
{ {
target_call_event_callbacks_all(TARGET_EVENT_GDB_HALT);
Jim_Eval(interp, "power_dropout"); Jim_Eval(interp, "power_dropout");
did_something = 1; did_something = 1;
} }
@@ -1726,7 +1737,10 @@ int handle_target(void *priv)
{ {
/* polling may fail silently until the target has been examined */ /* polling may fail silently until the target has been examined */
if ((retval = target_poll(target)) != ERROR_OK) if ((retval = target_poll(target)) != ERROR_OK)
{
target_call_event_callbacks(target, TARGET_EVENT_GDB_HALT);
return retval; return retval;
}
} }
} }




+ 8
- 2
src/target/target.h View File

@@ -163,8 +163,14 @@ enum target_event


/* allow GDB to do stuff before others handle the halted event, /* allow GDB to do stuff before others handle the halted event,
* this is in lieu of defining ordering of invocation of events, * 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_HALTED, /* target entered debug state from normal execution or reset */
TARGET_EVENT_RESUMED, /* target resumed to normal execution */ TARGET_EVENT_RESUMED, /* target resumed to normal execution */
TARGET_EVENT_RESUME_START, TARGET_EVENT_RESUME_START,


Loading…
Cancel
Save