From d3f4968588e125bd1df848ef47d8ba48c3123937 Mon Sep 17 00:00:00 2001 From: Sydney Date: Sat, 13 Sep 2025 13:06:35 -0700 Subject: [PATCH] intr: print more useful info --- .../ukernel/arch/amd64/interrupts/idt.zig | 2 +- .../ukernel/arch/amd64/interrupts/root.zig | 34 +++++++++++++++++-- 2 files changed, 32 insertions(+), 4 deletions(-) diff --git a/components/ukernel/arch/amd64/interrupts/idt.zig b/components/ukernel/arch/amd64/interrupts/idt.zig index ae91e54..bd129ad 100644 --- a/components/ukernel/arch/amd64/interrupts/idt.zig +++ b/components/ukernel/arch/amd64/interrupts/idt.zig @@ -172,7 +172,7 @@ pub const SelectorErrorCode = packed struct(u64) { const Self = @This(); pub fn parse(self: Self) Target { return switch (self.interrupt) { - true => .{ .interrupt = @enumFromInt(self.idx) }, + true => .{ .interrupt = .{ .interrupt = @truncate(self.idx) } }, false => switch (self.type) { .gdt => .{ .gdt_sel = self.idx }, .ldt => .{ .ldt_sel = self.idx }, diff --git a/components/ukernel/arch/amd64/interrupts/root.zig b/components/ukernel/arch/amd64/interrupts/root.zig index 77a1727..2e009e7 100644 --- a/components/ukernel/arch/amd64/interrupts/root.zig +++ b/components/ukernel/arch/amd64/interrupts/root.zig @@ -12,8 +12,19 @@ pub inline fn disable() void { asm volatile ("cli"); } -pub fn unhandled_interrupt(stack_frame: *idt.InterruptFrame(u64)) callconv(.{ .x86_64_sysv = .{} }) void { - std.log.err("Unhandled interrupt (0x{x})!!! rip = 0x{x}", .{ stack_frame.int_num.interrupt, stack_frame.rip }); +pub fn unhandled_interrupt(frame: *idt.InterruptFrame(u64)) callconv(.{ .x86_64_sysv = .{} }) void { + if (std.enums.tagName(idt.Exception, frame.int_num.exception)) |exception_name| { + std.log.err("Unhandled interrupt (0x{x} : {s})!!!", .{ frame.int_num.interrupt, exception_name }); + } else { + std.log.err("Unhandled interrupt (0x{x})!!!", .{frame.int_num.interrupt}); + } + std.log.err("CR3: 0x{x:0>16}", .{frame.cr3}); + std.log.err("RAX: 0x{x:0>16}, RBX: 0x{x:0>16}, RCX: 0x{x:0>16}, RDX: 0x{x:0>16}", .{ frame.regs.rax, frame.regs.rbx, frame.regs.rcx, frame.regs.rdx }); + std.log.err("RSI: 0x{x:0>16}, RDI: 0x{x:0>16}, RBP: 0x{x:0>16}, RSP: 0x{x:0>16}", .{ frame.regs.rsi, frame.regs.rdi, frame.regs.rbp, frame.rsp }); + std.log.err("R8: 0x{x:0>16}, R9: 0x{x:0>16}, R10: 0x{x:0>16}, R11: 0x{x:0>16}", .{ frame.regs.r8, frame.regs.r9, frame.regs.r10, frame.regs.r11 }); + std.log.err("R12: 0x{x:0>16}, R13: 0x{x:0>16}, R14: 0x{x:0>16}, R15: 0x{x:0>16}", .{ frame.regs.r12, frame.regs.r13, frame.regs.r14, frame.regs.r15 }); + std.log.err("RFL: 0x{x:0>16}, RIP: 0x{x:0>16}, CS: 0x{x:0>16}, SS: 0x{x:0>16}", .{ frame.eflags, frame.rip, frame.cs, frame.ss }); + arch.interrupts.disable(); arch.instructions.die(); } @@ -27,6 +38,23 @@ pub fn double_fault(stack_frame: *idt.InterruptFrame(u64)) callconv(.{ .x86_64_s } pub fn general_protection_fault(stack_frame: *idt.InterruptFrame(idt.SelectorErrorCode)) callconv(.{ .x86_64_sysv = .{} }) void { - std.log.warn("General Protection Fault @ 0x{x} (Error Code {}), returning execution...", .{ stack_frame.rip, stack_frame.error_code }); + std.log.warn("General Protection Fault @ 0x{x}", .{stack_frame.rip}); + + const target = stack_frame.error_code.parse(); + switch (target) { + .interrupt => |int| { + if (std.enums.tagName(idt.Exception, int.exception)) |exc_name| { + std.log.warn("Caused by interrupt 0x{x} ({s})", .{ int.interrupt, exc_name }); + } else { + std.log.warn("Caused by interrupt 0x{x}", .{int.interrupt}); + } + }, + .gdt_sel => |gdt_sel| { + std.log.warn("GDT selector: 0x{x}", .{gdt_sel}); + }, + .ldt_sel => |ldt_sel| { + std.log.warn("LDT selector: 0x{x}", .{ldt_sel}); + }, + } arch.instructions.die(); } -- 2.39.3 (Apple Git-146)