diff options
author | Mole Shang <[email protected]> | 2024-02-11 14:41:35 +0800 |
---|---|---|
committer | Mole Shang <[email protected]> | 2024-02-11 14:41:35 +0800 |
commit | 48a5e34fcd07852b4a68825ce8e37feb6f6d04d7 (patch) | |
tree | b6ec41ca1889db0122d754b0083c7d1d87cb0818 /kernel/printf.c | |
parent | 3673a2cdfb30e1e3936e695a3fb8adee74488d6b (diff) | |
download | xv6-labs-48a5e34fcd07852b4a68825ce8e37feb6f6d04d7.tar.gz xv6-labs-48a5e34fcd07852b4a68825ce8e37feb6f6d04d7.tar.bz2 xv6-labs-48a5e34fcd07852b4a68825ce8e37feb6f6d04d7.zip |
lab traps: finishtraps
Diffstat (limited to 'kernel/printf.c')
-rw-r--r-- | kernel/printf.c | 17 |
1 files changed, 17 insertions, 0 deletions
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); + } +} |