summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorlittleblack111 <littleblack11111@gmail.com>2026-09-06 23:44:42 +0800
committerlittleblack111 <littleblack11111@gmail.com>2026-09-06 23:44:42 +0800
commit7d7d02f6eccd72f3043a0438d3bf937efb14e024 (patch)
treec7713c73b1444f870e86b8ac116a357264e965cc
parentbc4424b6eb4c4d09ea458c3925d142b7eea95e38 (diff)
new: interrupt
-rw-r--r--kernel/src/init.rs5
-rw-r--r--kernel/src/init/int.rs26
-rw-r--r--kernel/src/main.rs7
3 files changed, 37 insertions, 1 deletions
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<InterruptDescriptorTable> = 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()
}