MdeModulePkg/UefiBootManager: Add EfiBootManagerDispatchDeferredImages
The API dispatches the deferred images that are returned from all DeferredImageLoad instances. Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Ruiyu Ni <ruiyu.ni@intel.com> Reviewed-by: Liming Gao <liming.gao@intel.com> Reviewed-by: Chao B Zhang <chao.b.zhang@intel.com> Reviewed-by: Sunny Wang <sunnywang@hpe.com>
This commit is contained in:
@ -777,4 +777,17 @@ EfiBootManagerIsValidLoadOptionVariableName (
|
|||||||
OUT UINT16 *OptionNumber OPTIONAL
|
OUT UINT16 *OptionNumber OPTIONAL
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
Dispatch the deferred images that are returned from all DeferredImageLoad instances.
|
||||||
|
|
||||||
|
@retval EFI_SUCCESS At least one deferred image is loaded successfully and started.
|
||||||
|
@retval EFI_NOT_FOUND There is no deferred image.
|
||||||
|
@retval EFI_ACCESS_DENIED There are deferred images but all of them are failed to load.
|
||||||
|
**/
|
||||||
|
EFI_STATUS
|
||||||
|
EFIAPI
|
||||||
|
EfiBootManagerDispatchDeferredImages (
|
||||||
|
VOID
|
||||||
|
);
|
||||||
#endif
|
#endif
|
||||||
|
@ -417,3 +417,116 @@ BmCharToUint (
|
|||||||
return (UINTN) -1;
|
return (UINTN) -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
Dispatch the deferred images that are returned from all DeferredImageLoad instances.
|
||||||
|
|
||||||
|
@retval EFI_SUCCESS At least one deferred image is loaded successfully and started.
|
||||||
|
@retval EFI_NOT_FOUND There is no deferred image.
|
||||||
|
@retval EFI_ACCESS_DENIED There are deferred images but all of them are failed to load.
|
||||||
|
**/
|
||||||
|
EFI_STATUS
|
||||||
|
EFIAPI
|
||||||
|
EfiBootManagerDispatchDeferredImages (
|
||||||
|
VOID
|
||||||
|
)
|
||||||
|
{
|
||||||
|
EFI_STATUS Status;
|
||||||
|
EFI_DEFERRED_IMAGE_LOAD_PROTOCOL *DeferredImage;
|
||||||
|
UINTN HandleCount;
|
||||||
|
EFI_HANDLE *Handles;
|
||||||
|
UINTN Index;
|
||||||
|
UINTN ImageIndex;
|
||||||
|
EFI_DEVICE_PATH_PROTOCOL *ImageDevicePath;
|
||||||
|
VOID *Image;
|
||||||
|
UINTN ImageSize;
|
||||||
|
BOOLEAN BootOption;
|
||||||
|
EFI_HANDLE ImageHandle;
|
||||||
|
UINTN ExitDataSize;
|
||||||
|
CHAR16 *ExitData;
|
||||||
|
UINTN ImageCount;
|
||||||
|
UINTN LoadCount;
|
||||||
|
|
||||||
|
//
|
||||||
|
// Find all the deferred image load protocols.
|
||||||
|
//
|
||||||
|
HandleCount = 0;
|
||||||
|
Handles = NULL;
|
||||||
|
Status = gBS->LocateHandleBuffer (
|
||||||
|
ByProtocol,
|
||||||
|
&gEfiDeferredImageLoadProtocolGuid,
|
||||||
|
NULL,
|
||||||
|
&HandleCount,
|
||||||
|
&Handles
|
||||||
|
);
|
||||||
|
if (EFI_ERROR (Status)) {
|
||||||
|
return EFI_NOT_FOUND;
|
||||||
|
}
|
||||||
|
|
||||||
|
ImageCount = 0;
|
||||||
|
LoadCount = 0;
|
||||||
|
for (Index = 0; Index < HandleCount; Index++) {
|
||||||
|
Status = gBS->HandleProtocol (Handles[Index], &gEfiDeferredImageLoadProtocolGuid, (VOID **) &DeferredImage);
|
||||||
|
if (EFI_ERROR (Status)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (ImageIndex = 0; ;ImageIndex++) {
|
||||||
|
//
|
||||||
|
// Load all the deferred images in this protocol instance.
|
||||||
|
//
|
||||||
|
Status = DeferredImage->GetImageInfo (
|
||||||
|
DeferredImage,
|
||||||
|
ImageIndex,
|
||||||
|
&ImageDevicePath,
|
||||||
|
(VOID **) &Image,
|
||||||
|
&ImageSize,
|
||||||
|
&BootOption
|
||||||
|
);
|
||||||
|
if (EFI_ERROR (Status)) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
ImageCount++;
|
||||||
|
//
|
||||||
|
// Load and start the image.
|
||||||
|
//
|
||||||
|
Status = gBS->LoadImage (
|
||||||
|
BootOption,
|
||||||
|
gImageHandle,
|
||||||
|
ImageDevicePath,
|
||||||
|
NULL,
|
||||||
|
0,
|
||||||
|
&ImageHandle
|
||||||
|
);
|
||||||
|
if (!EFI_ERROR (Status)) {
|
||||||
|
LoadCount++;
|
||||||
|
//
|
||||||
|
// Before calling the image, enable the Watchdog Timer for
|
||||||
|
// a 5 Minute period
|
||||||
|
//
|
||||||
|
gBS->SetWatchdogTimer (5 * 60, 0x0000, 0x00, NULL);
|
||||||
|
Status = gBS->StartImage (ImageHandle, &ExitDataSize, &ExitData);
|
||||||
|
if (ExitData != NULL) {
|
||||||
|
FreePool (ExitData);
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Clear the Watchdog Timer after the image returns.
|
||||||
|
//
|
||||||
|
gBS->SetWatchdogTimer (0x0000, 0x0000, 0x0000, NULL);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (Handles != NULL) {
|
||||||
|
FreePool (Handles);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ImageCount == 0) {
|
||||||
|
return EFI_NOT_FOUND;
|
||||||
|
} else {
|
||||||
|
if (LoadCount == 0) {
|
||||||
|
return EFI_ACCESS_DENIED;
|
||||||
|
} else {
|
||||||
|
return EFI_SUCCESS;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@ -44,6 +44,7 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
|||||||
#include <Protocol/FormBrowser2.h>
|
#include <Protocol/FormBrowser2.h>
|
||||||
#include <Protocol/VariableLock.h>
|
#include <Protocol/VariableLock.h>
|
||||||
#include <Protocol/RamDisk.h>
|
#include <Protocol/RamDisk.h>
|
||||||
|
#include <Protocol/DeferredImageLoad.h>
|
||||||
|
|
||||||
#include <Guid/MemoryTypeInformation.h>
|
#include <Guid/MemoryTypeInformation.h>
|
||||||
#include <Guid/FileInfo.h>
|
#include <Guid/FileInfo.h>
|
||||||
|
@ -109,6 +109,7 @@
|
|||||||
gEfiDriverHealthProtocolGuid ## SOMETIMES_CONSUMES
|
gEfiDriverHealthProtocolGuid ## SOMETIMES_CONSUMES
|
||||||
gEfiFormBrowser2ProtocolGuid ## SOMETIMES_CONSUMES
|
gEfiFormBrowser2ProtocolGuid ## SOMETIMES_CONSUMES
|
||||||
gEfiRamDiskProtocolGuid ## SOMETIMES_CONSUMES
|
gEfiRamDiskProtocolGuid ## SOMETIMES_CONSUMES
|
||||||
|
gEfiDeferredImageLoadProtocolGuid ## CONSUMES
|
||||||
|
|
||||||
[Pcd]
|
[Pcd]
|
||||||
gEfiMdeModulePkgTokenSpaceGuid.PcdResetOnMemoryTypeInformationChange ## SOMETIMES_CONSUMES
|
gEfiMdeModulePkgTokenSpaceGuid.PcdResetOnMemoryTypeInformationChange ## SOMETIMES_CONSUMES
|
||||||
|
Reference in New Issue
Block a user