From ca8bc76fd5319842954508484542f4beb6b591d0 Mon Sep 17 00:00:00 2001 From: Tianhao Wang Date: Wed, 5 Jun 2024 23:24:01 +0200 Subject: interrupt: set up dummy pagefault handler Signed-off-by: Tianhao Wang --- src/arch/x86_64/paging/fault.rs | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) create mode 100644 src/arch/x86_64/paging/fault.rs (limited to 'src/arch/x86_64/paging/fault.rs') diff --git a/src/arch/x86_64/paging/fault.rs b/src/arch/x86_64/paging/fault.rs new file mode 100644 index 0000000..7b27649 --- /dev/null +++ b/src/arch/x86_64/paging/fault.rs @@ -0,0 +1,33 @@ +use crate::arch::x86_64::arch_regs::TrapFrame; +use crate::io::*; +use core::arch::asm; + +/// handle page fault: for now we only check if the faulting addr is within +/// kernel heap range. +/// TODO: improve this later +pub fn page_fault_handler(frame: &mut TrapFrame, fault_addr: u64) { + let err_code = frame.err_code; + println!("pagefault @ {:#X}, err {:#X?}", fault_addr, err_code); + unsafe { asm!("hlt") }; +} + +/// for x86_64, return the CR3 register. +/// TODO: use page root in task struct instead of raw cr3 +#[inline] +pub fn get_root() -> u64 { + let cr3: u64; + unsafe { + asm!("mov {}, cr3", out(reg) cr3); + } + return cr3; +} + +/// for x86_64, return the CR3 register. +#[inline] +pub fn get_fault_addr() -> u64 { + let cr2: u64; + unsafe { + asm!("mov {}, cr2", out(reg) cr2); + } + return cr2; +} -- cgit v1.2.3-70-g09d2