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:
Liming Gao 2016-07-25 22:00:22 +08:00
parent 0aa09042dd
commit 2f01478894
1 changed files with 76 additions and 40 deletions

View File

@ -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,51 +2206,78 @@ 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;
Data = NULL;
Status = GetSectionFromFv (
PcdGetPtr (PcdBootManagerMenuFile),
EFI_SECTION_PE32,
0,
(VOID **) &Data,
&DataSize
);
if (Data != NULL) {
FreePool (Data);
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 (EFI_ERROR (Status)) {
DEBUG ((EFI_D_WARN, "[Bds]BootManagerMenu FFS section can not be found, skip its boot option registration\n"));
return EFI_NOT_FOUND;
if (HandleCount != 0) {
FreePool (Handles);
}
//
// Get BootManagerMenu application's description from EFI User Interface Section.
//
Status = GetSectionFromFv (
PcdGetPtr (PcdBootManagerMenuFile),
EFI_SECTION_USER_INTERFACE,
0,
(VOID **) &Description,
&DescriptionLength
);
if (EFI_ERROR (Status)) {
Description = NULL;
}
if (DevicePath == NULL) {
Data = NULL;
Status = GetSectionFromFv (
PcdGetPtr (PcdBootManagerMenuFile),
EFI_SECTION_PE32,
0,
(VOID **) &Data,
&DataSize
);
if (Data != NULL) {
FreePool (Data);
}
if (EFI_ERROR (Status)) {
DEBUG ((EFI_D_WARN, "[Bds]BootManagerMenu FFS section can not be found, skip its boot option registration\n"));
return EFI_NOT_FOUND;
}
EfiInitializeFwVolDevicepathNode (&FileNode, PcdGetPtr (PcdBootManagerMenuFile));
Status = gBS->HandleProtocol (
gImageHandle,
&gEfiLoadedImageProtocolGuid,
(VOID **) &LoadedImage
);
ASSERT_EFI_ERROR (Status);
DevicePath = AppendDevicePathNode (
DevicePathFromHandle (LoadedImage->DeviceHandle),
(EFI_DEVICE_PATH_PROTOCOL *) &FileNode
);
ASSERT (DevicePath != NULL);
//
// Get BootManagerMenu application's description from EFI User Interface Section.
//
Status = GetSectionFromFv (
PcdGetPtr (PcdBootManagerMenuFile),
EFI_SECTION_USER_INTERFACE,
0,
(VOID **) &Description,
&DescriptionLength
);
if (EFI_ERROR (Status)) {
Description = NULL;
}
EfiInitializeFwVolDevicepathNode (&FileNode, PcdGetPtr (PcdBootManagerMenuFile));
Status = gBS->HandleProtocol (
gImageHandle,
&gEfiLoadedImageProtocolGuid,
(VOID **) &LoadedImage
);
ASSERT_EFI_ERROR (Status);
DevicePath = AppendDevicePathNode (
DevicePathFromHandle (LoadedImage->DeviceHandle),
(EFI_DEVICE_PATH_PROTOCOL *) &FileNode
);
ASSERT (DevicePath != NULL);
}
Status = EfiBootManagerInitializeLoadOption (
BootOption,