summaryrefslogtreecommitdiff
path: root/kernel/core/panic.c
diff options
context:
space:
mode:
Diffstat (limited to 'kernel/core/panic.c')
-rw-r--r--kernel/core/panic.c31
1 files changed, 31 insertions, 0 deletions
diff --git a/kernel/core/panic.c b/kernel/core/panic.c
new file mode 100644
index 0000000..a44a73c
--- /dev/null
+++ b/kernel/core/panic.c
@@ -0,0 +1,31 @@
+#include <kernel/panic.h>
+#include <kernel/spinlock.h>
+#include <libk/io.h>
+#include <stdint.h>
+#include <stddef.h>
+
+static struct spinlock panic_lock = {0};
+static int panicked = 0;
+
+void walk_stack(uintptr_t *addrs, size_t n);
+
+void stack_trace(void) {
+ kprintf("PRINTING STACK TRACE\n");
+ uintptr_t strace[32];
+ walk_stack(strace, 32);
+ for (int i = 0; i < 32; i++) {
+ if (strace[i] == 0)
+ break;
+ kprintf("#%d: %x\n", i, strace[i]);
+ }
+}
+
+void panic(const char *str) {
+ disable_ints();
+ spin_lock(&panic_lock);
+ panicked = 1;
+ spin_unlock(&panic_lock);
+ kprintf("KERNEL PANIC - NOT SYNCING: %s\n", str);
+ stack_trace();
+ while (1);
+}