//! Three real separated virtio sectors, bounded logical bytes, and hash oracle. use super::*; use os_turkfs_reader::{BlockReader, Error, Extent, File}; const EXPECTED_SHA256: &[u8; 64] = b"5ab4d3c0b1612817d6c4335036f9445aead46ff52ff5ae3a00d4245b98582854"; struct Transport<'a>(&'a mut virtio_ro_turkfs::RoDisk); impl BlockReader for Transport<'_> { fn read_block(&mut self, lba: u64, output: &mut [u8; 512]) -> Result<(), ()> { self.0.read(lba, output).map_err(|_| ()) } } fn extents() -> [Extent; 3] { [Extent { first_block: 100, block_count: 1 }, Extent { first_block: 104, block_count: 1 }, Extent { first_block: 108, block_count: 1 }] } pub fn run(boot: &BootData, allocator: &mut memory::FrameAllocator) -> Result<(), &'static str> { let frames_before = allocator.remaining_pages(); let file = File::validate(extents(), 1300, 2048) .map_err(|_| "k1615-extents")?; if file.extents() != extents() || file.size() != 1300 { return Err("k1615-descriptor"); } write_line("TURKOS/OS/K1615-EXTENTS: THREE=ORDERED"); let mut overlap = extents(); overlap[1].first_block = 100; if File::validate(overlap, 1300, 2048) != Err(Error::Overlap) { return Err("k1615-overlap"); } write_line("TURKOS/OS/K1615-EXTENTS: OVERLAP=REJECTED"); let mut disk = virtio_ro_turkfs::RoDisk::open( boot, allocator, "TURKOS/OS/K1615-GET")?; if disk.capacity() != 2048 { return Err("k1615-capacity"); } let mut output = [0xa5u8; 1301]; let read = file.read_all(&mut Transport(&mut disk), &mut output); disk.close(allocator)?; if read != Ok(1300) || output[1300] != 0xa5 { return Err("k1615-read"); } let digest = turkos_kernel::turkfs::file_sha256(&output[..1300]); let hex = turkos_kernel::program_hash::hex_lower(&digest); if &hex != EXPECTED_SHA256 { return Err("k1615-hash"); } write_line("TURKOS/OS/K1615-READ: SHA256=5ab4d3c0b1612817d6c4335036f9445aead46ff52ff5ae3a00d4245b98582854"); if allocator.remaining_pages() != frames_before { return Err("k1615-frames"); } write_line("TURKOS/OS/K1615-READ: BYTES=1300 FRAMES=UNCHANGED"); Ok(()) }