meow #1

merged
opened by pci.express targeting dev

mrrp

Changed files
+32 -4
components
ukernel
arch
amd64
interrupts
+1 -1
components/ukernel/arch/amd64/interrupts/idt.zig
···
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 },
+31 -3
components/ukernel/arch/amd64/interrupts/root.zig
···
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();
}
···
}
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();
}