//! Physical final-sector read with adjacent-sector isolation. use super::*; use os_partitions_view::{Error as ViewError, ReadError, View}; pub fn run(boot: &BootData, allocator: &mut memory::FrameAllocator) -> Result<(), &'static str> { let before = allocator.remaining_pages(); let mut disk = virtio_ro_turkfs::RoDisk::open( boot, allocator, "TURKOS/OS/K1535-GET")?; if disk.capacity() != 2048 { return Err("k1535-disk-capacity"); } let mut mbr = [0u8; 512]; disk.read(0, &mut mbr)?; let table = os_partitions::parse(&mbr, 2048) .map_err(|_| "k1535-MBR-table")?; let first = table.entry(0).ok_or("k1535-first-partition")?; let second = table.entry(2).ok_or("k1535-second-partition")?; if first.start_lba != 1 || first.sectors != 100 || first.end_lba != 101 || second.start_lba != 101 || second.end_lba != 2048 { return Err("k1535-partition-layout"); } let view = View::new(first.start_lba, first.sectors, table.disk_sectors) .map_err(|_| "k1535-view-construction")?; let baseline = view; let mut neighbor_before = [0u8; 512]; let mut final_sector = [0u8; 512]; let mut neighbor_after = [0u8; 512]; disk.read(101, &mut neighbor_before)?; let mut translated_lba = 0; view.read(99, 1, |lba, count| { if count != 1 { return Err("k1535-read-span"); } translated_lba = lba; disk.read(lba, &mut final_sector) }).map_err(|_| "k1535-final-sector-read")?; let mut forbidden_calls = 0; let refusal = view.read(100, 1, |_lba, _count| { forbidden_calls += 1; Ok::<(), &'static str>(()) }); if refusal != Err(ReadError::View(ViewError::OutsidePartition)) || forbidden_calls != 0 || view != baseline { return Err("k1535-outside-request-submitted"); } disk.read(101, &mut neighbor_after)?; disk.close(allocator)?; if translated_lba != 100 || final_sector.iter().any(|&byte| byte != 0x5a) || neighbor_before.iter().any(|&byte| byte != 0xa6) || neighbor_after != neighbor_before || allocator.remaining_pages() != before { return Err("k1535-neighbor-or-DMA-changed"); } write_line("TURKOS/OS/K1535-VIEW: PHYSICAL=READ LAST=99:100 OUTSIDE=REJECTED NEIGHBOR=UNCHANGED IO=4 FRAMES=RETURNED"); Ok(()) }