From a9319ea83e460b1cf108ecac8f0eedc379fef18f Mon Sep 17 00:00:00 2001 From: Philipp Oppermann Date: Wed, 3 Aug 2016 16:39:34 +0200 Subject: [PATCH] Translate error code and print cr2 register --- src/interrupts/mod.rs | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/src/interrupts/mod.rs b/src/interrupts/mod.rs index ed8a060f..9bd8aa6e 100644 --- a/src/interrupts/mod.rs +++ b/src/interrupts/mod.rs @@ -85,13 +85,27 @@ extern "C" fn invalid_opcode_handler(stack_frame: *const ExceptionStackFrame) loop {} } +bitflags! { + flags PageFaultErrorCode: u64 { + const PROTECTION_VIOLATION = 1 << 0, + const CAUSED_BY_WRITE = 1 << 1, + const USER_MODE = 1 << 2, + const MALFORMED_TABLE = 1 << 3, + const INSTRUCTION_FETCH = 1 << 4, + } +} + extern "C" fn page_fault_handler(stack_frame: *const ExceptionStackFrame, error_code: u64) -> ! { + use x86::controlregs; unsafe { print_error(format_args!( - "EXCEPTION: PAGE FAULT with error code {:?}\n{:#?}", - error_code, *stack_frame)); + "EXCEPTION: PAGE FAULT while accessing {:#x}\ + \nerror code: {:?}\n{:#?}", + controlregs::cr2(), + PageFaultErrorCode::from_bits(error_code).unwrap(), + *stack_frame)); } loop {} }