* [PATCH v2 1/1] ArmPkg: Implement PlatformBootManagerLib for LinuxBoot @ 2021-09-07 3:38 Nhi Pham 2021-09-22 11:48 ` Ard Biesheuvel 0 siblings, 1 reply; 6+ messages in thread From: Nhi Pham @ 2021-09-07 3:38 UTC (permalink / raw) To: devel; +Cc: patches, Nhi Pham, Leif Lindholm, Ard Biesheuvel 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 <leif@nuviainc.com> Cc: Ard Biesheuvel <ardb+tianocore@kernel.org> Signed-off-by: Nhi Pham <nhi@os.amperecomputing.com> --- 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.<BR> # 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.<BR> # Copyright (c) 2016, Linaro Ltd. All rights reserved.<BR> # Copyright (c) Microsoft Corporation.<BR> +# 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.<BR> +# Copyright (c) 2007 - 2014, Intel Corporation. All rights reserved.<BR> +# Copyright (c) 2016, Linaro Ltd. All rights reserved.<BR> +# Copyright (c) 2020 - 2021, Ampere Computing LLC. All rights reserved.<BR> +# +# 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.<BR> + Copyright (c) 2004 - 2018, Intel Corporation. All rights reserved.<BR> + Copyright (c) 2016, Linaro Ltd. All rights reserved.<BR> + Copyright (c) 2020 - 2021, Ampere Computing LLC. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#include <Uefi.h> + +#include <Guid/EventGroup.h> +#include <Library/BaseLib.h> +#include <Library/BaseMemoryLib.h> +#include <Library/DebugLib.h> +#include <Library/DevicePathLib.h> +#include <Library/MemoryAllocationLib.h> +#include <Library/PcdLib.h> +#include <Library/UefiBootManagerLib.h> +#include <Library/UefiBootServicesTableLib.h> +#include <Library/UefiLib.h> +#include <Library/UefiRuntimeServicesTableLib.h> +#include <Protocol/LoadedImage.h> +#include <Protocol/PlatformBootManager.h> + +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 ^ permalink raw reply related [flat|nested] 6+ messages in thread
* Re: [PATCH v2 1/1] ArmPkg: Implement PlatformBootManagerLib for LinuxBoot 2021-09-07 3:38 [PATCH v2 1/1] ArmPkg: Implement PlatformBootManagerLib for LinuxBoot Nhi Pham @ 2021-09-22 11:48 ` Ard Biesheuvel 2021-10-13 18:43 ` [edk2-devel] " Samer El-Haj-Mahmoud 0 siblings, 1 reply; 6+ messages in thread From: Ard Biesheuvel @ 2021-09-22 11:48 UTC (permalink / raw) To: Nhi Pham; +Cc: edk2-devel-groups-io, patches, Leif Lindholm, Ard Biesheuvel On Tue, 7 Sept 2021 at 05:40, Nhi Pham <nhi@os.amperecomputing.com> 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 <leif@nuviainc.com> > Cc: Ard Biesheuvel <ardb+tianocore@kernel.org> > > Signed-off-by: Nhi Pham <nhi@os.amperecomputing.com> Acked-by: Ard Biesheuvel <ardb@kernel.org> > --- > 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.<BR> > # 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.<BR> > # Copyright (c) 2016, Linaro Ltd. All rights reserved.<BR> > # Copyright (c) Microsoft Corporation.<BR> > +# 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.<BR> > +# Copyright (c) 2007 - 2014, Intel Corporation. All rights reserved.<BR> > +# Copyright (c) 2016, Linaro Ltd. All rights reserved.<BR> > +# Copyright (c) 2020 - 2021, Ampere Computing LLC. All rights reserved.<BR> > +# > +# 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.<BR> > + Copyright (c) 2004 - 2018, Intel Corporation. All rights reserved.<BR> > + Copyright (c) 2016, Linaro Ltd. All rights reserved.<BR> > + Copyright (c) 2020 - 2021, Ampere Computing LLC. All rights reserved.<BR> > + > + SPDX-License-Identifier: BSD-2-Clause-Patent > + > +**/ > + > +#include <Uefi.h> > + > +#include <Guid/EventGroup.h> > +#include <Library/BaseLib.h> > +#include <Library/BaseMemoryLib.h> > +#include <Library/DebugLib.h> > +#include <Library/DevicePathLib.h> > +#include <Library/MemoryAllocationLib.h> > +#include <Library/PcdLib.h> > +#include <Library/UefiBootManagerLib.h> > +#include <Library/UefiBootServicesTableLib.h> > +#include <Library/UefiLib.h> > +#include <Library/UefiRuntimeServicesTableLib.h> > +#include <Protocol/LoadedImage.h> > +#include <Protocol/PlatformBootManager.h> > + > +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 > ^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [edk2-devel] [PATCH v2 1/1] ArmPkg: Implement PlatformBootManagerLib for LinuxBoot 2021-09-22 11:48 ` Ard Biesheuvel @ 2021-10-13 18:43 ` Samer El-Haj-Mahmoud 2021-10-22 18:08 ` Ard Biesheuvel 0 siblings, 1 reply; 6+ messages in thread From: Samer El-Haj-Mahmoud @ 2021-10-13 18:43 UTC (permalink / raw) To: devel@edk2.groups.io, ardb@kernel.org, Nhi Pham Cc: patches@amperecomputing.com, Leif Lindholm, Ard Biesheuvel, Jeff Booher-Kaeding, Samer El-Haj-Mahmoud Ackd-by: Samer El-Haj-Mahmoud <Samer.El-Haj-Mahmoud@arm.com> Any update on getting this reviewed/merged? We have downstream platforms that depend on this and would like to avoid duplication of similar functionality in platform code. Thanks! --Samer > -----Original Message----- > From: devel@edk2.groups.io <devel@edk2.groups.io> On Behalf Of Ard > Biesheuvel via groups.io > Sent: Wednesday, September 22, 2021 7:49 AM > To: Nhi Pham <nhi@os.amperecomputing.com> > Cc: edk2-devel-groups-io <devel@edk2.groups.io>; > patches@amperecomputing.com; Leif Lindholm <leif@nuviainc.com>; Ard > Biesheuvel <ardb+tianocore@kernel.org> > Subject: Re: [edk2-devel] [PATCH v2 1/1] ArmPkg: Implement > PlatformBootManagerLib for LinuxBoot > > On Tue, 7 Sept 2021 at 05:40, Nhi Pham <nhi@os.amperecomputing.com> > 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 <leif@nuviainc.com> > > Cc: Ard Biesheuvel <ardb+tianocore@kernel.org> > > > > Signed-off-by: Nhi Pham <nhi@os.amperecomputing.com> > > Acked-by: Ard Biesheuvel <ardb@kernel.org> > > > --- > > 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.<BR> > > # 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.<BR> > > # Copyright (c) 2016, Linaro Ltd. All rights reserved.<BR> > > # Copyright (c) Microsoft Corporation.<BR> > > +# 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.<BR> > > +# Copyright (c) 2007 - 2014, Intel Corporation. All rights reserved.<BR> > > +# Copyright (c) 2016, Linaro Ltd. All rights reserved.<BR> > > +# Copyright (c) 2020 - 2021, Ampere Computing LLC. All rights > reserved.<BR> > > +# > > +# 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.<BR> > > + Copyright (c) 2004 - 2018, Intel Corporation. All rights reserved.<BR> > > + Copyright (c) 2016, Linaro Ltd. All rights reserved.<BR> > > + Copyright (c) 2020 - 2021, Ampere Computing LLC. All rights > reserved.<BR> > > + > > + SPDX-License-Identifier: BSD-2-Clause-Patent > > + > > +**/ > > + > > +#include <Uefi.h> > > + > > +#include <Guid/EventGroup.h> > > +#include <Library/BaseLib.h> > > +#include <Library/BaseMemoryLib.h> > > +#include <Library/DebugLib.h> > > +#include <Library/DevicePathLib.h> > > +#include <Library/MemoryAllocationLib.h> > > +#include <Library/PcdLib.h> > > +#include <Library/UefiBootManagerLib.h> > > +#include <Library/UefiBootServicesTableLib.h> > > +#include <Library/UefiLib.h> > > +#include <Library/UefiRuntimeServicesTableLib.h> > > +#include <Protocol/LoadedImage.h> > > +#include <Protocol/PlatformBootManager.h> > > + > > +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 > > > > > > IMPORTANT NOTICE: The contents of this email and any attachments are confidential and may also be privileged. If you are not the intended recipient, please notify the sender immediately and do not disclose the contents to any other person, use it for any purpose, or store or copy the information in any medium. Thank you. ^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [edk2-devel] [PATCH v2 1/1] ArmPkg: Implement PlatformBootManagerLib for LinuxBoot 2021-10-13 18:43 ` [edk2-devel] " Samer El-Haj-Mahmoud @ 2021-10-22 18:08 ` Ard Biesheuvel 2021-10-23 2:34 ` Moritz Fischer 0 siblings, 1 reply; 6+ messages in thread From: Ard Biesheuvel @ 2021-10-22 18:08 UTC (permalink / raw) To: Samer El-Haj-Mahmoud Cc: devel@edk2.groups.io, Nhi Pham, patches@amperecomputing.com, Leif Lindholm, Ard Biesheuvel, Jeff Booher-Kaeding This patch triggers CI failures https://github.com/tianocore/edk2/pull/2114 Please take a look and resubmit if there is anything to fix. On Wed, 13 Oct 2021 at 20:43, Samer El-Haj-Mahmoud <Samer.El-Haj-Mahmoud@arm.com> wrote: > > Ackd-by: Samer El-Haj-Mahmoud <Samer.El-Haj-Mahmoud@arm.com> > > Any update on getting this reviewed/merged? We have downstream platforms that depend on this and would like to avoid duplication of similar functionality in platform code. > > Thanks! > --Samer > > > > -----Original Message----- > > From: devel@edk2.groups.io <devel@edk2.groups.io> On Behalf Of Ard > > Biesheuvel via groups.io > > Sent: Wednesday, September 22, 2021 7:49 AM > > To: Nhi Pham <nhi@os.amperecomputing.com> > > Cc: edk2-devel-groups-io <devel@edk2.groups.io>; > > patches@amperecomputing.com; Leif Lindholm <leif@nuviainc.com>; Ard > > Biesheuvel <ardb+tianocore@kernel.org> > > Subject: Re: [edk2-devel] [PATCH v2 1/1] ArmPkg: Implement > > PlatformBootManagerLib for LinuxBoot > > > > On Tue, 7 Sept 2021 at 05:40, Nhi Pham <nhi@os.amperecomputing.com> > > 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 <leif@nuviainc.com> > > > Cc: Ard Biesheuvel <ardb+tianocore@kernel.org> > > > > > > Signed-off-by: Nhi Pham <nhi@os.amperecomputing.com> > > > > Acked-by: Ard Biesheuvel <ardb@kernel.org> > > > > > --- > > > 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.<BR> > > > # 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.<BR> > > > # Copyright (c) 2016, Linaro Ltd. All rights reserved.<BR> > > > # Copyright (c) Microsoft Corporation.<BR> > > > +# 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.<BR> > > > +# Copyright (c) 2007 - 2014, Intel Corporation. All rights reserved.<BR> > > > +# Copyright (c) 2016, Linaro Ltd. All rights reserved.<BR> > > > +# Copyright (c) 2020 - 2021, Ampere Computing LLC. All rights > > reserved.<BR> > > > +# > > > +# 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.<BR> > > > + Copyright (c) 2004 - 2018, Intel Corporation. All rights reserved.<BR> > > > + Copyright (c) 2016, Linaro Ltd. All rights reserved.<BR> > > > + Copyright (c) 2020 - 2021, Ampere Computing LLC. All rights > > reserved.<BR> > > > + > > > + SPDX-License-Identifier: BSD-2-Clause-Patent > > > + > > > +**/ > > > + > > > +#include <Uefi.h> > > > + > > > +#include <Guid/EventGroup.h> > > > +#include <Library/BaseLib.h> > > > +#include <Library/BaseMemoryLib.h> > > > +#include <Library/DebugLib.h> > > > +#include <Library/DevicePathLib.h> > > > +#include <Library/MemoryAllocationLib.h> > > > +#include <Library/PcdLib.h> > > > +#include <Library/UefiBootManagerLib.h> > > > +#include <Library/UefiBootServicesTableLib.h> > > > +#include <Library/UefiLib.h> > > > +#include <Library/UefiRuntimeServicesTableLib.h> > > > +#include <Protocol/LoadedImage.h> > > > +#include <Protocol/PlatformBootManager.h> > > > + > > > +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 > > > > > > > > > > > > > IMPORTANT NOTICE: The contents of this email and any attachments are confidential and may also be privileged. If you are not the intended recipient, please notify the sender immediately and do not disclose the contents to any other person, use it for any purpose, or store or copy the information in any medium. Thank you. ^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [edk2-devel] [PATCH v2 1/1] ArmPkg: Implement PlatformBootManagerLib for LinuxBoot 2021-10-22 18:08 ` Ard Biesheuvel @ 2021-10-23 2:34 ` Moritz Fischer 2021-10-23 7:39 ` Nhi Pham 0 siblings, 1 reply; 6+ messages in thread From: Moritz Fischer @ 2021-10-23 2:34 UTC (permalink / raw) To: devel, ardb Cc: Samer El-Haj-Mahmoud, Nhi Pham, patches@amperecomputing.com, Leif Lindholm, Ard Biesheuvel, Jeff Booher-Kaeding On Fri, Oct 22, 2021 at 11:08 AM Ard Biesheuvel <ardb@kernel.org> wrote: > > This patch triggers CI failures > > https://github.com/tianocore/edk2/pull/2114 > > Please take a look and resubmit if there is anything to fix. Looks like a missing comment? > > On Wed, 13 Oct 2021 at 20:43, Samer El-Haj-Mahmoud > <Samer.El-Haj-Mahmoud@arm.com> wrote: > > > > Ackd-by: Samer El-Haj-Mahmoud <Samer.El-Haj-Mahmoud@arm.com> Acked-by: Moritz Fischer <moritzf@google.com> > > > > Any update on getting this reviewed/merged? We have downstream platforms that depend on this and would like to avoid duplication of similar functionality in platform code. > > > > Thanks! > > --Samer > > > > > > > -----Original Message----- > > > From: devel@edk2.groups.io <devel@edk2.groups.io> On Behalf Of Ard > > > Biesheuvel via groups.io > > > Sent: Wednesday, September 22, 2021 7:49 AM > > > To: Nhi Pham <nhi@os.amperecomputing.com> > > > Cc: edk2-devel-groups-io <devel@edk2.groups.io>; > > > patches@amperecomputing.com; Leif Lindholm <leif@nuviainc.com>; Ard > > > Biesheuvel <ardb+tianocore@kernel.org> > > > Subject: Re: [edk2-devel] [PATCH v2 1/1] ArmPkg: Implement > > > PlatformBootManagerLib for LinuxBoot > > > > > > On Tue, 7 Sept 2021 at 05:40, Nhi Pham <nhi@os.amperecomputing.com> > > > 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 <leif@nuviainc.com> > > > > Cc: Ard Biesheuvel <ardb+tianocore@kernel.org> > > > > > > > > Signed-off-by: Nhi Pham <nhi@os.amperecomputing.com> > > > > > > Acked-by: Ard Biesheuvel <ardb@kernel.org> > > > > > > > --- > > > > 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.<BR> > > > > # 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.<BR> > > > > # Copyright (c) 2016, Linaro Ltd. All rights reserved.<BR> > > > > # Copyright (c) Microsoft Corporation.<BR> > > > > +# 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.<BR> > > > > +# Copyright (c) 2007 - 2014, Intel Corporation. All rights reserved.<BR> > > > > +# Copyright (c) 2016, Linaro Ltd. All rights reserved.<BR> > > > > +# Copyright (c) 2020 - 2021, Ampere Computing LLC. All rights > > > reserved.<BR> > > > > +# > > > > +# 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.<BR> > > > > + Copyright (c) 2004 - 2018, Intel Corporation. All rights reserved.<BR> > > > > + Copyright (c) 2016, Linaro Ltd. All rights reserved.<BR> > > > > + Copyright (c) 2020 - 2021, Ampere Computing LLC. All rights > > > reserved.<BR> > > > > + > > > > + SPDX-License-Identifier: BSD-2-Clause-Patent > > > > + > > > > +**/ > > > > + > > > > +#include <Uefi.h> > > > > + > > > > +#include <Guid/EventGroup.h> > > > > +#include <Library/BaseLib.h> > > > > +#include <Library/BaseMemoryLib.h> > > > > +#include <Library/DebugLib.h> > > > > +#include <Library/DevicePathLib.h> > > > > +#include <Library/MemoryAllocationLib.h> > > > > +#include <Library/PcdLib.h> > > > > +#include <Library/UefiBootManagerLib.h> > > > > +#include <Library/UefiBootServicesTableLib.h> > > > > +#include <Library/UefiLib.h> > > > > +#include <Library/UefiRuntimeServicesTableLib.h> > > > > +#include <Protocol/LoadedImage.h> > > > > +#include <Protocol/PlatformBootManager.h> > > > > + > > > > +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 > > > > > > > > > > > > > > > > > > > > IMPORTANT NOTICE: The contents of this email and any attachments are confidential and may also be privileged. If you are not the intended recipient, please notify the sender immediately and do not disclose the contents to any other person, use it for any purpose, or store or copy the information in any medium. Thank you. > > > > > ^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [edk2-devel] [PATCH v2 1/1] ArmPkg: Implement PlatformBootManagerLib for LinuxBoot 2021-10-23 2:34 ` Moritz Fischer @ 2021-10-23 7:39 ` Nhi Pham 0 siblings, 0 replies; 6+ messages in thread From: Nhi Pham @ 2021-10-23 7:39 UTC (permalink / raw) To: Moritz Fischer, ardb Cc: devel, Samer El-Haj-Mahmoud, patches@amperecomputing.com, Leif Lindholm, Ard Biesheuvel, Jeff Booher-Kaeding Hi Ard, I've just sent the v3 for fixing this CI issue. Please help check it. v3 patch: https://edk2.groups.io/g/devel/message/82598 On 23/10/2021 09:34, Moritz Fischer wrote: > On Fri, Oct 22, 2021 at 11:08 AM Ard Biesheuvel <ardb@kernel.org> wrote: >> This patch triggers CI failures >> >> https://github.com/tianocore/edk2/pull/2114 >> >> Please take a look and resubmit if there is anything to fix. > Looks like a missing comment? Thanks, Moritz for pointing out. Best regards, Nhi >> On Wed, 13 Oct 2021 at 20:43, Samer El-Haj-Mahmoud >> <Samer.El-Haj-Mahmoud@arm.com> wrote: >>> Ackd-by: Samer El-Haj-Mahmoud <Samer.El-Haj-Mahmoud@arm.com> > Acked-by: Moritz Fischer <moritzf@google.com> >>> Any update on getting this reviewed/merged? We have downstream platforms that depend on this and would like to avoid duplication of similar functionality in platform code. >>> >>> Thanks! >>> --Samer >>> >>> >>>> -----Original Message----- >>>> From: devel@edk2.groups.io <devel@edk2.groups.io> On Behalf Of Ard >>>> Biesheuvel via groups.io >>>> Sent: Wednesday, September 22, 2021 7:49 AM >>>> To: Nhi Pham <nhi@os.amperecomputing.com> >>>> Cc: edk2-devel-groups-io <devel@edk2.groups.io>; >>>> patches@amperecomputing.com; Leif Lindholm <leif@nuviainc.com>; Ard >>>> Biesheuvel <ardb+tianocore@kernel.org> >>>> Subject: Re: [edk2-devel] [PATCH v2 1/1] ArmPkg: Implement >>>> PlatformBootManagerLib for LinuxBoot >>>> >>>> On Tue, 7 Sept 2021 at 05:40, Nhi Pham <nhi@os.amperecomputing.com> >>>> 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 <leif@nuviainc.com> >>>>> Cc: Ard Biesheuvel <ardb+tianocore@kernel.org> >>>>> >>>>> Signed-off-by: Nhi Pham <nhi@os.amperecomputing.com> >>>> Acked-by: Ard Biesheuvel <ardb@kernel.org> >>>> >>>>> --- >>>>> 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.<BR> >>>>> # 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.<BR> >>>>> # Copyright (c) 2016, Linaro Ltd. All rights reserved.<BR> >>>>> # Copyright (c) Microsoft Corporation.<BR> >>>>> +# 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.<BR> >>>>> +# Copyright (c) 2007 - 2014, Intel Corporation. All rights reserved.<BR> >>>>> +# Copyright (c) 2016, Linaro Ltd. All rights reserved.<BR> >>>>> +# Copyright (c) 2020 - 2021, Ampere Computing LLC. All rights >>>> reserved.<BR> >>>>> +# >>>>> +# 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.<BR> >>>>> + Copyright (c) 2004 - 2018, Intel Corporation. All rights reserved.<BR> >>>>> + Copyright (c) 2016, Linaro Ltd. All rights reserved.<BR> >>>>> + Copyright (c) 2020 - 2021, Ampere Computing LLC. All rights >>>> reserved.<BR> >>>>> + >>>>> + SPDX-License-Identifier: BSD-2-Clause-Patent >>>>> + >>>>> +**/ >>>>> + >>>>> +#include <Uefi.h> >>>>> + >>>>> +#include <Guid/EventGroup.h> >>>>> +#include <Library/BaseLib.h> >>>>> +#include <Library/BaseMemoryLib.h> >>>>> +#include <Library/DebugLib.h> >>>>> +#include <Library/DevicePathLib.h> >>>>> +#include <Library/MemoryAllocationLib.h> >>>>> +#include <Library/PcdLib.h> >>>>> +#include <Library/UefiBootManagerLib.h> >>>>> +#include <Library/UefiBootServicesTableLib.h> >>>>> +#include <Library/UefiLib.h> >>>>> +#include <Library/UefiRuntimeServicesTableLib.h> >>>>> +#include <Protocol/LoadedImage.h> >>>>> +#include <Protocol/PlatformBootManager.h> >>>>> + >>>>> +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 >>>>> >>>> >>>> >>>> >>> IMPORTANT NOTICE: The contents of this email and any attachments are confidential and may also be privileged. If you are not the intended recipient, please notify the sender immediately and do not disclose the contents to any other person, use it for any purpose, or store or copy the information in any medium. Thank you. >> >> >> >> ^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2021-10-23 7:40 UTC | newest] Thread overview: 6+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2021-09-07 3:38 [PATCH v2 1/1] ArmPkg: Implement PlatformBootManagerLib for LinuxBoot Nhi Pham 2021-09-22 11:48 ` Ard Biesheuvel 2021-10-13 18:43 ` [edk2-devel] " Samer El-Haj-Mahmoud 2021-10-22 18:08 ` Ard Biesheuvel 2021-10-23 2:34 ` Moritz Fischer 2021-10-23 7:39 ` Nhi Pham
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox