# Sovereign Ledger: VirtIO Block Driver ## Overview Phase 10 "The Sovereign Ledger" introduces persistent storage capabilities to **Rumpk** via a custom **VirtIO Block Driver**. This allows the **NipBox** userland to perform direct sector-level I/O operations on a raw disk image (`storage.img`), establishing the foundation for a future Sovereign Filesystem. ## Architecture ### 1. Hardware Abstraction (L0 HAL) - **Driver:** `hal/virtio_block.zig` - **Device ID:** `0x1001` (Legacy Block) or `0x1042` (Modern). - **Transport:** Leverages `hal/virtio_pci.zig` for universal PCI resource discovery and I/O port allocation. - **Mechanism:** Synchronous Polling (Busy Wait). - Uses a 3-Descriptor Chain per request: 1. **Header:** `VirtioBlkReq` (Type, Priority, Sector). 2. **Buffer:** Data payload (512 bytes). 3. **Status:** Completion byte (0 = OK). - **Orchestration:** Initialized in `hal/entry_riscv.zig` via `hal_io_init`. ### 2. Kernel Core (L1 Logic) - **Command Ring:** Adds `CMD_BLK_READ` (0x600) and `CMD_BLK_WRITE` (0x601) to `ion.nim`. - **Arguments:** `BlkArgs` structure marshals `sector`, `buffer_ptr`, and `len` across the User/Kernel boundary. - **Dispatch:** `kernel.nim` routes these commands from the `chan_cmd` ring directly to the HAL functions `virtio_blk_read/write`. ### 3. Userland Shim (Membrane) - **Syscalls:** `libc_shim.zig` exposes `nexus_blk_read` and `nexus_blk_write`. - **Packaging:** These wrappers construct the `BlkArgs` struct and invoke `nexus_syscall`. ### 4. Userland Application (NipBox) - **Command:** `dd` - **Syntax:** - `dd read `: Dumps the first 16 bytes of the sector in Hex. - `dd write `: Writes the string (UTF-8) to the sector, zero-padded. - **Protocol:** Uses the new IO syscalls to interact with the Ledger. ## Deployment & Verification - **Disk Image:** `build/storage.img` (Raw, 32MB). - **QEMU:** Attached via `-drive if=none,format=raw,file=build/storage.img,id=hd0 -device virtio-blk-pci,drive=hd0,disable-modern=on`. - **Status:** - **Write:** Confirmed successful (Hexdump valid on host). - **Read:** Driver operation successful, data verification ongoing. - **Boot:** Stable initialization of both Network and Block devices simultaneously (via fixed PCI I/O allocation). ## Next Steps - **Data Integrity:** Investigate zero-readback issue (likely buffer address mapping or flag polarity). - **Filesystem:** Implement a minimalist inode-based FS (SovFS) on top of the raw ledger. - **Async I/O:** Move from busy-polling to Interrupt-driven (Virtqueue Notification) for high throughput.