mirror of https://github.com/acidanthera/audk.git
ArmPkg/PlatformBootManagerLib: load platform boot options
Make platform driver to create predefined boot options and related hot keys. Cc: Laszlo Ersek <lersek@redhat.com> Cc: Leif Lindholm <leif.lindholm@linaro.org> Cc: Ard Biesheuvel <ard.biesheuvel@linaro.org> Contributed-under: TianoCore Contribution Agreement 1.1 Signed-off-by: Haojian Zhuang <haojian.zhuang@linaro.org> Reviewed-by: Laszlo Ersek <lersek@redhat.com> Reviewed-by: Leif Lindholm <leif.lindholm@linaro.org>
This commit is contained in:
parent
7e074d15e7
commit
1b6e7633ca
|
@ -30,6 +30,7 @@
|
||||||
#include <Protocol/LoadedImage.h>
|
#include <Protocol/LoadedImage.h>
|
||||||
#include <Protocol/PciIo.h>
|
#include <Protocol/PciIo.h>
|
||||||
#include <Protocol/PciRootBridgeIo.h>
|
#include <Protocol/PciRootBridgeIo.h>
|
||||||
|
#include <Protocol/PlatformBootManager.h>
|
||||||
#include <Guid/EventGroup.h>
|
#include <Guid/EventGroup.h>
|
||||||
#include <Guid/TtyTerm.h>
|
#include <Guid/TtyTerm.h>
|
||||||
|
|
||||||
|
@ -390,6 +391,106 @@ PlatformRegisterFvBootOption (
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
STATIC
|
||||||
|
VOID
|
||||||
|
GetPlatformOptions (
|
||||||
|
VOID
|
||||||
|
)
|
||||||
|
{
|
||||||
|
EFI_STATUS Status;
|
||||||
|
EFI_BOOT_MANAGER_LOAD_OPTION *CurrentBootOptions;
|
||||||
|
EFI_BOOT_MANAGER_LOAD_OPTION *BootOptions;
|
||||||
|
EFI_INPUT_KEY *BootKeys;
|
||||||
|
PLATFORM_BOOT_MANAGER_PROTOCOL *PlatformBootManager;
|
||||||
|
UINTN CurrentBootOptionCount;
|
||||||
|
UINTN Index;
|
||||||
|
UINTN BootCount;
|
||||||
|
|
||||||
|
Status = gBS->LocateProtocol (&gPlatformBootManagerProtocolGuid, NULL,
|
||||||
|
(VOID **)&PlatformBootManager);
|
||||||
|
if (EFI_ERROR (Status)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
Status = PlatformBootManager->GetPlatformBootOptionsAndKeys (
|
||||||
|
&BootCount,
|
||||||
|
&BootOptions,
|
||||||
|
&BootKeys
|
||||||
|
);
|
||||||
|
if (EFI_ERROR (Status)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
//
|
||||||
|
// Fetch the existent boot options. If there are none, CurrentBootCount
|
||||||
|
// will be zeroed.
|
||||||
|
//
|
||||||
|
CurrentBootOptions = EfiBootManagerGetLoadOptions (
|
||||||
|
&CurrentBootOptionCount,
|
||||||
|
LoadOptionTypeBoot
|
||||||
|
);
|
||||||
|
//
|
||||||
|
// Process the platform boot options.
|
||||||
|
//
|
||||||
|
for (Index = 0; Index < BootCount; Index++) {
|
||||||
|
INTN Match;
|
||||||
|
UINTN BootOptionNumber;
|
||||||
|
|
||||||
|
//
|
||||||
|
// If there are any preexistent boot options, and the subject platform boot
|
||||||
|
// option is already among them, then don't try to add it. Just get its
|
||||||
|
// assigned boot option number so we can associate a hotkey with it. Note
|
||||||
|
// that EfiBootManagerFindLoadOption() deals fine with (CurrentBootOptions
|
||||||
|
// == NULL) if (CurrentBootCount == 0).
|
||||||
|
//
|
||||||
|
Match = EfiBootManagerFindLoadOption (
|
||||||
|
&BootOptions[Index],
|
||||||
|
CurrentBootOptions,
|
||||||
|
CurrentBootOptionCount
|
||||||
|
);
|
||||||
|
if (Match >= 0) {
|
||||||
|
BootOptionNumber = CurrentBootOptions[Match].OptionNumber;
|
||||||
|
} else {
|
||||||
|
//
|
||||||
|
// Add the platform boot options as a new one, at the end of the boot
|
||||||
|
// order. Note that if the platform provided this boot option with an
|
||||||
|
// unassigned option number, then the below function call will assign a
|
||||||
|
// number.
|
||||||
|
//
|
||||||
|
Status = EfiBootManagerAddLoadOptionVariable (
|
||||||
|
&BootOptions[Index],
|
||||||
|
MAX_UINTN
|
||||||
|
);
|
||||||
|
if (EFI_ERROR (Status)) {
|
||||||
|
DEBUG ((DEBUG_ERROR, "%a: failed to register \"%s\": %r\n",
|
||||||
|
__FUNCTION__, BootOptions[Index].Description, Status));
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
BootOptionNumber = BootOptions[Index].OptionNumber;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Register a hotkey with the boot option, if requested.
|
||||||
|
//
|
||||||
|
if (BootKeys[Index].UnicodeChar == L'\0') {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
Status = EfiBootManagerAddKeyOptionVariable (
|
||||||
|
NULL,
|
||||||
|
BootOptionNumber,
|
||||||
|
0,
|
||||||
|
BootKeys[Index],
|
||||||
|
NULL
|
||||||
|
);
|
||||||
|
if (EFI_ERROR (Status)) {
|
||||||
|
DEBUG ((DEBUG_ERROR, "%a: failed to register hotkey for \"%s\": %r\n",
|
||||||
|
__FUNCTION__, BootOptions[Index].Description, Status));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
EfiBootManagerFreeLoadOptions (CurrentBootOptions, CurrentBootOptionCount);
|
||||||
|
EfiBootManagerFreeLoadOptions (BootOptions, BootCount);
|
||||||
|
FreePool (BootKeys);
|
||||||
|
}
|
||||||
|
|
||||||
STATIC
|
STATIC
|
||||||
VOID
|
VOID
|
||||||
PlatformRegisterOptionsAndKeys (
|
PlatformRegisterOptionsAndKeys (
|
||||||
|
@ -402,6 +503,8 @@ PlatformRegisterOptionsAndKeys (
|
||||||
EFI_INPUT_KEY Esc;
|
EFI_INPUT_KEY Esc;
|
||||||
EFI_BOOT_MANAGER_LOAD_OPTION BootOption;
|
EFI_BOOT_MANAGER_LOAD_OPTION BootOption;
|
||||||
|
|
||||||
|
GetPlatformOptions ();
|
||||||
|
|
||||||
//
|
//
|
||||||
// Register ENTER as CONTINUE key
|
// Register ENTER as CONTINUE key
|
||||||
//
|
//
|
||||||
|
|
|
@ -35,6 +35,7 @@
|
||||||
PlatformBm.c
|
PlatformBm.c
|
||||||
|
|
||||||
[Packages]
|
[Packages]
|
||||||
|
EmbeddedPkg/EmbeddedPkg.dec
|
||||||
MdeModulePkg/MdeModulePkg.dec
|
MdeModulePkg/MdeModulePkg.dec
|
||||||
MdePkg/MdePkg.dec
|
MdePkg/MdePkg.dec
|
||||||
ShellPkg/ShellPkg.dec
|
ShellPkg/ShellPkg.dec
|
||||||
|
@ -84,3 +85,4 @@
|
||||||
gEfiPciRootBridgeIoProtocolGuid
|
gEfiPciRootBridgeIoProtocolGuid
|
||||||
gEfiSimpleFileSystemProtocolGuid
|
gEfiSimpleFileSystemProtocolGuid
|
||||||
gEsrtManagementProtocolGuid
|
gEsrtManagementProtocolGuid
|
||||||
|
gPlatformBootManagerProtocolGuid
|
||||||
|
|
Loading…
Reference in New Issue