From d26827ccd6d83056fda47233e79838b4173380f0 Mon Sep 17 00:00:00 2001 From: Advaith Menon Date: Fri, 30 Jan 2026 08:01:36 +0530 Subject: [PATCH] backtrace() phase 1: print return addresses * test via proc.c in userinit (once everything is initialized) --- kernel/Sources.cmake | 1 + kernel/include/backtrace.h | 6 ++++++ kernel/src/backtrace.c | 19 +++++++++++++++++++ kernel/src/proc.c | 5 +++++ 4 files changed, 31 insertions(+) create mode 100644 kernel/include/backtrace.h create mode 100644 kernel/src/backtrace.c diff --git a/kernel/Sources.cmake b/kernel/Sources.cmake index 5b5ed1a..2562294 100644 --- a/kernel/Sources.cmake +++ b/kernel/Sources.cmake @@ -10,6 +10,7 @@ set(kernel_SOURCES gen/vectors.S # C Files + src/backtrace.c src/bio.c src/console.c src/exec.c diff --git a/kernel/include/backtrace.h b/kernel/include/backtrace.h new file mode 100644 index 0000000..fae9bb1 --- /dev/null +++ b/kernel/include/backtrace.h @@ -0,0 +1,6 @@ +#pragma once + +#ifndef __XV6__BACKTRACE__ +#define __XV6__BACKTRACE__ +void backtrace(void); +#endif diff --git a/kernel/src/backtrace.c b/kernel/src/backtrace.c new file mode 100644 index 0000000..f392017 --- /dev/null +++ b/kernel/src/backtrace.c @@ -0,0 +1,19 @@ +#include "backtrace.h" +#include "stdio.h" +#include "asm/x86.h" + +// get next stack pointer - just does some math +#define get_ra(cur_sp) (*((int *) (cur_sp) - 1)) + +#define MAGIC_RETURN_ADDR 0xF00 + + +void backtrace() { + int ebp; + read_ebp(ebp); + cprintf("Backtrace: %d\n", sizeof(int)); + while (ebp != MAGIC_RETURN_ADDR) { + cprintf(" <0x%x> func1+offs1\n", get_ra(ebp)); + ebp = *((int *) ebp); + } +} diff --git a/kernel/src/proc.c b/kernel/src/proc.c index 64d3fdf..33690ff 100644 --- a/kernel/src/proc.c +++ b/kernel/src/proc.c @@ -9,6 +9,9 @@ #include "string.h" #include "stdio.h" +// FIXME amenon301 +#include "backtrace.h" + struct { struct spinlock lock; struct proc proc[NPROC]; @@ -126,6 +129,8 @@ userinit(void) { struct proc *p; extern char _binary_initcode_start[], _binary_initcode_size[]; + // FIXME amenon301 + backtrace(); p = allocproc(); -- 2.47.3