ref: 8527a84b3e8059a16e5ac3e6c2aeabe97e162879
parent: 5f455f68396b635a8723c70b97df70874f9a2a92
author: cinap_lenrek <cinap_lenrek@felloff.net>
date: Fri Jun 5 01:09:22 EDT 2015
9boot: look for plan9.ini in all filesystems accessible to efi to find plan9 partition try the handle buffer in reverse order looking for plan9.ini to find plan9 partition (9fat). when that fails, we'll default to the first handle which should be the esp.
--- a/sys/src/boot/efi/fs.c
+++ b/sys/src/boot/efi/fs.c
@@ -87,23 +87,48 @@
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))
+ Count = 0;
+ Handles = nil;
+ if(eficall(ST->BootServices->LocateHandleBuffer,
+ ByProtocol, &EFI_SIMPLE_FILE_SYSTEM_PROTOCOL_GUID, nil, &Count, &Handles))
return -1;
- if(eficall(fs->OpenVolume, fs, &fsroot)){- fsroot = nil;
- 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;
}
--
⑨