summaryrefslogtreecommitdiff
path: root/kernel/src/interrupts/exception_handlers.rs
diff options
context:
space:
mode:
authorDennis Kobert <dennis@kobert.dev>2021-04-18 19:01:54 +0200
committerDennis Kobert <dennis@kobert.dev>2021-04-18 19:01:54 +0200
commit496ccaaf750a4ec1c537c463eff56108e1cc0bb4 (patch)
treef0ccffc3fd823cc4016c29d45408c033c973e5d5 /kernel/src/interrupts/exception_handlers.rs
parent8b810a009f8d29ba61a3c377fdeac06a3bbb151d (diff)
Further cleanupfurther-cleanup
* Bump x86_64 dep to version 0.1.14 * Rewrite LOCAL_APIC handling * Remove warnings
Diffstat (limited to 'kernel/src/interrupts/exception_handlers.rs')
-rw-r--r--kernel/src/interrupts/exception_handlers.rs17
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() {