diff options
| author | salmonik <salmonik@tuta.io> | 2026-07-31 19:53:53 +0200 |
|---|---|---|
| committer | salmonik <salmonik@tuta.io> | 2026-07-31 19:53:53 +0200 |
| commit | dc23d2f22cafeb6b97ba460789a834a6c586314d (patch) | |
| tree | 987bec11922073923c4c42bda84c0f670884dbca /rsdos/src/main.rs | |
| parent | vt: defer scrolls and batch framebuffer pushes (diff) | |
| download | rs-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 'rsdos/src/main.rs')
| -rw-r--r-- | rsdos/src/main.rs | 10 |
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() { |
