#include #include #include #include #include #include static int has_panicked = 0; void panic_irq(struct ml_cpu_context *ctx, const char *fmt, ...) { char buf[512]; va_list args; va_start(args, fmt); vsnprintf(buf, sizeof(buf), fmt, args); va_end(args); printk("---[ kernel panic: %s", buf); printk("kernel: " BUILD_ID ", compiler version: " __VERSION__); struct task *task = current_task(); struct thread *thr = current_thread(); if (task && thr) { printk("task: %s (id: %d, thread: %d)", task->t_name, task->t_id, thr->tr_id); } else { printk("task: [bootstrap]"); } printk("cpu: %u", this_cpu()); ml_print_cpu_state(ctx); if (READ_ONCE(has_panicked)) { ml_halt_cpu(); } WRITE_ONCE(has_panicked, 1); if (ctx) { ml_print_stack_trace_irq(ctx); } else { uintptr_t ip = (uintptr_t)__builtin_return_address(0); ml_print_stack_trace(ip); } printk("---[ end kernel panic: %s", buf); ml_halt_cpu(); }