From 48a5e34fcd07852b4a68825ce8e37feb6f6d04d7 Mon Sep 17 00:00:00 2001
From: Mole Shang <135e2@135e2.dev>
Date: Sun, 11 Feb 2024 14:41:35 +0800
Subject: lab traps: finish

---
 kernel/printf.c | 17 +++++++++++++++++
 1 file changed, 17 insertions(+)

(limited to 'kernel/printf.c')

diff --git a/kernel/printf.c b/kernel/printf.c
index 1a50203..509c1c5 100644
--- a/kernel/printf.c
+++ b/kernel/printf.c
@@ -122,6 +122,8 @@ panic(char *s)
   printf("panic: ");
   printf(s);
   printf("\n");
+  backtrace();
+
   panicked = 1; // freeze uart output from other CPUs
   for(;;)
     ;
@@ -133,3 +135,18 @@ printfinit(void)
   initlock(&pr.lock, "pr");
   pr.locking = 1;
 }
+
+void
+backtrace(void)
+{
+  uint64 fp = r_fp();
+  printf("backtrace:\n");
+  uint64 stackpg = PGROUNDDOWN(fp);
+  // Whereever fp points to should always live in the stack page
+  while(PGROUNDDOWN(fp) == stackpg){
+    // print the return addr (stored in fp-8)
+    printf("%p\n", *(uint64 *)(fp-8));
+    // load previous (upper stack) fp
+    fp = *(uint64 *)(fp-16);
+  }
+}
-- 
cgit v1.2.3