summaryrefslogtreecommitdiff
path: root/ArmPkg/Library/PlatformBootManagerLib
diff options
context:
space:
mode:
authorPierre Gondois <pierre.gondois@arm.com>2023-04-25 13:27:16 +0200
committermergify[bot] <37929162+mergify[bot]@users.noreply.github.com>2023-05-04 14:26:58 +0000
commit5de2a54b2cfdb9cb3a1a564c85e99aa6b06b5dba (patch)
tree359f167ba0870fde57c459adcba9fbd6d6f6e084 /ArmPkg/Library/PlatformBootManagerLib
parentd6b42ed7ed1b0c4584097f0d76798cff74c96379 (diff)
downloadedk2-5de2a54b2cfdb9cb3a1a564c85e99aa6b06b5dba.zip
edk2-5de2a54b2cfdb9cb3a1a564c85e99aa6b06b5dba.tar.gz
edk2-5de2a54b2cfdb9cb3a1a564c85e99aa6b06b5dba.tar.bz2
ArmPkg/PlatformBootManagerLib: Add path to boot UEFI Shell over UiApp
The UEFI Shell is a non-active boot option, at the opposite of UiApp. If no valid boot option is found, UiApp is selected. UiApp requires a human interaction. When installing a new EDKII image in CIs or when scripting is required, this is problematic. If no valid boot option is discovered, add a path to directly go to the UEFI Shell where the startup.nsh script is automatically executed. The UEFI Shell is launched after connecting possible devices, but before the reset that is meant to automatically make them visible. The new PcdUefiShellDefaultBootEnable must be set to TRUE to enable this behaviour. The Pcd is set to false by default. Signed-off-by: Pierre Gondois <pierre.gondois@arm.com> Tested-by: Patrik Berglund <patrik.berglund@arm.com>
Diffstat (limited to 'ArmPkg/Library/PlatformBootManagerLib')
-rw-r--r--ArmPkg/Library/PlatformBootManagerLib/PlatformBm.c72
-rw-r--r--ArmPkg/Library/PlatformBootManagerLib/PlatformBootManagerLib.inf4
2 files changed, 74 insertions, 2 deletions
diff --git a/ArmPkg/Library/PlatformBootManagerLib/PlatformBm.c b/ArmPkg/Library/PlatformBootManagerLib/PlatformBm.c
index 08998ff..ea093bb 100644
--- a/ArmPkg/Library/PlatformBootManagerLib/PlatformBm.c
+++ b/ArmPkg/Library/PlatformBootManagerLib/PlatformBm.c
@@ -2,7 +2,7 @@
Implementation for PlatformBootManagerLib library class interfaces.
Copyright (C) 2015-2016, Red Hat, Inc.
- Copyright (c) 2014 - 2021, ARM Ltd. All rights reserved.<BR>
+ Copyright (c) 2014 - 2023, Arm Ltd. All rights reserved.<BR>
Copyright (c) 2004 - 2018, Intel Corporation. All rights reserved.<BR>
Copyright (c) 2016, Linaro Ltd. All rights reserved.<BR>
Copyright (c) 2021, Semihalf All rights reserved.<BR>
@@ -470,6 +470,64 @@ PlatformRegisterFvBootOption (
EfiBootManagerFreeLoadOptions (BootOptions, BootOptionCount);
}
+/** Boot a Fv Boot Option.
+
+ This function is useful for booting the UEFI Shell as it is loaded
+ as a non active boot option.
+
+ @param[in] FileGuid The File GUID.
+ @param[in] Description String describing the Boot Option.
+
+**/
+STATIC
+VOID
+PlatformBootFvBootOption (
+ IN CONST EFI_GUID *FileGuid,
+ IN CHAR16 *Description
+ )
+{
+ EFI_STATUS Status;
+ EFI_BOOT_MANAGER_LOAD_OPTION NewOption;
+ MEDIA_FW_VOL_FILEPATH_DEVICE_PATH FileNode;
+ EFI_LOADED_IMAGE_PROTOCOL *LoadedImage;
+ EFI_DEVICE_PATH_PROTOCOL *DevicePath;
+
+ Status = gBS->HandleProtocol (
+ gImageHandle,
+ &gEfiLoadedImageProtocolGuid,
+ (VOID **)&LoadedImage
+ );
+ ASSERT_EFI_ERROR (Status);
+
+ //
+ // The UEFI Shell was registered in PlatformRegisterFvBootOption ()
+ // previously, thus it must still be available in this FV.
+ //
+ EfiInitializeFwVolDevicepathNode (&FileNode, FileGuid);
+ DevicePath = DevicePathFromHandle (LoadedImage->DeviceHandle);
+ ASSERT (DevicePath != NULL);
+ DevicePath = AppendDevicePathNode (
+ DevicePath,
+ (EFI_DEVICE_PATH_PROTOCOL *)&FileNode
+ );
+ ASSERT (DevicePath != NULL);
+
+ Status = EfiBootManagerInitializeLoadOption (
+ &NewOption,
+ LoadOptionNumberUnassigned,
+ LoadOptionTypeBoot,
+ LOAD_OPTION_ACTIVE,
+ Description,
+ DevicePath,
+ NULL,
+ 0
+ );
+ ASSERT_EFI_ERROR (Status);
+ FreePool (DevicePath);
+
+ EfiBootManagerBoot (&NewOption);
+}
+
STATIC
VOID
GetPlatformOptions (
@@ -1076,6 +1134,18 @@ PlatformBootManagerUnableToBoot (
EfiBootManagerRefreshAllBootOption ();
//
+ // Boot the 'UEFI Shell'. If the Pcd is not set, the UEFI Shell is not
+ // an active boot option and must be manually selected through UiApp
+ // (at least during the fist boot).
+ //
+ if (FixedPcdGetBool (PcdUefiShellDefaultBootEnable)) {
+ PlatformBootFvBootOption (
+ &gUefiShellFileGuid,
+ L"UEFI Shell (default)"
+ );
+ }
+
+ //
// Record the updated number of boot configured boot options
//
BootOptions = EfiBootManagerGetLoadOptions (
diff --git a/ArmPkg/Library/PlatformBootManagerLib/PlatformBootManagerLib.inf b/ArmPkg/Library/PlatformBootManagerLib/PlatformBootManagerLib.inf
index 86751b4..05ed464 100644
--- a/ArmPkg/Library/PlatformBootManagerLib/PlatformBootManagerLib.inf
+++ b/ArmPkg/Library/PlatformBootManagerLib/PlatformBootManagerLib.inf
@@ -2,7 +2,7 @@
# Implementation for PlatformBootManagerLib library class interfaces.
#
# Copyright (C) 2015-2016, Red Hat, Inc.
-# Copyright (c) 2014, ARM Ltd. All rights reserved.<BR>
+# Copyright (c) 2014 - 2023, Arm Ltd. All rights reserved.<BR>
# Copyright (c) 2007 - 2014, Intel Corporation. All rights reserved.<BR>
# Copyright (c) 2016, Linaro Ltd. All rights reserved.<BR>
#
@@ -29,6 +29,7 @@
PlatformBm.h
[Packages]
+ ArmPkg/ArmPkg.dec
EmbeddedPkg/EmbeddedPkg.dec
MdeModulePkg/MdeModulePkg.dec
MdePkg/MdePkg.dec
@@ -55,6 +56,7 @@
gEfiMdePkgTokenSpaceGuid.PcdUgaConsumeSupport
[FixedPcd]
+ gArmTokenSpaceGuid.PcdUefiShellDefaultBootEnable
gEfiMdeModulePkgTokenSpaceGuid.PcdEmuVariableNvModeEnable
gEfiMdeModulePkgTokenSpaceGuid.PcdFirmwareVersionString
gEfiMdePkgTokenSpaceGuid.PcdUartDefaultBaudRate