From 15feb9a1205f5a62ce9a42bc91009ac0bb7ed0d0 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.” --- src/interrupts/mod.rs | 18 +++++++----------- 1 file changed, 7 insertions(+), 11 deletions(-) diff --git a/src/interrupts/mod.rs b/src/interrupts/mod.rs index da2325b2..f19d02d0 100644 --- a/src/interrupts/mod.rs +++ b/src/interrupts/mod.rs @@ -49,7 +49,7 @@ macro_rules! handler { add rdi, 9*8 // calculate exception stack frame pointer call $0" :: "i"($name as extern "C" fn( - *const ExceptionStackFrame)) + &ExceptionStackFrame)) : "rdi" : "intel"); restore_scratch_registers!(); @@ -74,7 +74,7 @@ macro_rules! handler_with_error_code { call $0 add rsp, 8 // undo stack pointer alignment " :: "i"($name as extern "C" fn( - *const ExceptionStackFrame, u64)) + &ExceptionStackFrame, u64)) : "rdi","rsi" : "intel"); restore_scratch_registers!(); asm!("add rsp, 8 // pop error code @@ -113,24 +113,21 @@ 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 breakpoint_handler(stack_frame: *const ExceptionStackFrame) { - let stack_frame = unsafe { &*stack_frame }; +extern "C" fn breakpoint_handler(stack_frame: &ExceptionStackFrame) { println!("\nEXCEPTION: BREAKPOINT at {:#x}\n{:#?}", stack_frame.instruction_pointer, stack_frame); } -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); + stack_frame); loop {} } @@ -144,8 +141,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{:#?}",