From 218cb9399e8bf925c3556746c630938b24cc59a8 Mon Sep 17 00:00:00 2001 From: Philipp Oppermann Date: Fri, 25 Jan 2019 13:54:44 +0100 Subject: [PATCH] Add a double fault handler and test it --- src/interrupts.rs | 9 +++++++++ src/main.rs | 6 ++++-- 2 files changed, 13 insertions(+), 2 deletions(-) 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 {}