From 6590a5acfee33bae3ca0431c8af09768248fe405 Mon Sep 17 00:00:00 2001 From: Dennis Kobert Date: Fri, 15 Nov 2019 20:21:25 +0100 Subject: Rename interrupt and exception handlers --- kernel/src/interrupts/exception_handlers.rs | 95 +++++++++++++++++++++++++++++ kernel/src/interrupts/exceptions.rs | 95 ----------------------------- kernel/src/interrupts/idt.rs | 14 ++--- kernel/src/interrupts/interrupt_handlers.rs | 8 +++ kernel/src/interrupts/interrupts.rs | 8 --- kernel/src/interrupts/mod.rs | 4 +- kernel/tests/int3.rs | 4 +- kernel/tests/stack_overflow.rs | 4 +- 8 files changed, 116 insertions(+), 116 deletions(-) create mode 100644 kernel/src/interrupts/exception_handlers.rs delete mode 100644 kernel/src/interrupts/exceptions.rs create mode 100644 kernel/src/interrupts/interrupt_handlers.rs delete mode 100644 kernel/src/interrupts/interrupts.rs diff --git a/kernel/src/interrupts/exception_handlers.rs b/kernel/src/interrupts/exception_handlers.rs new file mode 100644 index 0000000..a3ecf9d --- /dev/null +++ b/kernel/src/interrupts/exception_handlers.rs @@ -0,0 +1,95 @@ +use super::Interrupts; +use crate::io::qemu; +use x86_64::structures::idt::{InterruptStackFrame, PageFaultErrorCode}; + +macro_rules! exception_default { + ($stack_frame: expr) => { + format_args!( + "instruction addr: 0x{:08x}\nstack addr: 0x{:08x}\nflags: 0x{:x}", + $stack_frame.instruction_pointer.as_u64(), + $stack_frame.stack_pointer.as_u64(), + $stack_frame.cpu_flags, + ) + }; +} + +static mut expected_fault: Interrupts = Interrupts::None; + +pub unsafe fn expect_fault(int: Interrupts) { + if expected_fault == Interrupts::None { + expected_fault = int; + } +} + +fn get_expected_fault() -> Interrupts { + unsafe { expected_fault } +} + +pub extern "x86-interrupt" fn breakpoint_handler(stack_frame: &mut InterruptStackFrame) { + match get_expected_fault() { + Interrupts::Breakpoint => qemu::exit_qemu(qemu::QemuExitCode::Success), + _ => panic!( + "BREAKPOINT exception thrown\n\n{}", + exception_default!(stack_frame) + ), + } +} + +pub extern "x86-interrupt" fn general_protection_fault_handler( + stack_frame: &mut InterruptStackFrame, + error_code: u64, +) { + match get_expected_fault() { + Interrupts::GeneralProtectionFault => qemu::exit_qemu(qemu::QemuExitCode::Success), + _ => panic!( + "GENERAL PROTECTION exception thrown\nerror code: {:x}\n{}", + error_code, + exception_default!(stack_frame) + ), + } +} + +pub extern "x86-interrupt" fn page_fault_handler( + stack_frame: &mut InterruptStackFrame, + error_code: PageFaultErrorCode, +) { + use x86_64::registers::control::Cr2; + + match get_expected_fault() { + Interrupts::PageFault => qemu::exit_qemu(qemu::QemuExitCode::Success), + _ => panic!( + "PAGE FAULT while accessing address: 0x{:08x}\nerror code: {:?}(0x{:x})\n{}", + Cr2::read().as_u64(), + error_code, + error_code.bits(), + exception_default!(stack_frame) + ), + } +} + +pub extern "x86-interrupt" fn segment_not_present_handler( + stack_frame: &mut InterruptStackFrame, + error_code: u64, +) { + match get_expected_fault() { + Interrupts::NotPresent => qemu::exit_qemu(qemu::QemuExitCode::Success), + _ => panic!( + "SEGMENT NOT PRESENT exception\nerror code: 0x{:x}\n{}", + error_code, + exception_default!(stack_frame) + ), + } +} + +pub extern "x86-interrupt" fn double_fault_handler( + stack_frame: &mut InterruptStackFrame, + _error_code: u64, // code is always zero +) { + match get_expected_fault() { + Interrupts::DoubleFault => qemu::exit_qemu(qemu::QemuExitCode::Success), + _ => panic!( + "DOUBLE FAULT\nthis is a fatal exception\n{}", + exception_default!(stack_frame) + ), + } +} diff --git a/kernel/src/interrupts/exceptions.rs b/kernel/src/interrupts/exceptions.rs deleted file mode 100644 index a3ecf9d..0000000 --- a/kernel/src/interrupts/exceptions.rs +++ /dev/null @@ -1,95 +0,0 @@ -use super::Interrupts; -use crate::io::qemu; -use x86_64::structures::idt::{InterruptStackFrame, PageFaultErrorCode}; - -macro_rules! exception_default { - ($stack_frame: expr) => { - format_args!( - "instruction addr: 0x{:08x}\nstack addr: 0x{:08x}\nflags: 0x{:x}", - $stack_frame.instruction_pointer.as_u64(), - $stack_frame.stack_pointer.as_u64(), - $stack_frame.cpu_flags, - ) - }; -} - -static mut expected_fault: Interrupts = Interrupts::None; - -pub unsafe fn expect_fault(int: Interrupts) { - if expected_fault == Interrupts::None { - expected_fault = int; - } -} - -fn get_expected_fault() -> Interrupts { - unsafe { expected_fault } -} - -pub extern "x86-interrupt" fn breakpoint_handler(stack_frame: &mut InterruptStackFrame) { - match get_expected_fault() { - Interrupts::Breakpoint => qemu::exit_qemu(qemu::QemuExitCode::Success), - _ => panic!( - "BREAKPOINT exception thrown\n\n{}", - exception_default!(stack_frame) - ), - } -} - -pub extern "x86-interrupt" fn general_protection_fault_handler( - stack_frame: &mut InterruptStackFrame, - error_code: u64, -) { - match get_expected_fault() { - Interrupts::GeneralProtectionFault => qemu::exit_qemu(qemu::QemuExitCode::Success), - _ => panic!( - "GENERAL PROTECTION exception thrown\nerror code: {:x}\n{}", - error_code, - exception_default!(stack_frame) - ), - } -} - -pub extern "x86-interrupt" fn page_fault_handler( - stack_frame: &mut InterruptStackFrame, - error_code: PageFaultErrorCode, -) { - use x86_64::registers::control::Cr2; - - match get_expected_fault() { - Interrupts::PageFault => qemu::exit_qemu(qemu::QemuExitCode::Success), - _ => panic!( - "PAGE FAULT while accessing address: 0x{:08x}\nerror code: {:?}(0x{:x})\n{}", - Cr2::read().as_u64(), - error_code, - error_code.bits(), - exception_default!(stack_frame) - ), - } -} - -pub extern "x86-interrupt" fn segment_not_present_handler( - stack_frame: &mut InterruptStackFrame, - error_code: u64, -) { - match get_expected_fault() { - Interrupts::NotPresent => qemu::exit_qemu(qemu::QemuExitCode::Success), - _ => panic!( - "SEGMENT NOT PRESENT exception\nerror code: 0x{:x}\n{}", - error_code, - exception_default!(stack_frame) - ), - } -} - -pub extern "x86-interrupt" fn double_fault_handler( - stack_frame: &mut InterruptStackFrame, - _error_code: u64, // code is always zero -) { - match get_expected_fault() { - Interrupts::DoubleFault => qemu::exit_qemu(qemu::QemuExitCode::Success), - _ => panic!( - "DOUBLE FAULT\nthis is a fatal exception\n{}", - exception_default!(stack_frame) - ), - } -} diff --git a/kernel/src/interrupts/idt.rs b/kernel/src/interrupts/idt.rs index 87f16c0..4978755 100644 --- a/kernel/src/interrupts/idt.rs +++ b/kernel/src/interrupts/idt.rs @@ -1,4 +1,4 @@ -use super::{exceptions, gdt, interrupts, Interrupts}; +use super::{exception_handlers, gdt, interrupt_handlers, Interrupts}; use lazy_static::lazy_static; use x86_64::structures::idt::InterruptDescriptorTable; @@ -6,20 +6,20 @@ lazy_static! { static ref IDT: InterruptDescriptorTable = { let mut idt = InterruptDescriptorTable::new(); idt.breakpoint - .set_handler_fn(exceptions::breakpoint_handler); + .set_handler_fn(exception_handlers::breakpoint_handler); idt.segment_not_present - .set_handler_fn(exceptions::segment_not_present_handler); + .set_handler_fn(exception_handlers::segment_not_present_handler); idt.general_protection_fault - .set_handler_fn(exceptions::general_protection_fault_handler); + .set_handler_fn(exception_handlers::general_protection_fault_handler); unsafe { idt.double_fault - .set_handler_fn(exceptions::double_fault_handler) + .set_handler_fn(exception_handlers::double_fault_handler) .set_stack_index(gdt::DOUBLE_FAULT_IST_INDEX); idt.page_fault - .set_handler_fn(exceptions::page_fault_handler) + .set_handler_fn(exception_handlers::page_fault_handler) .set_stack_index(gdt::PAGE_FAULT_IST_INDEX); } - idt[Interrupts::Timer.as_usize()].set_handler_fn(interrupts::timer_handler); + idt[Interrupts::Timer.as_usize()].set_handler_fn(interrupt_handlers::timer_handler); idt }; diff --git a/kernel/src/interrupts/interrupt_handlers.rs b/kernel/src/interrupts/interrupt_handlers.rs new file mode 100644 index 0000000..6296375 --- /dev/null +++ b/kernel/src/interrupts/interrupt_handlers.rs @@ -0,0 +1,8 @@ +use super::Interrupts; +use crate::io::qemu; +use x86_64::structures::idt::{InterruptStackFrame, PageFaultErrorCode}; + +pub extern "x86-interrupt" fn timer_handler(stack_frame: &mut InterruptStackFrame) { + panic!("Timer interrupt recieved\n\n") + // notify End of interrupt +} diff --git a/kernel/src/interrupts/interrupts.rs b/kernel/src/interrupts/interrupts.rs deleted file mode 100644 index 6296375..0000000 --- a/kernel/src/interrupts/interrupts.rs +++ /dev/null @@ -1,8 +0,0 @@ -use super::Interrupts; -use crate::io::qemu; -use x86_64::structures::idt::{InterruptStackFrame, PageFaultErrorCode}; - -pub extern "x86-interrupt" fn timer_handler(stack_frame: &mut InterruptStackFrame) { - panic!("Timer interrupt recieved\n\n") - // notify End of interrupt -} diff --git a/kernel/src/interrupts/mod.rs b/kernel/src/interrupts/mod.rs index bc313b8..1cab595 100644 --- a/kernel/src/interrupts/mod.rs +++ b/kernel/src/interrupts/mod.rs @@ -1,8 +1,8 @@ pub mod apic; -pub mod exceptions; +pub mod exception_handlers; pub mod gdt; pub mod idt; -pub mod interrupts; +pub mod interrupt_handlers; const INT_OFFSET: u8 = 32; diff --git a/kernel/tests/int3.rs b/kernel/tests/int3.rs index f5b5470..e71ff68 100644 --- a/kernel/tests/int3.rs +++ b/kernel/tests/int3.rs @@ -6,14 +6,14 @@ use kernel; use kernel::interrupts; -use kernel::interrupts::exceptions; +use kernel::interrupts::exception_handlers; use kernel::io::qemu; #[no_mangle] extern "C" fn _start() -> ! { kernel::init(); unsafe { - exceptions::expect_fault(interrupts::Interrupts::Breakpoint); + exception_handlers::expect_fault(interrupts::Interrupts::Breakpoint); } x86_64::instructions::interrupts::int3(); panic!("BREAKPOINT not caught"); diff --git a/kernel/tests/stack_overflow.rs b/kernel/tests/stack_overflow.rs index 9e75f59..5ddc1ae 100644 --- a/kernel/tests/stack_overflow.rs +++ b/kernel/tests/stack_overflow.rs @@ -7,14 +7,14 @@ use core::fmt::Write; use kernel; use kernel::interrupts; -use kernel::interrupts::exceptions; +use kernel::interrupts::exception_handlers; use kernel::io::qemu; #[no_mangle] extern "C" fn _start() -> ! { kernel::init(); unsafe { - exceptions::expect_fault(interrupts::Interrupts::PageFault); + exception_handlers::expect_fault(interrupts::Interrupts::PageFault); } _loop(0); panic!("PAGE_FAULT not caught"); -- cgit v1.2.3-54-g00ecf