diff options
| -rw-r--r-- | sys/src/boot/efi/fs.c | 45 |
1 files changed, 35 insertions, 10 deletions
diff --git a/sys/src/boot/efi/fs.c b/sys/src/boot/efi/fs.c index 7850a5e81..c6d2331a8 100644 --- a/sys/src/boot/efi/fs.c +++ b/sys/src/boot/efi/fs.c @@ -87,23 +87,48 @@ int fsinit(void **pf) { EFI_SIMPLE_FILE_SYSTEM_PROTOCOL *fs; + EFI_FILE_PROTOCOL *root; + EFI_HANDLE *Handles; + void *f; + UINTN Count; + int i; - fs = nil; - fsroot = nil; - if(eficall(ST->BootServices->LocateProtocol, - &EFI_SIMPLE_FILE_SYSTEM_PROTOCOL_GUID, nil, &fs)) - return -1; - if(eficall(fs->OpenVolume, fs, &fsroot)){ - fsroot = nil; + Count = 0; + Handles = nil; + if(eficall(ST->BootServices->LocateHandleBuffer, + ByProtocol, &EFI_SIMPLE_FILE_SYSTEM_PROTOCOL_GUID, nil, &Count, &Handles)) return -1; + + /* + * assuming the ESP is the first entry in the handle buffer, so go backwards + * to scan for plan9.ini in other (9fat) filesystems first. if nothing is found + * we'll be defaulting to the ESP. + */ + fsroot = nil; + for(i=Count-1; i>=0; i--){ + root = nil; + fs = nil; + if(eficall(ST->BootServices->HandleProtocol, + Handles[i], &EFI_SIMPLE_FILE_SYSTEM_PROTOCOL_GUID, &fs)) + continue; + if(eficall(fs->OpenVolume, fs, &root)) + continue; + fsroot = root; + f = fsopen("/plan9.ini"); + if(f != nil){ + if(pf != nil) + *pf = f; + else + fsclose(f); + break; + } } + if(fsroot == nil) + return -1; read = fsread; close = fsclose; open = fsopen; - if(pf != nil) - *pf = fsopen("/plan9.ini"); - return 0; } |
