diff --git a/src/kernel/arch/x86_64/interrupts.rs b/src/kernel/arch/x86_64/interrupts.rs index 95657aa..add3f21 100644 --- a/src/kernel/arch/x86_64/interrupts.rs +++ b/src/kernel/arch/x86_64/interrupts.rs @@ -4,14 +4,13 @@ use lazy_static::lazy_static; use x86_64::structures::idt::*; -use crate::format; - lazy_static! { pub static ref IDT: InterruptDescriptorTable = { - let mut idt = InterruptDescriptorTable::new(); + let idt = InterruptDescriptorTable::new(); // TODO: Re-implement this once the x86-interrupt ABI is fixed. + // Alternatively: Write our own interrupt handler wrappers. //idt.double_fault.set_handler_fn(double_fault); - idt.page_fault.set_handler_fn(page_fault); + //idt.page_fault.set_handler_fn(page_fault); idt }; } @@ -20,6 +19,7 @@ lazy_static! { // crate::interrupt::double_fault(&format!("{info:#?}")); //} +/* #[allow(dead_code)] extern "x86-interrupt" fn page_fault(info: InterruptStackFrame, errcode: PageFaultErrorCode) { if errcode.contains(PageFaultErrorCode::USER_MODE) { @@ -37,7 +37,9 @@ extern "x86-interrupt" fn page_fault(info: InterruptStackFrame, errcode: PageFau core::arch::asm! {"mov {}, cr2", out(reg) a}; a }; - crate::interrupt::page_fault(addr, &format!("{info:#?}")) + let info_formatted = format!("{info:#?}"); + crate::interrupt::page_fault(addr, info_formatted.as_str().as_ptr(), info_formatted.as_str().len()) } } -} +} +*/ diff --git a/src/kernel/interrupt/mod.rs b/src/kernel/interrupt/mod.rs index 41b5a64..f033197 100644 --- a/src/kernel/interrupt/mod.rs +++ b/src/kernel/interrupt/mod.rs @@ -1,11 +1,16 @@ // Copyright (c) 2025 shibedrill // SPDX-License-Identifier: GPL-3.0-or-later -#[allow(dead_code)] -pub fn double_fault(info: &str) -> ! { - panic!("Double fault: {}", info); +use core::str; + +#[unsafe(no_mangle)] +extern "C" fn double_fault(info: *const u8, info_len: usize) -> ! { + let info_slice = unsafe {&str::from_raw_parts(info, info_len)}; + panic!("Double fault: {}", info_slice); } -pub fn page_fault(addr: usize, info: &str) -> ! { - panic!("Page fault at 0x{:X}: {}", addr, info); +#[unsafe(no_mangle)] +pub extern "C" fn page_fault(addr: usize, info: *const u8, info_len: usize) -> ! { + let info_slice = unsafe { &str::from_raw_parts(info, info_len) }; + panic!("Page fault at 0x{:X}: {}", addr, info_slice); } diff --git a/src/kernel/main.rs b/src/kernel/main.rs index 413c9c0..64a5fa0 100644 --- a/src/kernel/main.rs +++ b/src/kernel/main.rs @@ -4,7 +4,7 @@ #![no_std] #![no_main] #![feature(allocator_api)] -#![feature(abi_x86_interrupt)] +#![feature(str_from_raw_parts)] mod arch; mod boot;