From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by mx.groups.io with SMTP id smtpd.web12.4467.1634978616008642544 for ; Sat, 23 Oct 2021 01:43:36 -0700 Authentication-Results: mx.groups.io; dkim=pass header.i=@kernel.org header.s=k20201202 header.b=XdAragBg; spf=pass (domain: kernel.org, ip: 198.145.29.99, mailfrom: ardb@kernel.org) Received: by mail.kernel.org (Postfix) with ESMTPSA id 136636108B for ; Sat, 23 Oct 2021 08:43:35 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1634978615; bh=pLjmSiOyzGu7kHIMcPu2Vb4dCs2X8vTMJjrDBe9VccA=; h=References:In-Reply-To:From:Date:Subject:To:Cc:From; b=XdAragBgpNAARWpjGFfmRK/awjmr4uRWFUkQfBNil0LEf08wXE7d94KdIIb9cQoOD xA1bA1b0AngCQX4b8/skSmMU88cxAOO0hiiGKujiyOXFNGUAv3V7Y+oxLAy9bEmB2/ K1IcGnTTGp7p13DDqJFrCKxsVbyW9UXCmv+agTrS6jFF4hzS36h22P6qO+ZmNLTAJv 1yEceQ52v3tiBj8mWtz3y9fu2jex1H3qwSS9TIyXWxkIID2hWJ+J+xVmeFMoA223ui 7c35E/NigEoTl6iCFKnFJBiDBhX7EHB8Ep6Iu1zaMiRCHixsnFi2FWwEUC7i2k9V6F MX+77w47BRSWw== Received: by mail-oi1-f179.google.com with SMTP id o4so8092673oia.10 for ; Sat, 23 Oct 2021 01:43:35 -0700 (PDT) X-Gm-Message-State: AOAM531aZXYwrD+jEvjOxzkm859ySkT4oy2rb83AGF5qdy9J+WnYHOOf r+cyqcngN+BVH20BZRWj2kydH2ygKwskJ8XGzLk= X-Google-Smtp-Source: ABdhPJyYoqmQXadFa4ZXfeYfUmg7q/2JHHMvJgQB1TDnSLGnMBkdBIkJnX4/t9e4z1ZHwSKxlZhQpACd+jZ/XMwbB24= X-Received: by 2002:aca:4bc4:: with SMTP id y187mr3461591oia.174.1634978614279; Sat, 23 Oct 2021 01:43:34 -0700 (PDT) MIME-Version: 1.0 References: <20211023073241.23211-1-nhi@os.amperecomputing.com> In-Reply-To: <20211023073241.23211-1-nhi@os.amperecomputing.com> From: "Ard Biesheuvel" Date: Sat, 23 Oct 2021 10:43:22 +0200 X-Gmail-Original-Message-ID: Message-ID: Subject: Re: [PATCH v3 1/1] ArmPkg: Implement PlatformBootManagerLib for LinuxBoot To: Nhi Pham Cc: edk2-devel-groups-io , patches@amperecomputing.com, Samer El-Haj-Mahmoud , moritzf@google.com, Leif Lindholm , Ard Biesheuvel Content-Type: text/plain; charset="UTF-8" On Sat, 23 Oct 2021 at 09:34, Nhi Pham wrote: > > LinuxBoot is a firmware that replaces specific firmware functionality > like the UEFI DXE phase with a Linux kernel and runtime. It is built-in > UEFI image like an application, which is executed at the end of DXE > phase. > > To achieve the LinuxBoot boot flow "SEC->PEI->DXE->BDS->LinuxBoot", > today we use the common well-known GUID of UEFI Shell for LinuxBoot > payload, so LinuxBoot developers can effortlessly find the UEFI Shell > Application and replace it with the LinuxBoot payload without > recompiling platform EDK2 (There might be an issue with a few systems > that don't have a UEFI Shell). Also, we have a hard requirement to force > the BDS to boot into the LinuxBoot as it is essentially required that > only the LinuxBoot boot option is permissible and UEFI is an > intermediate bootstrap phase. Considering all the above, it is > reasonable to just have a new GUID for LinuxBoot and require a LinuxBoot > specific BDS implementation. In addition, with making the BDS > implementation simpler, we can reduce many DXE drivers which we think it > is not necessary for LinuxBoot booting. > > This patch adds a new PlatformBootManagerLib implementation which > registers only the gArmTokenSpaceGuid.PcdLinuxBootFileGuid for LinuxBoot > payload as an active boot option. It allows BDS to jump to the LinuxBoot > quickly by skipping the UiApp and UEFI Shell. > > The PlatformBootManagerLib library derived from > ArmPkg/Library/PlatformBootManagerLib. > > Cc: Leif Lindholm > Cc: Ard Biesheuvel > > Signed-off-by: Nhi Pham > Acked-by: Ard Biesheuvel > Acked-by: Samer El-Haj-Mahmoud > Acked-by: Moritz Fischer Merged as #2114 Thanks, > --- > Changes from v2: > * Added description for PlatformRegisterFvBootOption function to > resolve the CI failure. > > ArmPkg/ArmPkg.dec | 8 + > ArmPkg/ArmPkg.dsc | 2 + > ArmPkg/Library/LinuxBootBootManagerLib/LinuxBootBootManagerLib.inf | 58 ++++++ > ArmPkg/Library/LinuxBootBootManagerLib/LinuxBootBm.c | 186 ++++++++++++++++++++ > 4 files changed, 254 insertions(+) > > diff --git a/ArmPkg/ArmPkg.dec b/ArmPkg/ArmPkg.dec > index 5935663fa9a3..9da1bbc9f216 100644 > --- a/ArmPkg/ArmPkg.dec > +++ b/ArmPkg/ArmPkg.dec > @@ -3,6 +3,7 @@ > # > # Copyright (c) 2009 - 2010, Apple Inc. All rights reserved.
> # Copyright (c) 2011 - 2021, ARM Limited. All rights reserved. > +# Copyright (c) 2021, Ampere Computing LLC. All rights reserved. > # > # SPDX-License-Identifier: BSD-2-Clause-Patent > # > @@ -379,3 +380,10 @@ [PcdsFixedAtBuild.common, PcdsDynamic.common] > # > gArmTokenSpaceGuid.PcdPciBusMin|0x0|UINT32|0x00000059 > gArmTokenSpaceGuid.PcdPciBusMax|0x0|UINT32|0x0000005A > + > +[PcdsDynamicEx] > + # > + # This dynamic PCD hold the GUID of a firmware FFS which contains > + # the LinuxBoot payload. > + # > + gArmTokenSpaceGuid.PcdLinuxBootFileGuid|{0x0}|VOID*|0x0000005C > diff --git a/ArmPkg/ArmPkg.dsc b/ArmPkg/ArmPkg.dsc > index 8abe3713c829..59fd8f295d4f 100644 > --- a/ArmPkg/ArmPkg.dsc > +++ b/ArmPkg/ArmPkg.dsc > @@ -5,6 +5,7 @@ > # Copyright (c) 2011 - 2021, Arm Limited. All rights reserved.
> # Copyright (c) 2016, Linaro Ltd. All rights reserved.
> # Copyright (c) Microsoft Corporation.
> +# Copyright (c) 2021, Ampere Computing LLC. All rights reserved. > # > # SPDX-License-Identifier: BSD-2-Clause-Patent > # > @@ -150,6 +151,7 @@ [Components.common] > ArmPkg/Library/ArmSmcPsciResetSystemLib/ArmSmcPsciResetSystemLib.inf > ArmPkg/Library/PeiServicesTablePointerLib/PeiServicesTablePointerLib.inf > ArmPkg/Library/PlatformBootManagerLib/PlatformBootManagerLib.inf > + ArmPkg/Library/LinuxBootBootManagerLib/LinuxBootBootManagerLib.inf > > ArmPkg/Drivers/ArmCrashDumpDxe/ArmCrashDumpDxe.inf > ArmPkg/Drivers/ArmScmiDxe/ArmScmiDxe.inf > diff --git a/ArmPkg/Library/LinuxBootBootManagerLib/LinuxBootBootManagerLib.inf b/ArmPkg/Library/LinuxBootBootManagerLib/LinuxBootBootManagerLib.inf > new file mode 100644 > index 000000000000..139b6171990a > --- /dev/null > +++ b/ArmPkg/Library/LinuxBootBootManagerLib/LinuxBootBootManagerLib.inf > @@ -0,0 +1,58 @@ > +## @file > +# Implementation for PlatformBootManagerLib library class interfaces. > +# > +# Copyright (C) 2015-2016, Red Hat, Inc. > +# Copyright (c) 2014, ARM Ltd. All rights reserved.
> +# Copyright (c) 2007 - 2014, Intel Corporation. All rights reserved.
> +# Copyright (c) 2016, Linaro Ltd. All rights reserved.
> +# Copyright (c) 2020 - 2021, Ampere Computing LLC. All rights reserved.
> +# > +# SPDX-License-Identifier: BSD-2-Clause-Patent > +# > +## > + > +[Defines] > + INF_VERSION = 0x0001001B > + BASE_NAME = LinuxBootBootManagerLib > + FILE_GUID = 1FA91547-DB23-4F6A-8AF8-3B9782A7F917 > + MODULE_TYPE = DXE_DRIVER > + VERSION_STRING = 1.0 > + LIBRARY_CLASS = PlatformBootManagerLib|DXE_DRIVER > + > +# > +# The following information is for reference only and not required by the build tools. > +# > +# VALID_ARCHITECTURES = ARM AARCH64 > +# > + > +[Sources] > + LinuxBootBm.c > + > +[Packages] > + ArmPkg/ArmPkg.dec > + MdeModulePkg/MdeModulePkg.dec > + MdePkg/MdePkg.dec > + ShellPkg/ShellPkg.dec > + > +[LibraryClasses] > + BaseLib > + BaseMemoryLib > + DebugLib > + MemoryAllocationLib > + PcdLib > + PrintLib > + UefiBootManagerLib > + UefiBootServicesTableLib > + UefiLib > + UefiRuntimeServicesTableLib > + > +[Pcd] > + gArmTokenSpaceGuid.PcdLinuxBootFileGuid > + > +[Guids] > + gEfiEndOfDxeEventGroupGuid > + gUefiShellFileGuid > + gZeroGuid > + > +[Protocols] > + gEfiLoadedImageProtocolGuid > diff --git a/ArmPkg/Library/LinuxBootBootManagerLib/LinuxBootBm.c b/ArmPkg/Library/LinuxBootBootManagerLib/LinuxBootBm.c > new file mode 100644 > index 000000000000..3295c5a070bc > --- /dev/null > +++ b/ArmPkg/Library/LinuxBootBootManagerLib/LinuxBootBm.c > @@ -0,0 +1,186 @@ > +/** @file > + Implementation for PlatformBootManagerLib library class interfaces. > + > + Copyright (C) 2015-2016, Red Hat, Inc. > + Copyright (c) 2014 - 2019, ARM Ltd. All rights reserved.
> + Copyright (c) 2004 - 2018, Intel Corporation. All rights reserved.
> + Copyright (c) 2016, Linaro Ltd. All rights reserved.
> + Copyright (c) 2020 - 2021, Ampere Computing LLC. All rights reserved.
> + > + SPDX-License-Identifier: BSD-2-Clause-Patent > + > +**/ > + > +#include > + > +#include > +#include > +#include > +#include > +#include > +#include > +#include > +#include > +#include > +#include > +#include > +#include > +#include > + > +/** > + Register a boot option using a file GUID in the FV. > + > + @param FileGuid The file GUID name in the FV. > + @param Description The description of the boot option. > + @param Attributes The attributes of the boot option. > + > +**/ > +STATIC > +VOID > +PlatformRegisterFvBootOption ( > + CONST EFI_GUID *FileGuid, > + CHAR16 *Description, > + UINT32 Attributes > + ) > +{ > + EFI_STATUS Status; > + INTN OptionIndex; > + EFI_BOOT_MANAGER_LOAD_OPTION NewOption; > + EFI_BOOT_MANAGER_LOAD_OPTION *BootOptions; > + UINTN BootOptionCount; > + 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); > + > + 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, > + Attributes, > + Description, > + DevicePath, > + NULL, > + 0 > + ); > + ASSERT_EFI_ERROR (Status); > + FreePool (DevicePath); > + > + BootOptions = EfiBootManagerGetLoadOptions ( > + &BootOptionCount, > + LoadOptionTypeBoot > + ); > + > + OptionIndex = EfiBootManagerFindLoadOption ( > + &NewOption, > + BootOptions, > + BootOptionCount > + ); > + > + if (OptionIndex == -1) { > + Status = EfiBootManagerAddLoadOptionVariable (&NewOption, MAX_UINTN); > + ASSERT_EFI_ERROR (Status); > + } > + EfiBootManagerFreeLoadOption (&NewOption); > + EfiBootManagerFreeLoadOptions (BootOptions, BootOptionCount); > +} > + > +/** > + Do the platform specific action before the console is connected. > + > + Such as: > + Update console variable; > + Register new Driver#### or Boot####; > + Signal ReadyToLock event. > +**/ > +VOID > +EFIAPI > +PlatformBootManagerBeforeConsole ( > + VOID > + ) > +{ > + // > + // Signal EndOfDxe PI Event > + // > + EfiEventGroupSignal (&gEfiEndOfDxeEventGroupGuid); > +} > + > +/** > + Do the platform specific action after the console is connected. > + > + Such as: > + Dynamically switch output mode; > + Signal console ready platform customized event; > + Run diagnostics like memory testing; > + Connect certain devices; > + Dispatch additional option roms. > +**/ > +VOID > +EFIAPI > +PlatformBootManagerAfterConsole ( > + VOID > + ) > +{ > + EFI_GUID LinuxBootFileGuid; > + > + CopyGuid (&LinuxBootFileGuid, PcdGetPtr (PcdLinuxBootFileGuid)); > + > + if (!CompareGuid (&LinuxBootFileGuid, &gZeroGuid)) { > + // > + // Register LinuxBoot > + // > + PlatformRegisterFvBootOption ( > + &LinuxBootFileGuid, > + L"LinuxBoot", > + LOAD_OPTION_ACTIVE > + ); > + } else { > + DEBUG ((DEBUG_ERROR, "%a: PcdLinuxBootFileGuid was not set!\n", __FUNCTION__)); > + } > +} > + > +/** > + This function is called each second during the boot manager waits the > + timeout. > + > + @param TimeoutRemain The remaining timeout. > +**/ > +VOID > +EFIAPI > +PlatformBootManagerWaitCallback ( > + UINT16 TimeoutRemain > + ) > +{ > + return; > +} > + > +/** > + The function is called when no boot option could be launched, > + including platform recovery options and options pointing to applications > + built into firmware volumes. > + > + If this function returns, BDS attempts to enter an infinite loop. > +**/ > +VOID > +EFIAPI > +PlatformBootManagerUnableToBoot ( > + VOID > + ) > +{ > + return; > +} > -- > 2.17.1 >