diff options
author | Galen Sagarin <gps5307@rit.edu> | 2025-04-29 14:18:40 -0400 |
---|---|---|
committer | Galen Sagarin <gps5307@rit.edu> | 2025-04-29 14:18:40 -0400 |
commit | ae2cdd83ba4a0cae161db0b29031d5591005fa34 (patch) | |
tree | 82fbdfcbb1fe4e3b5e232db195c8c331d69489fd /kernel/lib/backtrace.c | |
parent | Started writing fat.c (diff) | |
parent | fs header changes (diff) | |
download | comus-ae2cdd83ba4a0cae161db0b29031d5591005fa34.tar.gz comus-ae2cdd83ba4a0cae161db0b29031d5591005fa34.tar.bz2 comus-ae2cdd83ba4a0cae161db0b29031d5591005fa34.zip |
Merge branch 'main' of https://github.com/kenshineto/kern into fat32
Merging main into here
Diffstat (limited to 'kernel/lib/backtrace.c')
-rw-r--r-- | kernel/lib/backtrace.c | 15 |
1 files changed, 13 insertions, 2 deletions
diff --git a/kernel/lib/backtrace.c b/kernel/lib/backtrace.c index 485cc0f..2507be4 100644 --- a/kernel/lib/backtrace.c +++ b/kernel/lib/backtrace.c @@ -6,6 +6,13 @@ struct stackframe { void *rip; }; +extern char kern_stack_start[]; +extern char kern_stack_end[]; + +#define VALID(frame) \ + (frame && (char *)(frame) >= kern_stack_start && \ + ((char *)(frame) <= kern_stack_end)) + size_t backtrace(void **dst, size_t len) { struct stackframe *rbp; @@ -17,11 +24,13 @@ size_t backtrace_ex(void **dst, size_t len, void *ip, void *bp) { struct stackframe *frame = bp; __asm__("mov %%rbp, %0" : "=r"(frame)); + if (!VALID(frame)) + return 0; if (len > 0) { dst[0] = ip; } size_t i; - for (i = 1; frame && i < len; i++) { + for (i = 1; VALID(frame) && i < len; i++) { dst[i] = frame->rip; frame = frame->rbp; } @@ -38,9 +47,11 @@ void log_backtrace(void) void log_backtrace_ex(void *ip, void *bp) { struct stackframe *frame = bp; + if (!VALID(frame)) + return; kputs("Stack trace:\n"); kprintf(" %p\t%s\n", ip, mboot_get_elf_sym((uint64_t)ip)); - while (frame) { + while (VALID(frame)) { kprintf(" %p\t%s\n", frame->rip, mboot_get_elf_sym((uint64_t)frame->rip)); frame = frame->rbp; |