summaryrefslogtreecommitdiff
path: root/kernel/lib/backtrace.c
diff options
context:
space:
mode:
authorFreya Murphy <freya@freyacat.org>2025-04-24 11:32:21 -0400
committerFreya Murphy <freya@freyacat.org>2025-04-24 11:32:21 -0400
commitf9df808fd5e39a2494a5ab3eb90ea71fdc7b187f (patch)
tree8e0d9b385d5ebc72494e929cd6853c8f5459d0ab /kernel/lib/backtrace.c
parentmake 0x80 ring3, add kernel mem ctx switch in idt handler (diff)
downloadcomus-f9df808fd5e39a2494a5ab3eb90ea71fdc7b187f.tar.gz
comus-f9df808fd5e39a2494a5ab3eb90ea71fdc7b187f.tar.bz2
comus-f9df808fd5e39a2494a5ab3eb90ea71fdc7b187f.zip
only backtrace on valid kernel frames
Diffstat (limited to 'kernel/lib/backtrace.c')
-rw-r--r--kernel/lib/backtrace.c13
1 files changed, 11 insertions, 2 deletions
diff --git a/kernel/lib/backtrace.c b/kernel/lib/backtrace.c
index 485cc0f..102e775 100644
--- a/kernel/lib/backtrace.c
+++ b/kernel/lib/backtrace.c
@@ -6,6 +6,11 @@ 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 +22,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 +45,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;