summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sys/src/boot/efi/fs.c45
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;
}