//! Reserved metadata bitmap and last-free-block guest probe. use super::*; use os_turkfs_allocation::{Bitmap, Counts, Error}; const METADATA: u64 = 0x1f; pub fn run(allocator: &mut memory::FrameAllocator) -> Result<(), &'static str> { let frames_before = allocator.remaining_pages(); let mut bitmap = Bitmap::validate(64, METADATA, u64::MAX & !(1u64 << 63)) .map_err(|_| "k1625-valid")?; if bitmap.counts() != (Counts {reserved: 5, user: 58, free: 1}) || bitmap.allocate() != Ok(63) || bitmap.counts() != (Counts {reserved: 5, user: 59, free: 0}) { return Err("k1625-last"); } write_line("TURKOS/OS/K1625-BITMAP: LAST=63 OWNERS=64"); let malformed = u64::MAX & !(1u64 << 2); if Bitmap::validate(64, METADATA, malformed) != Err(Error::ReservedFree) { return Err("k1625-reserved-free"); } write_line("TURKOS/OS/K1625-BITMAP: RESERVED-FREE=REJECTED"); let full = bitmap; if bitmap.allocate() != Err(Error::NoSpace) || bitmap != full { return Err("k1625-no-space"); } write_line("TURKOS/OS/K1625-BITMAP: NOSPACE=UNCHANGED"); if bitmap.release(2) != Err(Error::ReservedBlock) || bitmap != full || bitmap.release(63) != Ok(()) || bitmap.counts() != (Counts {reserved: 5, user: 58, free: 1}) || allocator.remaining_pages() != frames_before { return Err("k1625-release"); } write_line("TURKOS/OS/K1625-BITMAP: RELEASE=RESTORED FRAMES=UNCHANGED"); Ok(()) }