core/x86_64: Add general protection fault handler

This commit is contained in:
Gabriel 2025-02-15 22:19:08 +01:00
parent 090e4148b8
commit 36b9832053

View File

@ -74,6 +74,7 @@ export fn asmInterruptEntry() callconv(.Naked) void {
} }
const Exceptions = enum(u64) { const Exceptions = enum(u64) {
GeneralProtectionFault = 0xd,
PageFault = 0xe, PageFault = 0xe,
}; };
@ -87,6 +88,17 @@ const PageFaultCodes = enum(u64) {
const SYSCALL_INTERRUPT = 66; const SYSCALL_INTERRUPT = 66;
fn generalProtectionFault(frame: *InterruptStackFrame) void {
debug.print("General protection fault!\n", .{});
debug.print("Faulting instruction: {x}\n", .{frame.rip});
const code = frame.error_or_irq;
debug.print("Error code: {d}\n", .{code});
while (true) {}
}
fn pageFault(frame: *InterruptStackFrame) void { fn pageFault(frame: *InterruptStackFrame) void {
var fault_address: u64 = undefined; var fault_address: u64 = undefined;
asm volatile ("mov %%cr2, %[cr2]" asm volatile ("mov %%cr2, %[cr2]"
@ -132,6 +144,9 @@ export fn interruptEntry(frame: *InterruptStackFrame) callconv(.C) void {
@intFromEnum(Exceptions.PageFault) => { @intFromEnum(Exceptions.PageFault) => {
pageFault(frame); pageFault(frame);
}, },
@intFromEnum(Exceptions.GeneralProtectionFault) => {
generalProtectionFault(frame);
},
SYSCALL_INTERRUPT => { SYSCALL_INTERRUPT => {
var args = sys.Arguments{ .arg0 = frame.rdi, .arg1 = frame.rsi, .arg2 = frame.rdx, .arg3 = frame.r10, .arg4 = frame.r8, .arg5 = frame.r9 }; var args = sys.Arguments{ .arg0 = frame.rdi, .arg1 = frame.rsi, .arg2 = frame.rdx, .arg3 = frame.r10, .arg4 = frame.r8, .arg5 = frame.r9 };
sys.invokeSyscall(frame.rax, frame, &args, @ptrFromInt(@as(usize, @intFromPtr(&frame.rax)))); sys.invokeSyscall(frame.rax, frame, &args, @ptrFromInt(@as(usize, @intFromPtr(&frame.rax))));