/* * Copyright (C) 2025 Danny Holman * * This file is part of BoxOS, a free and open-source Unix-like operating * system. * * BoxOS is free software; you can redistribute it and/or modify under the * terms of the GNU General Public License as published by the Free Software * Foundation; either version 2 of the License, or (at your option) any later * version. * * BoxOS is distributed in the hope it will be useful, but WITHOUT ANY WARRANTY; * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A * PARTICULAR PURPOSE. See the GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along with * BoxOS; if not, see . */ #include #include #include #include #include #include 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); }