Skip to main content

kernel/arch/x86_64/interrupts/exceptions/
_14_page_fault.rs

1// SPDX-License-Identifier: GPL-3.0-only
2//! Page-fault exception handler (vector 14).
3//!
4//! Authors: MarioS271
5
6use core::fmt::Write;
7use crate::panic::kernel_panic;
8use crate::types::panic_codes::PanicCode;
9use x86_64::structures::idt::{InterruptStackFrame, PageFaultErrorCode};
10use x86_64::registers::control::Cr2;
11use crate::types::fmt_buffer::FmtBuffer;
12
13/// Panic with the faulting address (from CR2), the error code, and the interrupt stack frame.
14pub extern "x86-interrupt" fn handler(
15    isf: InterruptStackFrame,
16    error_code: PageFaultErrorCode
17) {
18    let cr2_value = Cr2::read_raw();
19    let mut fmt_buffer = FmtBuffer::<512>::new();
20    let _ = write!(&mut fmt_buffer, "CR2: {}\nError Code:\n{:?}\n\n{:#?}", cr2_value, error_code, isf);
21    kernel_panic(
22        PanicCode::PageFault,
23        fmt_buffer.as_str(),
24    );
25}