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.web11.5815.1632311333987734479 for ; Wed, 22 Sep 2021 04:48:54 -0700 Authentication-Results: mx.groups.io; dkim=pass header.i=@kernel.org header.s=k20201202 header.b=Kjn0JZq0; spf=pass (domain: kernel.org, ip: 198.145.29.99, mailfrom: ardb@kernel.org) Received: by mail.kernel.org (Postfix) with ESMTPSA id 79293611C0 for ; Wed, 22 Sep 2021 11:48:53 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1632311333; bh=vhIAARIMVzNf9rWGAVGFejpAu255esyldZY9habe93I=; h=References:In-Reply-To:From:Date:Subject:To:Cc:From; b=Kjn0JZq0oeNHCYEzd0XuPnRoANcpBmtzSN59SfCEUewMnWUGn2yu9Ccv8jkDFL+mp J04W4hsaBnRWr+mFRd58b4VjQLBVY8+dqsirD9KByAkNaaBXKnPWjBLzgRpCVeR/x7 ZJgy+KqLUhkpfEFJDJogvbEkEM8T3YOY5DDw6dN6hlvXkaCgQXltBd/fN+OBvSWup+ NTS5bLdmVOJdJiYDNXa9+/zO9f5Wb9tXW43l76NswlnqwtZRrI59jTo8G0zLbSLLDy uy/vhplo7PC5oRCgdL1P/BYYBkZ4SMWAPBCI1hmEGKp506qkH0Sti5tL6JBq5QkSs3 cjxMiIcNQnQaw== Received: by mail-oi1-f182.google.com with SMTP id a3so3993492oid.6 for ; Wed, 22 Sep 2021 04:48:53 -0700 (PDT) X-Gm-Message-State: AOAM530vYoixM2AlkF7mvSXJcCHdK7rvNFPUjvPrsBtSj+8sv8TfhP3b zWZ/GBIUTL1ebua6x8bW8lIg4DJVksr8RTuvjHg= X-Google-Smtp-Source: ABdhPJz/yShglhmERw9uevekQtMUOz9MBzuZfk50WQvkTv+PwBxvRWQFjmuwbQTjrC1kjRjXmwPtkzVmW9c8P8ZLWyA= X-Received: by 2002:aca:3114:: with SMTP id x20mr7707840oix.174.1632311332784; Wed, 22 Sep 2021 04:48:52 -0700 (PDT) MIME-Version: 1.0 References: <20210907033857.18848-1-nhi@os.amperecomputing.com> In-Reply-To: <20210907033857.18848-1-nhi@os.amperecomputing.com> From: "Ard Biesheuvel" Date: Wed, 22 Sep 2021 13:48:40 +0200 X-Gmail-Original-Message-ID: Message-ID: Subject: Re: [PATCH v2 1/1] ArmPkg: Implement PlatformBootManagerLib for LinuxBoot To: Nhi Pham Cc: edk2-devel-groups-io , patches@amperecomputing.com, Leif Lindholm , Ard Biesheuvel Content-Type: text/plain; charset="UTF-8" On Tue, 7 Sept 2021 at 05:40, 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 > --- > ArmPkg/ArmPkg.dec | 8 + > ArmPkg/ArmPkg.dsc | 2 + > ArmPkg/Library/LinuxBootBootManagerLib/LinuxBootBootManagerLib.inf | 58 +++++++ > ArmPkg/Library/LinuxBootBootManagerLib/LinuxBootBm.c | 178 ++++++++++++++++++++ > 4 files changed, 246 insertions(+) > > diff --git a/ArmPkg/ArmPkg.dec b/ArmPkg/ArmPkg.dec > index 214b2f589217..f68e6ee00860 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 > # > @@ -382,3 +383,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 926986cf7fbb..ffb1c261861e 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..f4941780efcd > --- /dev/null > +++ b/ArmPkg/Library/LinuxBootBootManagerLib/LinuxBootBm.c > @@ -0,0 +1,178 @@ > +/** @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 > + > +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 >