From 7d7d02f6eccd72f3043a0438d3bf937efb14e024 Mon Sep 17 00:00:00 2001 From: littleblack111 Date: Sun, 6 Sep 2026 23:44:42 +0800 Subject: new: interrupt --- kernel/src/init.rs | 5 +++++ kernel/src/init/int.rs | 26 ++++++++++++++++++++++++++ kernel/src/main.rs | 7 ++++++- 3 files changed, 37 insertions(+), 1 deletion(-) create mode 100644 kernel/src/init/int.rs diff --git a/kernel/src/init.rs b/kernel/src/init.rs index ef51b1f..5870a18 100644 --- a/kernel/src/init.rs +++ b/kernel/src/init.rs @@ -1,2 +1,7 @@ pub mod acpi; pub mod earlyprintk; +pub mod int; + +pub fn init() { + int::init(); +} diff --git a/kernel/src/init/int.rs b/kernel/src/init/int.rs new file mode 100644 index 0000000..0300d87 --- /dev/null +++ b/kernel/src/init/int.rs @@ -0,0 +1,26 @@ +use spin::LazyLock; +use x86_64::structures::idt::{InterruptDescriptorTable, InterruptStackFrame}; + +use crate::printlnk; + +static IDT: LazyLock = LazyLock::new(|| { + let mut idt = InterruptDescriptorTable::new(); + idt.breakpoint.set_handler_fn(breakpoint_handler); + idt.double_fault.set_handler_fn(double_fault_handler); + idt +}); + +extern "x86-interrupt" fn double_fault_handler( + stack_frame: InterruptStackFrame, + error_code: u64, +) -> ! { + panic!("EXCEPTION: DOUBLE FAULT\n{stack_frame:#?}\nERROR CODE:{error_code}"); +} + +extern "x86-interrupt" fn breakpoint_handler(stack_frame: InterruptStackFrame) { + _ = printlnk!("EXCEPTION: BREAKPOINT\n{stack_frame:#?}"); +} + +pub fn init() { + IDT.load(); +} diff --git a/kernel/src/main.rs b/kernel/src/main.rs index 308d7e1..6a1cae3 100644 --- a/kernel/src/main.rs +++ b/kernel/src/main.rs @@ -4,11 +4,16 @@ // extern crate alloc; use bootloader_api::{BootInfo, entry_point}; -use kernel::{pm::hcf, printlnk}; +use kernel::{init, pm::hcf, printlnk}; // const CONFIG: BootloaderConfig = BootloaderConfig::new_default(); fn kmain(_boot_info: &'static mut BootInfo) -> ! { + init::init(); + x86_64::instructions::interrupts::int3(); + unsafe { + *(0xdeadbeef as *mut u8) = 42; + }; _ = printlnk!("test"); hcf() } -- cgit v1.2.3