rustubs/arch/x86_64/paging/
fault.rs

1use crate::arch::x86_64::arch_regs::TrapFrame;
2use crate::io::*;
3use core::arch::asm;
4
5/// handle page fault: for now we only check if the faulting addr is within
6/// kernel heap range.
7/// TODO: improve this later
8pub fn page_fault_handler(frame: &mut TrapFrame, fault_addr: u64) {
9	let err_code = frame.err_code;
10	sprintln!("pagefault @ {:#X}, err {:#X?}", fault_addr, err_code);
11	sprintln!("{:#X?}", frame);
12	unsafe { asm!("hlt") };
13}
14
15/// for x86_64, return the CR3 register.
16#[inline]
17pub fn get_fault_addr() -> u64 {
18	let cr2: u64;
19	unsafe {
20		asm!("mov {}, cr2", out(reg) cr2);
21	}
22	cr2
23}