Add backtrace helpers
authorBarret Rhoden <brho@cs.berkeley.edu>
Mon, 30 Jul 2018 20:00:00 +0000 (16:00 -0400)
committerBarret Rhoden <brho@cs.berkeley.edu>
Mon, 30 Jul 2018 20:06:25 +0000 (16:06 -0400)
Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
kern/include/kdebug.h
kern/src/kdebug.c

index cde8b96..88d3521 100644 (file)
@@ -4,7 +4,9 @@
 #include <ros/trapframe.h>
 #include <arch/kdebug.h>
 #include <profiler.h>
-/* for includes */ struct proc;
+/* for includes */
+struct proc;
+struct kthread;
 
 struct symtab_entry {
        const char *name;
@@ -19,6 +21,8 @@ struct symtab_entry {
 /*** Printk Backtraces, usually used for debugging or from the monitor */
 /* Backtraces the calling kernel context */
 void backtrace(void);
+void backtrace_trace(void);
+void backtrace_trace_printx(void);
 /* Backtraces a PC/FP, with no protections */
 void backtrace_frame(uintptr_t pc, uintptr_t fp);
 /* Backtraces a user PC/FP */
@@ -29,6 +33,7 @@ void backtrace_hwtf(struct hw_trapframe *hw_tf);
 void backtrace_user_ctx(struct proc *p, struct user_context *ctx);
 /* Backtraces the current user context, if there is one */
 void backtrace_current_ctx(void);
+void backtrace_kthread(struct kthread *kth);
 
 /*** Programmatic Backtraces */
 /* Backtraces a PC/FP, stores results in *pcs, with no protections */
index c1c598b..ec632e6 100644 (file)
@@ -221,6 +221,34 @@ void backtrace(void)
        print_unlock();
 }
 
+static void trace_printk_func(void *opaque, const char *str)
+{
+       trace_printk("%s", str);
+}
+
+void backtrace_trace(void)
+{
+       /* Don't need this strictly, but it helps serialize to the trace buf */
+       print_lock();
+       trace_printk("Stack Backtrace on Core %d:\n", core_id());
+       gen_backtrace(&trace_printk_func, NULL);
+       print_unlock();
+}
+
+static void trace_printx_func(void *opaque, const char *str)
+{
+       trace_printx("%s", str);
+}
+
+void backtrace_trace_printx(void)
+{
+       /* Don't need this strictly, but it helps serialize to the trace buf */
+       print_lock();
+       trace_printx("Stack Backtrace on Core %d:\n", core_id());
+       gen_backtrace(&trace_printk_func, NULL);
+       print_unlock();
+}
+
 void backtrace_frame(uintptr_t eip, uintptr_t ebp)
 {
        uintptr_t pcs[MAX_BT_DEPTH];
@@ -278,3 +306,9 @@ void backtrace_current_ctx(void)
        if (current)
                backtrace_user_ctx(current, current_ctx);
 }
+
+void backtrace_kthread(struct kthread *kth)
+{
+       backtrace_frame(jmpbuf_get_pc(&kth->context),
+                       jmpbuf_get_fp(&kth->context));
+}