From 090e0785ff7dec4eaee9a99ec3ad6e44638dc586 Mon Sep 17 00:00:00 2001 From: Philipp Oppermann Date: Sun, 30 Oct 2016 17:51:26 +0100 Subject: [PATCH] Use references for the ExceptionStackFrame argument MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit We require/assume that these pointers are correct. Using references is cleaner than blindly dereferencing raw pointers. Important: The Rust book guarantees that: “At runtime, a raw pointer * and a reference pointing to the same piece of data have an identical representation.” (cherry picked from commit 15feb9a1205f5a62ce9a42bc91009ac0bb7ed0d0) --- src/interrupts/mod.rs | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/src/interrupts/mod.rs b/src/interrupts/mod.rs index 2a0223ea..af5e620c 100644 --- a/src/interrupts/mod.rs +++ b/src/interrupts/mod.rs @@ -18,7 +18,7 @@ macro_rules! handler { sub rsp, 8 // align the stack pointer call $0" :: "i"($name as extern "C" fn( - *const ExceptionStackFrame) -> !) + &ExceptionStackFrame) -> !) : "rdi" : "intel"); ::core::intrinsics::unreachable(); } @@ -37,7 +37,7 @@ macro_rules! handler_with_error_code { sub rsp, 8 // align the stack pointer call $0" :: "i"($name as extern "C" fn( - *const ExceptionStackFrame, u64) -> !) + &ExceptionStackFrame, u64) -> !) : "rdi","rsi" : "intel"); ::core::intrinsics::unreachable(); } @@ -72,14 +72,12 @@ struct ExceptionStackFrame { stack_segment: u64, } -extern "C" fn divide_by_zero_handler(stack_frame: *const ExceptionStackFrame) -> ! { - let stack_frame = unsafe { &*stack_frame }; +extern "C" fn divide_by_zero_handler(stack_frame: &ExceptionStackFrame) -> ! { println!("\nEXCEPTION: DIVIDE BY ZERO\n{:#?}", stack_frame); loop {} } -extern "C" fn invalid_opcode_handler(stack_frame: *const ExceptionStackFrame) -> ! { - let stack_frame = unsafe { &*stack_frame }; +extern "C" fn invalid_opcode_handler(stack_frame: &ExceptionStackFrame) -> ! { println!("\nEXCEPTION: INVALID OPCODE at {:#x}\n{:#?}", stack_frame.instruction_pointer, stack_frame); @@ -96,8 +94,7 @@ bitflags! { } } -extern "C" fn page_fault_handler(stack_frame: *const ExceptionStackFrame, error_code: u64) -> ! { - let stack_frame = unsafe { &*stack_frame }; +extern "C" fn page_fault_handler(stack_frame: &ExceptionStackFrame, error_code: u64) -> ! { use x86::controlregs; println!("\nEXCEPTION: PAGE FAULT while accessing {:#x}\nerror code: \ {:?}\n{:#?}",