summaryrefslogtreecommitdiffstats
path: root/cpukit/libdebugger/rtems-debugger-threads.c
diff options
context:
space:
mode:
Diffstat (limited to 'cpukit/libdebugger/rtems-debugger-threads.c')
-rw-r--r--cpukit/libdebugger/rtems-debugger-threads.c61
1 files changed, 37 insertions, 24 deletions
diff --git a/cpukit/libdebugger/rtems-debugger-threads.c b/cpukit/libdebugger/rtems-debugger-threads.c
index 4f8c062e7f..bc6e952b11 100644
--- a/cpukit/libdebugger/rtems-debugger-threads.c
+++ b/cpukit/libdebugger/rtems-debugger-threads.c
@@ -1,5 +1,6 @@
/*
- * Copyright (c) 2016 Chris Johns <chrisj@rtems.org>. All rights reserved.
+ * Copyright (c) 2016-2017 Chris Johns <chrisj@rtems.org>.
+ * All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
@@ -43,6 +44,7 @@ static const char * const excludes_defaults[] =
"IRQS",
"DBSs",
"DBSe",
+ "IDLE",
};
static void
@@ -240,23 +242,13 @@ snapshot_thread(rtems_tcb* tcb, void* arg)
* See if there is a valid exception stack frame and if the thread is being
* debugged.
*/
- r = rtems_debugger_target_set_exception_frame(thread);
- if (r < 0) {
- rtems_debugger_printf("error: rtems-db: thread: snap: %08lx: not valid frame\n",
- id);
- }
-
- /*
- * Read the target registers into the thread register array.
- */
- rtems_debugger_target_read_regs(thread);
+ rtems_debugger_target_exception_thread(thread);
/*
- * Debugger threads are stopped for breakpoint, segv or other errors have
- * the RTEMS_DEBUGGER_THREAD_FLAG_DEBUGGING set.
+ * Exception threads have stopped for breakpoint, segv or other errors.
*/
if (rtems_debugger_thread_flag(thread,
- RTEMS_DEBUGGER_THREAD_FLAG_DEBUGGING)) {
+ RTEMS_DEBUGGER_THREAD_FLAG_EXCEPTION)) {
rtems_id* stopped;
r = rtems_debugger_block_resize(&threads->stopped);
if (r < 0) {
@@ -276,6 +268,11 @@ snapshot_thread(rtems_tcb* tcb, void* arg)
}
}
+ /*
+ * Read the target registers into the thread register array.
+ */
+ rtems_debugger_target_read_regs(thread);
+
if (rtems_debugger_server_flag(RTEMS_DEBUGGER_FLAG_VERBOSE))
rtems_debugger_printf("rtems-db: sys: thd: %08lx: signal: %d\n",
id, thread->signal);
@@ -300,6 +297,8 @@ rtems_debugger_thread_system_suspend(void)
if (rtems_debugger_verbose())
rtems_debugger_printf("rtems-db: sys: : suspending\n");
r = rtems_debugger_target_swbreak_remove();
+ if (r == 0)
+ r = rtems_debugger_target_hwbreak_remove();
if (r == 0) {
rtems_debugger_thread* current;
threads->current.level = 0;
@@ -352,15 +351,19 @@ rtems_debugger_thread_system_resume(bool detaching)
size_t i;
if (rtems_debugger_verbose())
rtems_debugger_printf("rtems-db: sys: : resuming\n");
- if (!detaching)
+ if (!detaching) {
r = rtems_debugger_target_swbreak_insert();
+ if (r == 0)
+ r = rtems_debugger_target_hwbreak_insert();
+ }
if (r == 0) {
for (i = 0; i < threads->current.level; ++i) {
rtems_debugger_thread* thread = &current[i];
rtems_status_code sc;
int rr;
/*
- * Check if resuming, which is continuing, a step, or stepping a range.
+ * Check if resuming, which can be continuing, a step, or stepping a
+ * range.
*/
if (detaching ||
rtems_debugger_thread_flag(thread,
@@ -376,10 +379,18 @@ rtems_debugger_thread_system_resume(bool detaching)
r = rr;
}
}
- sc = rtems_task_resume(thread->id);
- if (sc != RTEMS_SUCCESSFUL) {
- rtems_debugger_printf("error: rtems-db: thread: resume: %08lx: %s\n",
- thread->id, rtems_status_text(sc));
+ if (rtems_debugger_verbose())
+ rtems_debugger_printf("rtems-db: sys: : resume: 0x%08lx\n",
+ thread->id);
+ if (rtems_debugger_thread_flag(thread,
+ RTEMS_DEBUGGER_THREAD_FLAG_EXCEPTION)) {
+ rtems_debugger_target_exception_thread_resume(thread);
+ } else {
+ sc = rtems_task_resume(thread->id);
+ if (sc != RTEMS_SUCCESSFUL) {
+ rtems_debugger_printf("error: rtems-db: thread: resume: %08lx: %s\n",
+ thread->id, rtems_status_text(sc));
+ }
}
thread->flags &= ~(RTEMS_DEBUGGER_THREAD_FLAG_CONTINUE |
RTEMS_DEBUGGER_THREAD_FLAG_STEP);
@@ -420,10 +431,12 @@ rtems_debugger_thread_continue_all(void)
size_t i;
for (i = 0; i < threads->current.level; ++i) {
rtems_debugger_thread* thread = &current[i];
- int r;
- r = rtems_debugger_thread_continue(thread);
- if (r < 0)
- break;
+ if (!rtems_debugger_thread_flag(thread,
+ RTEMS_DEBUGGER_THREAD_FLAG_STEP_INSTR)) {
+ r = rtems_debugger_thread_continue(thread);
+ if (r < 0)
+ break;
+ }
}
}
else {