OcBootManagementLib: Provide boot picker interface

This commit is contained in:
vit9696 2019-04-04 18:01:23 +03:00
parent d2bb69ecc6
commit 20f97bf2a2
2 changed files with 106 additions and 0 deletions

View File

@ -232,4 +232,22 @@ OcLoadBootEntry (
OUT EFI_HANDLE *EntryHandle
);
/**
Install missing boot policy, scan, and show simple boot menu.
@param[in] LookupPolicy Lookup policy.
@param[in] BootPolicy Boot policy.
@param[in] TimeOutSeconds Default entry selection timeout (pass 0 to ignore).
@param[in] StartImage Image starting routine used.
@retval does not return unless a fatal error happened.
**/
EFI_STATUS
OcRunSimpleBootMenu (
IN UINT32 LookupPolicy,
IN UINT32 BootPolicy,
IN UINT32 TimeoutSeconds,
IN EFI_IMAGE_START StartImage
);
#endif // OC_BOOT_MANAGEMENT_LIB_H

View File

@ -30,6 +30,7 @@
#include <Library/OcXmlLib.h>
#include <Library/BaseLib.h>
#include <Library/BaseMemoryLib.h>
#include <Library/DebugLib.h>
#include <Library/DevicePathLib.h>
#include <Library/MemoryAllocationLib.h>
#include <Library/PrintLib.h>
@ -567,3 +568,90 @@ OcLoadBootEntry (
//
return gBS->LoadImage (FALSE, ParentHandle, BootEntry->DevicePath, NULL, 0, EntryHandle);
}
EFI_STATUS
OcRunSimpleBootMenu (
IN UINT32 LookupPolicy,
IN UINT32 BootPolicy,
IN UINT32 TimeoutSeconds,
IN EFI_IMAGE_START StartImage
)
{
EFI_STATUS Status;
APPLE_BOOT_POLICY_PROTOCOL *AppleBootPolicy;
OC_BOOT_ENTRY *Chosen;
OC_BOOT_ENTRY *Entries;
UINTN EntryCount;
EFI_HANDLE BooterHandle;
Status = OcAppleBootPolicyInstallProtocol (gImageHandle, gST);
if (EFI_ERROR (Status)) {
DEBUG ((DEBUG_INFO, "AppleBootPolicy install failure - %r\n", Status));
}
Status = gBS->LocateProtocol (
&gAppleBootPolicyProtocolGuid,
NULL,
(VOID **) &AppleBootPolicy
);
if (EFI_ERROR (Status)) {
DEBUG ((DEBUG_ERROR, "AppleBootPolicy locate failure - %r\n", Status));
return Status;
}
while (TRUE) {
Status = OcScanForBootEntries (
AppleBootPolicy,
LookupPolicy,
&Entries,
&EntryCount,
NULL,
TRUE
);
if (EFI_ERROR (Status)) {
DEBUG ((DEBUG_ERROR, "OcScanForBootEntries failure - %r\n", Status));
return Status;
}
//
// TODO: obtain default entry!
//
Status = OcShowSimpleBootMenu (
Entries,
EntryCount,
0,
TimeoutSeconds,
&Chosen
);
if (EFI_ERROR (Status) && Status != EFI_ABORTED) {
DEBUG ((DEBUG_ERROR, "OcShowSimpleBootMenu failed - %r\n", Status));
OcFreeBootEntries (Entries, EntryCount);
return Status;
}
TimeoutSeconds = 0;
if (!EFI_ERROR (Status)) {
DEBUG ((DEBUG_INFO, "Should boot from %s\n", Chosen->Name));
}
if (!EFI_ERROR (Status)) {
Status = OcLoadBootEntry (Chosen, BootPolicy, gImageHandle, &BooterHandle);
if (!EFI_ERROR (Status)) {
Status = StartImage (BooterHandle, NULL, NULL);
if (EFI_ERROR (Status)) {
DEBUG ((DEBUG_ERROR, "StartImage failed - %r\n", Status));
}
} else {
DEBUG ((DEBUG_ERROR, "LoadImage failed - %r\n", Status));
}
gBS->Stall (5000000);
}
OcFreeBootEntries (Entries, EntryCount);
}
}