]> Devi Nivas Git - cs3210-lab1.git/commitdiff
backtrace() phase 1: print return addresses
authorAdvaith Menon <noreply-git@bp4k.net>
Fri, 30 Jan 2026 02:31:36 +0000 (08:01 +0530)
committerAdvaith Menon <noreply-git@bp4k.net>
Fri, 30 Jan 2026 02:31:36 +0000 (08:01 +0530)
* test via proc.c in userinit (once everything is initialized)

kernel/Sources.cmake
kernel/include/backtrace.h [new file with mode: 0644]
kernel/src/backtrace.c [new file with mode: 0644]
kernel/src/proc.c

index 5b5ed1a24c71f6291312af35c8a7d3a8516f09c2..256229426659cc69346769c7f9491f798c4b388d 100644 (file)
@@ -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 (file)
index 0000000..fae9bb1
--- /dev/null
@@ -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 (file)
index 0000000..f392017
--- /dev/null
@@ -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);
+    }
+}
index 64d3fdf3ccaa82523c10408285989705b9378c91..33690ff41954955f59d7ea40cfdf3ed1abf09db9 100644 (file)
@@ -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();