MdeModulePkg UefiBootManagerLib: Support LoadFile Protocol based on FV
New LoadFileOnFv2 driver will install LoadFile protocol based on FV file. Update UefiBootManagerLib to find BootMenuApp with LoadFile protocol. Cc: Ruiyu Ni <ruiyu.ni@intel.com> Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Liming Gao <liming.gao@intel.com> Reviewed-by: Ruiyu Ni <ruiyu.ni@intel.com>
This commit is contained in:
@ -1940,6 +1940,7 @@ BmEnumerateBootOptions (
|
||||
UINTN Removable;
|
||||
UINTN Index;
|
||||
CHAR16 *Description;
|
||||
UINT32 BootAttributes;
|
||||
|
||||
ASSERT (BootOptionCount != NULL);
|
||||
|
||||
@ -2059,7 +2060,7 @@ BmEnumerateBootOptions (
|
||||
}
|
||||
|
||||
//
|
||||
// Parse load file, assuming UEFI Network boot option
|
||||
// Parse load file protocol
|
||||
//
|
||||
gBS->LocateHandleBuffer (
|
||||
ByProtocol,
|
||||
@ -2078,11 +2079,19 @@ BmEnumerateBootOptions (
|
||||
);
|
||||
ASSERT (BootOptions != NULL);
|
||||
|
||||
//
|
||||
// If LoadFile includes BootMenuApp, its boot attribue will be set to APP and HIDDEN.
|
||||
//
|
||||
BootAttributes = LOAD_OPTION_ACTIVE;
|
||||
if (BmIsBootMenuAppFilePath (DevicePathFromHandle (Handles[Index]))) {
|
||||
BootAttributes = LOAD_OPTION_CATEGORY_APP | LOAD_OPTION_ACTIVE | LOAD_OPTION_HIDDEN;
|
||||
}
|
||||
|
||||
Status = EfiBootManagerInitializeLoadOption (
|
||||
&BootOptions[(*BootOptionCount)++],
|
||||
LoadOptionNumberUnassigned,
|
||||
LoadOptionTypeBoot,
|
||||
LOAD_OPTION_ACTIVE,
|
||||
BootAttributes,
|
||||
Description,
|
||||
DevicePathFromHandle (Handles[Index]),
|
||||
NULL,
|
||||
@ -2197,9 +2206,35 @@ BmRegisterBootManagerMenu (
|
||||
EFI_DEVICE_PATH_PROTOCOL *DevicePath;
|
||||
EFI_LOADED_IMAGE_PROTOCOL *LoadedImage;
|
||||
MEDIA_FW_VOL_FILEPATH_DEVICE_PATH FileNode;
|
||||
UINTN HandleCount;
|
||||
EFI_HANDLE *Handles;
|
||||
UINTN Index;
|
||||
VOID *Data;
|
||||
UINTN DataSize;
|
||||
|
||||
DevicePath = NULL;
|
||||
//
|
||||
// Try to find BootMenuApp from LoadFile protocol
|
||||
//
|
||||
gBS->LocateHandleBuffer (
|
||||
ByProtocol,
|
||||
&gEfiLoadFileProtocolGuid,
|
||||
NULL,
|
||||
&HandleCount,
|
||||
&Handles
|
||||
);
|
||||
for (Index = 0; Index < HandleCount; Index++) {
|
||||
if (BmIsBootMenuAppFilePath (DevicePathFromHandle (Handles[Index]))) {
|
||||
DevicePath = DuplicateDevicePath (DevicePathFromHandle (Handles[Index]));
|
||||
Description = BmGetBootDescription (Handles[Index]);
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (HandleCount != 0) {
|
||||
FreePool (Handles);
|
||||
}
|
||||
|
||||
if (DevicePath == NULL) {
|
||||
Data = NULL;
|
||||
Status = GetSectionFromFv (
|
||||
PcdGetPtr (PcdBootManagerMenuFile),
|
||||
@ -2242,6 +2277,7 @@ BmRegisterBootManagerMenu (
|
||||
(EFI_DEVICE_PATH_PROTOCOL *) &FileNode
|
||||
);
|
||||
ASSERT (DevicePath != NULL);
|
||||
}
|
||||
|
||||
Status = EfiBootManagerInitializeLoadOption (
|
||||
BootOption,
|
||||
|
Reference in New Issue
Block a user