From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from foss.arm.com (foss.arm.com [217.140.110.172]) by mx.groups.io with SMTP id smtpd.web11.79554.1675760824072261677 for ; Tue, 07 Feb 2023 01:07:04 -0800 Authentication-Results: mx.groups.io; dkim=missing; spf=pass (domain: arm.com, ip: 217.140.110.172, mailfrom: pierre.gondois@arm.com) Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.121.207.14]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id EC8481063; Tue, 7 Feb 2023 01:07:45 -0800 (PST) Received: from pierre123.arm.com (unknown [10.57.50.95]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPA id 1B76F3F71E; Tue, 7 Feb 2023 01:07:01 -0800 (PST) From: "PierreGondois" To: devel@edk2.groups.io Cc: ardb+tianocore@kernel.org, leif@nuviainc.com, sami.mujawar@arm.com, patrik.berglund@arm.com Subject: [PATCH 1/1] ArmPkg/PlatformBootManagerLib: Add path to boot UEFI Shell over UiApp Date: Tue, 7 Feb 2023 10:06:53 +0100 Message-Id: <20230207090653.395992-1-pierre.gondois@arm.com> X-Mailer: git-send-email 2.25.1 MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable From: Pierre Gondois 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 --- ArmPkg/ArmPkg.dec | 9 ++- .../PlatformBootManagerLib/PlatformBm.c | 69 ++++++++++++++++++- .../PlatformBootManagerLib.inf | 4 +- 3 files changed, 79 insertions(+), 3 deletions(-) diff --git a/ArmPkg/ArmPkg.dec b/ArmPkg/ArmPkg.dec index f17ba913e6de..2444457ae58a 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 @@ [PcdsFixedAtBuild.common] # gArmTokenSpaceGuid.PcdArmDmaDeviceOffset|0x0|UINT64|0x0000044 =20 + # + # Boot the Uefi Shell instead of UiApp when no valid boot option is fo= und. + # This is useful in CI environment so that startup.nsh can be launched= . + # The default value is FALSE. + # + gArmTokenSpaceGuid.PcdUefiShellDefaultBootEnable|FALSE|BOOLEAN|0x00000= 52 + [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 2fb1a4aa4fb8..9bdc44d86b54 100644 --- a/ArmPkg/Library/PlatformBootManagerLib/PlatformBm.c +++ b/ArmPkg/Library/PlatformBootManagerLib/PlatformBm.c @@ -2,7 +2,7 @@ Implementation for PlatformBootManagerLib library class interfaces. =20 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,61 @@ PlatformRegisterFvBootOption ( EfiBootManagerFreeLoadOptions (BootOptions, BootOptionCount); } =20 +/** 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 =3D gBS->HandleProtocol ( + gImageHandle, + &gEfiLoadedImageProtocolGuid, + (VOID **)&LoadedImage + ); + ASSERT_EFI_ERROR (Status); + + EfiInitializeFwVolDevicepathNode (&FileNode, FileGuid); + DevicePath =3D DevicePathFromHandle (LoadedImage->DeviceHandle); + ASSERT (DevicePath !=3D NULL); + DevicePath =3D AppendDevicePathNode ( + DevicePath, + (EFI_DEVICE_PATH_PROTOCOL *)&FileNode + ); + ASSERT (DevicePath !=3D NULL); + + Status =3D EfiBootManagerInitializeLoadOption ( + &NewOption, + LoadOptionNumberUnassigned, + LoadOptionTypeBoot, + LOAD_OPTION_ACTIVE, + Description, + DevicePath, + NULL, + 0 + ); + ASSERT_EFI_ERROR (Status); + FreePool (DevicePath); + + for ( ; ;) { + EfiBootManagerBoot (&NewOption); + } +} + STATIC VOID GetPlatformOptions ( @@ -1075,6 +1130,18 @@ PlatformBootManagerUnableToBoot ( EfiBootManagerConnectAll (); EfiBootManagerRefreshAllBootOption (); =20 + // + // 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 86751b45f82b..05ed46456cc4 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 @@ [Sources] PlatformBm.h =20 [Packages] + ArmPkg/ArmPkg.dec EmbeddedPkg/EmbeddedPkg.dec MdeModulePkg/MdeModulePkg.dec MdePkg/MdePkg.dec @@ -55,6 +56,7 @@ [FeaturePcd] gEfiMdePkgTokenSpaceGuid.PcdUgaConsumeSupport =20 [FixedPcd] + gArmTokenSpaceGuid.PcdUefiShellDefaultBootEnable gEfiMdeModulePkgTokenSpaceGuid.PcdEmuVariableNvModeEnable gEfiMdeModulePkgTokenSpaceGuid.PcdFirmwareVersionString gEfiMdePkgTokenSpaceGuid.PcdUartDefaultBaudRate --=20 2.25.1