use spin::Once; use x86_64::{PhysAddr, VirtAddr}; static HHDM_OFFSET: Once = Once::new(); pub fn set_hhdm_offset(offset: u64) { HHDM_OFFSET.call_once(|| offset); } #[inline] pub fn hhdm_offset() -> u64 { *HHDM_OFFSET.get().expect("HHDM offset not initialized") } #[inline] pub fn phys_to_virt(phys: PhysAddr) -> VirtAddr { VirtAddr::new(phys.as_u64() + hhdm_offset()) } #[allow(dead_code)] pub fn virt_to_phys(virt: VirtAddr) -> Option { virt.as_u64().checked_sub(hhdm_offset()).map(PhysAddr::new) } pub fn zero_frame(frame_phys: PhysAddr) { assert!( frame_phys.is_aligned(4096u64), "zero_frame: address not page-aligned" ); let virt = phys_to_virt(frame_phys); unsafe { core::ptr::write_bytes(virt.as_mut_ptr::(), 0, 4096); } }