diff options
| author | Mole Shang <135e2@135e2.dev> | 2024-02-11 14:44:22 +0800 | 
|---|---|---|
| committer | Mole Shang <135e2@135e2.dev> | 2024-02-11 16:06:15 +0800 | 
| commit | 2fe04bc8faa4bf737a86c36a8017473e84814f3b (patch) | |
| tree | 2146d3dae86f21060e2e807ad364f5a949fd1c53 /kernel/printf.c | |
| parent | 5ce1f630132d8b7b35b9dc46b4a55f860eb85d5c (diff) | |
| parent | 48a5e34fcd07852b4a68825ce8e37feb6f6d04d7 (diff) | |
| download | xv6-labs-2fe04bc8faa4bf737a86c36a8017473e84814f3b.tar.gz xv6-labs-2fe04bc8faa4bf737a86c36a8017473e84814f3b.tar.bz2 xv6-labs-2fe04bc8faa4bf737a86c36a8017473e84814f3b.zip | |
Merge branch 'traps' into cow
Conflicts:
	.gitignore
	Makefile
	conf/lab.mk
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); +  } +} | 
