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.
This commit is contained in:
parent
045530aed2
commit
bbc35cc01b
1 changed files with 35 additions and 10 deletions
|
@ -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;
|
||||
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;
|
||||
if(eficall(ST->BootServices->LocateProtocol,
|
||||
&EFI_SIMPLE_FILE_SYSTEM_PROTOCOL_GUID, nil, &fs))
|
||||
return -1;
|
||||
if(eficall(fs->OpenVolume, fs, &fsroot)){
|
||||
fsroot = nil;
|
||||
return -1;
|
||||
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;
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue