From 84dfdfd97f291f5df95fda25bf9fca7ff32ee7a4 Mon Sep 17 00:00:00 2001
From: Rahix <rahix@rahix.de>
Date: Sun, 15 Sep 2019 22:47:07 +0200
Subject: [PATCH] feat(gdb): Add task_backtrace command

The task_backtrace (aliased as tbt) command allows viewing the backtrace
of a task which is currently not running.

Signed-off-by: Rahix <rahix@rahix.de>
---
 init.gdb | 30 ++++++++++++++++++++++++++++++
 1 file changed, 30 insertions(+)

diff --git a/init.gdb b/init.gdb
index 607cb82bd..151639c28 100644
--- a/init.gdb
+++ b/init.gdb
@@ -3,3 +3,33 @@ target remote localhost:3333
 define reset
     mon mww 0x40000004 0x80000000
 end
+
+
+# usage: task_backtrace <tskTCB*>
+define task_backtrace
+    set $taskbt_task_ptr = $arg0
+    set $taskbt_stack_ptr = $taskbt_task_ptr->pxTopOfStack
+
+    set $taskbt_frame_offset = 9
+    if ((*(uint32_t*)($taskbt_stack_ptr + 8)) & 0x10 == 0)
+        echo FPU is on\n
+        set $taskbt_frame_offset += 16
+    else
+        echo FPU is off\n
+    end
+
+    set $taskbt_reg_lr = $lr
+    set $taskbt_reg_pc = $pc
+    set $taskbt_reg_sp = $sp
+
+    set $lr = *($taskbt_stack_ptr + $taskbt_frame_offset + 5)
+    set $pc = *($taskbt_stack_ptr + $taskbt_frame_offset + 6)
+    set $sp = $taskbt_stack_ptr + $taskbt_frame_offset + 8
+
+    bt
+
+    set $lr = $taskbt_reg_lr
+    set $pc = $taskbt_reg_pc
+    set $sp = $taskbt_reg_sp
+end
+alias tbt = task_backtrace
-- 
GitLab