use crate::mem::phys::BitmapFrameAllocator; crate::kernel_test!( fn allocate_returns_aligned_nonzero() { let alloc = BitmapFrameAllocator; let frame = alloc.allocate().expect("allocation failed"); let addr = frame.phys_addr().as_u64(); assert!(addr != 0, "allocated frame has zero address"); assert!( addr.is_multiple_of(4096), "frame not page-aligned: {:#x}", addr ); } ); crate::kernel_test!( fn allocate_then_free_restores_count() { let before = BitmapFrameAllocator::free_frames(); let frame = BitmapFrameAllocator.allocate().expect("allocation failed"); assert_eq!( BitmapFrameAllocator::free_frames(), before - 1, "free count did not decrease" ); drop(frame); assert_eq!( BitmapFrameAllocator::free_frames(), before, "free count did not restore after drop" ); } ); crate::kernel_test!( fn bitmap_invariant_holds() { let total = BitmapFrameAllocator::total_frames(); let used = BitmapFrameAllocator::used_frames(); let free = BitmapFrameAllocator::free_frames(); assert_eq!( used + free, total, "invariant broken: used({}) + free({}) != total({})", used, free, total ); } ); crate::kernel_test!( fn write_and_readback_through_hhdm() { let frame = BitmapFrameAllocator.allocate().expect("allocation failed"); let virt = crate::mem::addr::phys_to_virt(frame.phys_addr()); let ptr: *mut u64 = virt.as_mut_ptr(); let pattern: u64 = 0xA5A5_5A5A_DEAD_BEEF; unsafe { ptr.write_volatile(pattern) }; let readback = unsafe { ptr.read_volatile() }; assert_eq!(readback, pattern, "write/readback mismatch through HHDM"); } );