Nothing to see here, move along
at main 35 lines 815 B view raw
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}