summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Makefile2
-rw-r--r--src/kernel/arch/generic.h6
-rw-r--r--src/kernel/arch/i386/debug.c18
-rw-r--r--src/kernel/panic.h5
-rw-r--r--tools/stacktrace_resolve.awk11
5 files changed, 38 insertions, 4 deletions
diff --git a/Makefile b/Makefile
index 9ab6898..bf0f1f6 100644
--- a/Makefile
+++ b/Makefile
@@ -3,7 +3,7 @@ PATH := $(shell pwd)/toolchain/bin/:$(PATH)
AS = i686-elf-as
CC = i686-elf-gcc
CHECK = sparse
-CFLAGS += -std=gnu99 -ffreestanding -O2 -Wall -Wextra -Wold-style-definition -Werror=implicit-function-declaration -ftrack-macro-expansion=0
+CFLAGS += -g -std=gnu99 -ffreestanding -O2 -Wall -Wextra -Wold-style-definition -Werror=implicit-function-declaration -ftrack-macro-expansion=0
CFLAGS += -mgeneral-regs-only
CFLAGS += -Isrc/
LFLAGS = -ffreestanding -O2 -nostdlib -lgcc
diff --git a/src/kernel/arch/generic.h b/src/kernel/arch/generic.h
index f8dfe51..fd44e38 100644
--- a/src/kernel/arch/generic.h
+++ b/src/kernel/arch/generic.h
@@ -2,8 +2,9 @@
#include <kernel/arch/i386/registers.h>
#include <shared/types.h>
-#include <stdbool.h>
#include <stdarg.h>
+#include <stdbool.h>
+#include <stddef.h>
// i have no idea where else to put it
// some code assumes that it's a power of 2
@@ -39,3 +40,6 @@ void *pagedir_virt2phys(struct pagedir *dir, const void __user *virt,
bool user, bool writeable);
int kprintf(const char *fmt, ...);
+
+void *debug_caller(size_t depth);
+void debug_stacktrace(void);
diff --git a/src/kernel/arch/i386/debug.c b/src/kernel/arch/i386/debug.c
new file mode 100644
index 0000000..b1920db
--- /dev/null
+++ b/src/kernel/arch/i386/debug.c
@@ -0,0 +1,18 @@
+#include <kernel/arch/generic.h>
+
+void *debug_caller(size_t depth) {
+ void **ebp;
+ asm("mov %%ebp, %0"
+ : "=r" (ebp));
+ while (depth--) {
+ if (!ebp) return NULL;
+ ebp = *ebp;
+ }
+ return ebp[1];
+}
+
+void debug_stacktrace(void) {
+ for (size_t i = 0; i < 16; i++) {
+ kprintf(" k/%08x\n", (uintptr_t)debug_caller(i));
+ }
+}
diff --git a/src/kernel/panic.h b/src/kernel/panic.h
index c4cd194..8cb32f4 100644
--- a/src/kernel/panic.h
+++ b/src/kernel/panic.h
@@ -3,9 +3,10 @@
#include <kernel/util.h>
#define _panic(type) do { \
- kprintf(" an "type" PANIC! at the "); \
+ kprintf("\nan "type" PANIC! at the "); \
kprintf(__func__); \
- kprintf(" (" __FILE__ ":" NUM2STR(__LINE__) ") "); \
+ kprintf(" (" __FILE__ ":" NUM2STR(__LINE__) ")\n"); \
+ debug_stacktrace(); \
halt_cpu(); \
} while (0)
diff --git a/tools/stacktrace_resolve.awk b/tools/stacktrace_resolve.awk
new file mode 100644
index 0000000..a8254a7
--- /dev/null
+++ b/tools/stacktrace_resolve.awk
@@ -0,0 +1,11 @@
+/k\/[0-9A-Fa-f]{8}/ {
+ print;
+ addr = substr($0, match($0, /k\/[0-9A-Fa-f]{8}/) + 2, RLENGTH - 2);
+ if (addr != "00000000") {
+ printf " ";
+ system("addr2line -psfe out/fs/boot/kernel.bin 0x" addr);
+ }
+ next;
+}
+
+{ print; }