diff --git a/ArmPkg/ArmPkg.dec b/ArmPkg/ArmPkg.dec index f17ba913e6..2444457ae5 100644 --- a/ArmPkg/ArmPkg.dec +++ b/ArmPkg/ArmPkg.dec @@ -2,7 +2,7 @@ # ARM processor package. # # Copyright (c) 2009 - 2010, Apple Inc. All rights reserved.
-# Copyright (c) 2011 - 2022, ARM Limited. All rights reserved. +# Copyright (c) 2011 - 2023, ARM Limited. All rights reserved. # Copyright (c) 2021, Ampere Computing LLC. All rights reserved. # # SPDX-License-Identifier: BSD-2-Clause-Patent @@ -221,6 +221,13 @@ # gArmTokenSpaceGuid.PcdArmDmaDeviceOffset|0x0|UINT64|0x0000044 + # + # Boot the Uefi Shell instead of UiApp when no valid boot option is found. + # This is useful in CI environment so that startup.nsh can be launched. + # The default value is FALSE. + # + gArmTokenSpaceGuid.PcdUefiShellDefaultBootEnable|FALSE|BOOLEAN|0x0000052 + [PcdsFixedAtBuild.common, PcdsPatchableInModule.common] gArmTokenSpaceGuid.PcdFdBaseAddress|0|UINT64|0x0000002B gArmTokenSpaceGuid.PcdFvBaseAddress|0|UINT64|0x0000002D diff --git a/ArmPkg/Library/PlatformBootManagerLib/PlatformBm.c b/ArmPkg/Library/PlatformBootManagerLib/PlatformBm.c index 08998ffe4d..ea093bb725 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.
+ Copyright (c) 2014 - 2023, Arm Ltd. All rights reserved.
Copyright (c) 2004 - 2018, Intel Corporation. All rights reserved.
Copyright (c) 2016, Linaro Ltd. All rights reserved.
Copyright (c) 2021, Semihalf All rights reserved.
@@ -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 ( @@ -1075,6 +1133,18 @@ PlatformBootManagerUnableToBoot ( EfiBootManagerConnectAll (); 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 // diff --git a/ArmPkg/Library/PlatformBootManagerLib/PlatformBootManagerLib.inf b/ArmPkg/Library/PlatformBootManagerLib/PlatformBootManagerLib.inf index 86751b45f8..05ed46456c 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.
+# Copyright (c) 2014 - 2023, Arm Ltd. All rights reserved.
# Copyright (c) 2007 - 2014, Intel Corporation. All rights reserved.
# Copyright (c) 2016, Linaro Ltd. All rights reserved.
# @@ -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