aboutsummaryrefslogtreecommitdiff
path: root/src/arch/x86_64/paging/fault.rs
blob: 7b27649e86d58f70c770ece4f021d1ca60c27840 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
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;
}