mirror of https://github.com/acidanthera/audk.git
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:
parent
8be37a5cee
commit
b33af22145
|
@ -777,4 +777,17 @@ EfiBootManagerIsValidLoadOptionVariableName (
|
|||
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
|
||||
|
|
|
@ -417,3 +417,116 @@ BmCharToUint (
|
|||
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/VariableLock.h>
|
||||
#include <Protocol/RamDisk.h>
|
||||
#include <Protocol/DeferredImageLoad.h>
|
||||
|
||||
#include <Guid/MemoryTypeInformation.h>
|
||||
#include <Guid/FileInfo.h>
|
||||
|
|
|
@ -109,6 +109,7 @@
|
|||
gEfiDriverHealthProtocolGuid ## SOMETIMES_CONSUMES
|
||||
gEfiFormBrowser2ProtocolGuid ## SOMETIMES_CONSUMES
|
||||
gEfiRamDiskProtocolGuid ## SOMETIMES_CONSUMES
|
||||
gEfiDeferredImageLoadProtocolGuid ## CONSUMES
|
||||
|
||||
[Pcd]
|
||||
gEfiMdeModulePkgTokenSpaceGuid.PcdResetOnMemoryTypeInformationChange ## SOMETIMES_CONSUMES
|
||||
|
|
Loading…
Reference in New Issue