[PATCH] libdebugger: Work around assert when using _Thread_Executing.

Chris Johns chrisj at rtems.org
Fri Apr 14 07:15:49 UTC 2017


Using _Thread_Executing with RTEMS_DEBUG results in an `assert` if
the server accesses invalid memory.

Updates #2993.
---
 cpukit/libdebugger/rtems-debugger-arm.c    | 3 ++-
 cpukit/libdebugger/rtems-debugger-target.c | 9 ++++++++-
 2 files changed, 10 insertions(+), 2 deletions(-)

diff --git a/cpukit/libdebugger/rtems-debugger-arm.c b/cpukit/libdebugger/rtems-debugger-arm.c
index 8126c1471e..200d758a6b 100644
--- a/cpukit/libdebugger/rtems-debugger-arm.c
+++ b/cpukit/libdebugger/rtems-debugger-arm.c
@@ -717,7 +717,8 @@ target_exception(CPU_Exception_frame* frame)
     "mov  r3, #0\n"                                                     \
     "str  r3, [r2]\n"                 /* clear the FPU frame pointer */ \
     EXCEPTION_ENTRY_FPU(frame_fpu_size)                                 \
-    "msr  cpsr, r1\n"                        /* restore the irq mask */ \
+    "bic  r1, r1, %[psr_i]\n"        /* clear irq mask, debug checks */ \
+    "msr  cpsr, r1\n"       /* restore the state with irq mask clear */ \
     ASM_THUMB_MODE                                                      \
     : ARM_SWITCH_REG_ASM,                                               \
       [o_frame] "=r" (_frame)                                           \
diff --git a/cpukit/libdebugger/rtems-debugger-target.c b/cpukit/libdebugger/rtems-debugger-target.c
index cd1565463e..42772c09c2 100644
--- a/cpukit/libdebugger/rtems-debugger-target.c
+++ b/cpukit/libdebugger/rtems-debugger-target.c
@@ -273,6 +273,8 @@ rtems_debugger_target_swbreak_remove(void)
   return r;
 }
 
+#define DIE_ON_ASSERT 0
+
 rtems_debugger_target_exc_action
 rtems_debugger_target_exception(CPU_Exception_frame* frame)
 {
@@ -284,7 +286,12 @@ rtems_debugger_target_exception(CPU_Exception_frame* frame)
 
   if (!rtems_interrupt_is_in_progress()) {
     rtems_debugger_threads*              threads = rtems_debugger->threads;
-    Thread_Control*                      thread = _Thread_Executing;
+    #if USE_THREAD_EXECUTING
+     Thread_Control*                     thread = _Thread_Executing;
+    #else
+     const Per_CPU_Control*              cpu = _Per_CPU_Get_snapshot();
+     Thread_Control*                     thread = _Per_CPU_Get_executing(cpu);
+    #endif
     rtems_id*                            excludes;
     const rtems_id                       tid = thread->Object.id;
     DB_UINT                              pc;
-- 
2.11.0



More information about the devel mailing list