diff options
Diffstat (limited to 'kernel/src/interrupts')
-rw-r--r-- | kernel/src/interrupts/exceptions.rs | 40 | ||||
-rw-r--r-- | kernel/src/interrupts/mod.rs | 2 | ||||
-rw-r--r-- | kernel/src/interrupts/table.rs | 20 |
3 files changed, 62 insertions, 0 deletions
diff --git a/kernel/src/interrupts/exceptions.rs b/kernel/src/interrupts/exceptions.rs new file mode 100644 index 0000000..08555c4 --- /dev/null +++ b/kernel/src/interrupts/exceptions.rs @@ -0,0 +1,40 @@ +use crate::io::vga_text::OStream; +use x86_64::structures::idt::{InterruptStackFrame, PageFaultErrorCode}; + +pub extern "x86-interrupt" fn breakpoint_handler(stack_frame: &mut InterruptStackFrame) { + let mut stdout = OStream::new(); + stdout.print(b"EXCEPTION: BREAKPOINT\n"); +} + +pub extern "x86-interrupt" fn page_fault_handler( + stack_frame: &mut InterruptStackFrame, + error_code: PageFaultErrorCode, +) { + use x86_64::registers::control::Cr2; + + let mut stdout = OStream::new(); + stdout.print(b"EXCEPTION: PAGEFAULT\n"); + loop {} + panic!("PAGE FAULT"); + //println!("Accessed Address: {:?}", Cr2::read()); + //println!("Error Code: {:?}", error_code); + //println!("{:#?}", stack_frame); +} + +pub extern "x86-interrupt" fn segment_not_present_handler( + stack_frame: &mut InterruptStackFrame, + error_code: u64, +) { + loop {} + let mut stdout = OStream::new(); + stdout.print(b"EXCEPTION: SEGMENT NOT PRESENT\n"); +} + +extern "x86-interrupt" fn double_fault_handler( + stack_frame: &mut InterruptStackFrame, + _error_code: u64, +) { + let mut stdout = OStream::new(); + stdout.print(b"EXCEPTION: DOUBLE FAULT"); + loop {} +} diff --git a/kernel/src/interrupts/mod.rs b/kernel/src/interrupts/mod.rs new file mode 100644 index 0000000..ae21761 --- /dev/null +++ b/kernel/src/interrupts/mod.rs @@ -0,0 +1,2 @@ +mod exceptions; +pub mod table; diff --git a/kernel/src/interrupts/table.rs b/kernel/src/interrupts/table.rs new file mode 100644 index 0000000..6472014 --- /dev/null +++ b/kernel/src/interrupts/table.rs @@ -0,0 +1,20 @@ +use crate::io::vga_text::OStream; +use lazy_static::lazy_static; +use x86_64::structures::idt::InterruptDescriptorTable; + +lazy_static! { + static ref IDT: InterruptDescriptorTable = { + let mut idt = InterruptDescriptorTable::new(); + idt.breakpoint + .set_handler_fn(super::exceptions::breakpoint_handler); + idt.page_fault + .set_handler_fn(super::exceptions::page_fault_handler); + idt.segment_not_present + .set_handler_fn(super::exceptions::segment_not_present_handler); + idt + }; +} + +pub fn init() { + IDT.load() +} |