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 Removable;
|
||||||
UINTN Index;
|
UINTN Index;
|
||||||
CHAR16 *Description;
|
CHAR16 *Description;
|
||||||
|
UINT32 BootAttributes;
|
||||||
|
|
||||||
ASSERT (BootOptionCount != NULL);
|
ASSERT (BootOptionCount != NULL);
|
||||||
|
|
||||||
@ -2059,7 +2060,7 @@ BmEnumerateBootOptions (
|
|||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// Parse load file, assuming UEFI Network boot option
|
// Parse load file protocol
|
||||||
//
|
//
|
||||||
gBS->LocateHandleBuffer (
|
gBS->LocateHandleBuffer (
|
||||||
ByProtocol,
|
ByProtocol,
|
||||||
@ -2078,11 +2079,19 @@ BmEnumerateBootOptions (
|
|||||||
);
|
);
|
||||||
ASSERT (BootOptions != NULL);
|
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 (
|
Status = EfiBootManagerInitializeLoadOption (
|
||||||
&BootOptions[(*BootOptionCount)++],
|
&BootOptions[(*BootOptionCount)++],
|
||||||
LoadOptionNumberUnassigned,
|
LoadOptionNumberUnassigned,
|
||||||
LoadOptionTypeBoot,
|
LoadOptionTypeBoot,
|
||||||
LOAD_OPTION_ACTIVE,
|
BootAttributes,
|
||||||
Description,
|
Description,
|
||||||
DevicePathFromHandle (Handles[Index]),
|
DevicePathFromHandle (Handles[Index]),
|
||||||
NULL,
|
NULL,
|
||||||
@ -2197,9 +2206,35 @@ BmRegisterBootManagerMenu (
|
|||||||
EFI_DEVICE_PATH_PROTOCOL *DevicePath;
|
EFI_DEVICE_PATH_PROTOCOL *DevicePath;
|
||||||
EFI_LOADED_IMAGE_PROTOCOL *LoadedImage;
|
EFI_LOADED_IMAGE_PROTOCOL *LoadedImage;
|
||||||
MEDIA_FW_VOL_FILEPATH_DEVICE_PATH FileNode;
|
MEDIA_FW_VOL_FILEPATH_DEVICE_PATH FileNode;
|
||||||
|
UINTN HandleCount;
|
||||||
|
EFI_HANDLE *Handles;
|
||||||
|
UINTN Index;
|
||||||
VOID *Data;
|
VOID *Data;
|
||||||
UINTN DataSize;
|
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;
|
Data = NULL;
|
||||||
Status = GetSectionFromFv (
|
Status = GetSectionFromFv (
|
||||||
PcdGetPtr (PcdBootManagerMenuFile),
|
PcdGetPtr (PcdBootManagerMenuFile),
|
||||||
@ -2242,6 +2277,7 @@ BmRegisterBootManagerMenu (
|
|||||||
(EFI_DEVICE_PATH_PROTOCOL *) &FileNode
|
(EFI_DEVICE_PATH_PROTOCOL *) &FileNode
|
||||||
);
|
);
|
||||||
ASSERT (DevicePath != NULL);
|
ASSERT (DevicePath != NULL);
|
||||||
|
}
|
||||||
|
|
||||||
Status = EfiBootManagerInitializeLoadOption (
|
Status = EfiBootManagerInitializeLoadOption (
|
||||||
BootOption,
|
BootOption,
|
||||||
|
Reference in New Issue
Block a user