diff options
Diffstat (limited to 'kernel/src/interrupts/exception_handlers.rs')
-rw-r--r-- | kernel/src/interrupts/exception_handlers.rs | 17 |
1 files changed, 11 insertions, 6 deletions
diff --git a/kernel/src/interrupts/exception_handlers.rs b/kernel/src/interrupts/exception_handlers.rs index ce8f6c0..db081a7 100644 --- a/kernel/src/interrupts/exception_handlers.rs +++ b/kernel/src/interrupts/exception_handlers.rs @@ -15,6 +15,11 @@ macro_rules! exception_default { static mut EXPECTED_FAULT: InterruptType = InterruptType::None; +/// Set an exception that causes the kernel to exit with status success +/// This is used for testing +/// +/// # Safety +/// This function may only be called before executing any kernel code pub unsafe fn expect_fault(int: InterruptType) { if EXPECTED_FAULT == InterruptType::None { EXPECTED_FAULT = int; @@ -25,7 +30,7 @@ fn get_expected_fault() -> InterruptType { unsafe { EXPECTED_FAULT } } -pub extern "x86-interrupt" fn breakpoint_handler(stack_frame: &mut InterruptStackFrame) { +pub extern "x86-interrupt" fn breakpoint_handler(stack_frame: InterruptStackFrame) { match get_expected_fault() { InterruptType::Breakpoint => qemu::exit_qemu(qemu::QemuExitCode::Success), _ => panic!( @@ -35,7 +40,7 @@ pub extern "x86-interrupt" fn breakpoint_handler(stack_frame: &mut InterruptStac } } -pub extern "x86-interrupt" fn div_zero_handler(stack_frame: &mut InterruptStackFrame) { +pub extern "x86-interrupt" fn div_zero_handler(stack_frame: InterruptStackFrame) { match get_expected_fault() { InterruptType::DivZero => qemu::exit_qemu(qemu::QemuExitCode::Success), _ => panic!( @@ -46,7 +51,7 @@ pub extern "x86-interrupt" fn div_zero_handler(stack_frame: &mut InterruptStackF } pub extern "x86-interrupt" fn general_protection_fault_handler( - stack_frame: &mut InterruptStackFrame, + stack_frame: InterruptStackFrame, error_code: u64, ) { match get_expected_fault() { @@ -60,7 +65,7 @@ pub extern "x86-interrupt" fn general_protection_fault_handler( } pub extern "x86-interrupt" fn page_fault_handler( - stack_frame: &mut InterruptStackFrame, + stack_frame: InterruptStackFrame, error_code: PageFaultErrorCode, ) { use x86_64::registers::control::Cr2; @@ -78,7 +83,7 @@ pub extern "x86-interrupt" fn page_fault_handler( } pub extern "x86-interrupt" fn segment_not_present_handler( - stack_frame: &mut InterruptStackFrame, + stack_frame: InterruptStackFrame, error_code: u64, ) { match get_expected_fault() { @@ -92,7 +97,7 @@ pub extern "x86-interrupt" fn segment_not_present_handler( } pub extern "x86-interrupt" fn double_fault_handler( - stack_frame: &mut InterruptStackFrame, + stack_frame: InterruptStackFrame, _error_code: u64, // code is always zero ) -> ! { match get_expected_fault() { |