diff options
| author | salmonik <salmonik@tuta.io> | 2026-07-31 21:29:49 +0200 |
|---|---|---|
| committer | salmonik <salmonik@tuta.io> | 2026-07-31 21:29:49 +0200 |
| commit | 3997ec4d2d7d6f69b08d0c04ce8de0df03c52a45 (patch) | |
| tree | 60c5b079103e74d919a32b24276c536e69ce82f7 /rsnix/src/fat.rs | |
| parent | ahci: SATA driver + FAT32 persistent disk mounted at /disk (diff) | |
| download | rs-dos-3997ec4d2d7d6f69b08d0c04ce8de0df03c52a45.tar.gz rs-dos-3997ec4d2d7d6f69b08d0c04ce8de0df03c52a45.zip | |
ahci: scan all ports; fat: mount first valid FAT32 disk
The kernel previously started only AHCI port 0, so any launch where the
firmware/QEMU put something else on port 0 (e.g. the ESP from an implicit
-drive file=fat:rw:esp) left the real disk unnoticed: 'unsupported sector
size 0' and no mount.
- ahci.rs: enumerate CAP.NP/PI ports, start every port that links up
(empty ports settle at DET=0 and are skipped quickly), keep up to 8
disks, and expose disk_count()/select() for the filesystem
- fat.rs: try each disk in port order and mount the first valid FAT32
volume; non-FAT disks are logged and skipped
- scripts/boot.sh: attach the data disk on ide.0 and the ESP on ide.1
(DISK_IMG env var, default /tmp/disk.img), matching the Makefile
- Verified with the disk on port 0 (Makefile style), port 5 (old-style
command line), and with the ESP on port 0; fsck.fat stays clean
Diffstat (limited to '')
| -rw-r--r-- | rsnix/src/fat.rs | 25 |
1 files changed, 23 insertions, 2 deletions
diff --git a/rsnix/src/fat.rs b/rsnix/src/fat.rs index 70fa688..616a08f 100644 --- a/rsnix/src/fat.rs +++ b/rsnix/src/fat.rs | |||
| @@ -838,9 +838,30 @@ pub fn remove(parent_dir_cluster: u32, name: &str) -> Result<(), ()> { | |||
| 838 | 838 | ||
| 839 | // --- mount ------------------------------------------------------------------- | 839 | // --- mount ------------------------------------------------------------------- |
| 840 | 840 | ||
| 841 | /// Parse the BPB, cache the FAT and validate the volume. Returns true if | 841 | /// Try to mount a FAT32 volume on every attached disk, in port order, and |
| 842 | /// a usable FAT32 volume is mounted. | 842 | /// keep the first one that validates. Returns true if a usable FAT32 |
| 843 | /// volume is mounted. | ||
| 843 | pub fn init() -> bool { | 844 | pub fn init() -> bool { |
| 845 | let disks = crate::ahci::disk_count(); | ||
| 846 | if disks == 0 { | ||
| 847 | crate::serial_println!("fat: no disk"); | ||
| 848 | return false; | ||
| 849 | } | ||
| 850 | for d in 0..disks { | ||
| 851 | if !crate::ahci::select(d) { | ||
| 852 | continue; | ||
| 853 | } | ||
| 854 | if try_mount() { | ||
| 855 | return true; | ||
| 856 | } | ||
| 857 | crate::serial_println!("fat: no FAT32 volume on disk {}", d); | ||
| 858 | } | ||
| 859 | false | ||
| 860 | } | ||
| 861 | |||
| 862 | /// Parse the BPB of the selected disk, cache the FAT and validate the | ||
| 863 | /// volume. | ||
| 864 | fn try_mount() -> bool { | ||
| 844 | let mut bpb = [0u8; SECTOR]; | 865 | let mut bpb = [0u8; SECTOR]; |
| 845 | if read_sector(0, &mut bpb).is_err() { | 866 | if read_sector(0, &mut bpb).is_err() { |
| 846 | crate::serial_println!("fat: no disk"); | 867 | crate::serial_println!("fat: no disk"); |
