Nothing to see here, move along
1use spin::Once;
2
3use x86_64::{PhysAddr, VirtAddr};
4
5static HHDM_OFFSET: Once<u64> = Once::new();
6
7pub fn set_hhdm_offset(offset: u64) {
8 HHDM_OFFSET.call_once(|| offset);
9}
10
11#[inline]
12pub fn hhdm_offset() -> u64 {
13 *HHDM_OFFSET.get().expect("HHDM offset not initialized")
14}
15
16#[inline]
17pub fn phys_to_virt(phys: PhysAddr) -> VirtAddr {
18 VirtAddr::new(phys.as_u64() + hhdm_offset())
19}
20
21#[allow(dead_code)]
22pub fn virt_to_phys(virt: VirtAddr) -> Option<PhysAddr> {
23 virt.as_u64().checked_sub(hhdm_offset()).map(PhysAddr::new)
24}
25
26pub fn zero_frame(frame_phys: PhysAddr) {
27 assert!(
28 frame_phys.is_aligned(4096u64),
29 "zero_frame: address not page-aligned"
30 );
31 let virt = phys_to_virt(frame_phys);
32 unsafe {
33 core::ptr::write_bytes(virt.as_mut_ptr::<u8>(), 0, 4096);
34 }
35}