summaryrefslogtreecommitdiffstats
path: root/rsdos/src
diff options
context:
space:
mode:
authorsalmonik <salmonik@tuta.io>2026-07-31 19:53:53 +0200
committersalmonik <salmonik@tuta.io>2026-07-31 19:53:53 +0200
commitdc23d2f22cafeb6b97ba460789a834a6c586314d (patch)
tree987bec11922073923c4c42bda84c0f670884dbca /rsdos/src
parentvt: defer scrolls and batch framebuffer pushes (diff)
downloadrs-dos-dc23d2f22cafeb6b97ba460789a834a6c586314d.tar.gz
rs-dos-dc23d2f22cafeb6b97ba460789a834a6c586314d.zip
ahci: SATA driver + FAT32 persistent disk mounted at /disk
- ahci.rs: polling AHCI on PCI class 1/6/1, bus mastering + ABAR map, port 0 up, IDENTIFY + READ/WRITE DMA EXT through one 4KiB DMA buffer - fat.rs: BPB parse, whole-FAT RAM cache with write-back to both copies, LFN read/write, dirs, multi-cluster files, FSInfo free-count sync, space-padded dot entries ('..' = cluster 0 under root), fsck-clean - fs.rs: /disk mount node + 24-slot ephemeral node pool; ls/cat/hexdump/ echo/mkdir/touch/rm/edit all work on disk paths unchanged - QEMU: explicit bus assignment (disk=ide.0, ESP=ide.1); the implicit fat:rw:esp drive was stealing AHCI port 0 - Debugged against QEMU source: header DW0 is CFL in bits 4:0 / PRDTL in bits 31:16 (Linux libahci layout), FIS count at bytes 12-13, device at byte 7; QEMU rejects H2D FIS flags bits 6:4, so direction is the header W bit only - Verified: full shell round-trip on /disk, reboot persistence (poweroff then mdir/mtype and a fresh boot), fsck.fat clean
Diffstat (limited to '')
-rw-r--r--rsdos/src/main.rs10
1 files changed, 10 insertions, 0 deletions
diff --git a/rsdos/src/main.rs b/rsdos/src/main.rs
index c36660e..181d3e2 100644
--- a/rsdos/src/main.rs
+++ b/rsdos/src/main.rs
@@ -166,6 +166,16 @@ pub extern "efiapi" fn efi_main(image_handle: Handle, system_table: *mut SystemT
166 let devices = rsnix::pci::probe(); 166 let devices = rsnix::pci::probe();
167 rsnix::serial_println!("pci: {} device(s) on all buses", devices.len()); 167 rsnix::serial_println!("pci: {} device(s) on all buses", devices.len());
168 168
169 // Disk: AHCI SATA driver, then mount a FAT32 volume if one is attached.
170 if !rsnix::ahci::init() {
171 rsnix::serial_println!("ahci: no disk attached");
172 }
173 if rsnix::fat::init() {
174 rsnix::serial_println!("fat: volume mounted at /disk");
175 } else {
176 rsnix::serial_println!("fat: no FAT32 volume");
177 }
178
169 let (dirs, files) = rsnix::fs::init(); 179 let (dirs, files) = rsnix::fs::init();
170 rsnix::serial_println!("fs: vfs ready — {} dirs, {} files", dirs, files); 180 rsnix::serial_println!("fs: vfs ready — {} dirs, {} files", dirs, files);
171 if rsnix::fs::self_test() { 181 if rsnix::fs::self_test() {