diff --git a/src/interrupts.rs b/src/interrupts.rs index 8eefc8e0..f29b4273 100644 --- a/src/interrupts.rs +++ b/src/interrupts.rs @@ -11,6 +11,7 @@ lazy_static! { static ref IDT: InterruptDescriptorTable = { let mut idt = InterruptDescriptorTable::new(); idt.breakpoint.set_handler_fn(breakpoint_handler); + idt.double_fault.set_handler_fn(double_fault_handler); idt }; } @@ -22,3 +23,11 @@ pub fn init_idt() { extern "x86-interrupt" fn breakpoint_handler(stack_frame: &mut ExceptionStackFrame) { println!("EXCEPTION: BREAKPOINT\n{:#?}", stack_frame); } + +extern "x86-interrupt" fn double_fault_handler( + stack_frame: &mut ExceptionStackFrame, + _error_code: u64, +) { + println!("EXCEPTION: DOUBLE FAULT\n{:#?}", stack_frame); + loop {} +} diff --git a/src/main.rs b/src/main.rs index ad1e2f7d..5d9cfc90 100644 --- a/src/main.rs +++ b/src/main.rs @@ -12,8 +12,10 @@ pub extern "C" fn _start() -> ! { blog_os::interrupts::init_idt(); - // invoke a breakpoint exception - x86_64::instructions::int3(); + // trigger a page fault + unsafe { + *(0xdeadbeef as *mut u64) = 42; + }; println!("It did not crash!"); loop {}