Add sza_print_backtrace_list()
authorBarret Rhoden <brho@cs.berkeley.edu>
Tue, 9 Oct 2018 20:08:35 +0000 (16:08 -0400)
committerBarret Rhoden <brho@cs.berkeley.edu>
Tue, 9 Oct 2018 21:45:56 +0000 (17:45 -0400)
This is for generating backtrace text that can be easily exported to
userspace via 9ns device files.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
kern/include/kdebug.h
kern/src/kdebug.c

index 88d3521..083a5da 100644 (file)
@@ -7,6 +7,7 @@
 /* for includes */
 struct proc;
 struct kthread;
+struct sized_alloc;
 
 struct symtab_entry {
        const char *name;
@@ -47,6 +48,8 @@ size_t backtrace_user_list(uintptr_t pc, uintptr_t fp, uintptr_t *pcs,
  * user backtrace. */
 void print_backtrace_list(uintptr_t *pcs, size_t nr_pcs,
                                                  void (*pfunc)(void *, const char *), void *opaque);
+void sza_print_backtrace_list(struct sized_alloc *sza, uintptr_t *pcs,
+                              size_t nr_pcs);
 /* Backtraces the calling kernel context, using pfunc for printing */
 void gen_backtrace(void (*pfunc)(void *, const char *), void *opaque);
 
index ec632e6..d320144 100644 (file)
@@ -196,18 +196,27 @@ void debug_addr_pid(int pid, unsigned long addr)
        proc_decref(p);
 }
 
+#define BT_FMT "#%02d [<%p>] in %s\n"
+
 void print_backtrace_list(uintptr_t *pcs, size_t nr_pcs,
                                                  void (*pfunc)(void *, const char *), void *opaque)
 {
        char bt_line[128];
 
        for (size_t i = 0; i < nr_pcs; i++) {
-               snprintf(bt_line, sizeof(bt_line), "#%02d [<%p>] in %s\n", i + 1,
-                                pcs[i], get_fn_name(pcs[i]));
+               snprintf(bt_line, sizeof(bt_line), BT_FMT, i + 1, pcs[i],
+                        get_fn_name(pcs[i]));
                pfunc(opaque, bt_line);
        }
 }
 
+void sza_print_backtrace_list(struct sized_alloc *sza, uintptr_t *pcs,
+                              size_t nr_pcs)
+{
+       for (size_t i = 0; i < nr_pcs; i++)
+               sza_printf(sza, BT_FMT, i + 1, pcs[i], get_fn_name(pcs[i]));
+}
+
 static void printk_func(void *opaque, const char *str)
 {
        printk("%s", str);