Hi, Guo Dong Don't you need to free "Buffer" after Fv->ReadSection() call ?
Regards, Mike. On Wed, May 10, 2023 at 6:58 AM Guo Dong <guo.d...@intel.com> wrote: > > From: Guo Dong <guo.d...@intel.com> > > After moving BDS driver to a new FV for universal UEFI payload, > the shell boot option path is not correct since it used the BDS > FV instead of DXE FV in its device path. > This patch would find the correct FV by reading shell file. > It also removed PcdShellFile by using gUefiShellFileGuid. > > Signed-off-by: Guo Dong <guo.d...@intel.com> > Cc: Ray Ni <ray...@intel.com> > Cc: Sean Rhodes <sean@starlabs.systems> > Cc: James Lu <james...@intel.com> > Cc: Gua Guo <gua....@intel.com> > --- > UefiPayloadPkg/Library/PlatformBootManagerLib/PlatformBootManager.c | > 76 > ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++------ > UefiPayloadPkg/Library/PlatformBootManagerLib/PlatformBootManagerLib.inf | > 5 +++-- > UefiPayloadPkg/UefiPayloadPkg.dec | > 3 --- > 3 files changed, 73 insertions(+), 11 deletions(-) > > diff --git > a/UefiPayloadPkg/Library/PlatformBootManagerLib/PlatformBootManager.c > b/UefiPayloadPkg/Library/PlatformBootManagerLib/PlatformBootManager.c > index 62637ae6aa..cf72783af1 100644 > --- a/UefiPayloadPkg/Library/PlatformBootManagerLib/PlatformBootManager.c > +++ b/UefiPayloadPkg/Library/PlatformBootManagerLib/PlatformBootManager.c > @@ -2,7 +2,7 @@ > This file include all platform action which can be customized > by IBV/OEM. > > -Copyright (c) 2015 - 2021, Intel Corporation. All rights reserved.<BR> > +Copyright (c) 2015 - 2023, Intel Corporation. All rights reserved.<BR> > SPDX-License-Identifier: BSD-2-Clause-Patent > > **/ > @@ -11,6 +11,7 @@ SPDX-License-Identifier: BSD-2-Clause-Patent > #include "PlatformConsole.h" > #include <Guid/BootManagerMenu.h> > #include <Library/HobLib.h> > +#include <Protocol/FirmwareVolume2.h> > > /** > Signal EndOfDxe event and install SMM Ready to lock protocol. > @@ -89,6 +90,72 @@ PlatformFindLoadOption ( > return -1; > } > > + > +EFI_DEVICE_PATH_PROTOCOL * > +BdsGetShellFvDevicePath ( > + VOID > + ) > +{ > + UINTN FvHandleCount; > + EFI_HANDLE *FvHandleBuffer; > + UINTN Index; > + EFI_STATUS Status; > + EFI_FIRMWARE_VOLUME2_PROTOCOL *Fv; > + UINTN Size; > + UINT32 AuthenticationStatus; > + EFI_DEVICE_PATH_PROTOCOL *DevicePath; > + VOID *Buffer; > + > + Status = EFI_SUCCESS; > + gBS->LocateHandleBuffer ( > + ByProtocol, > + &gEfiFirmwareVolume2ProtocolGuid, > + NULL, > + &FvHandleCount, > + &FvHandleBuffer > + ); > + > + for (Index = 0; Index < FvHandleCount; Index++) { > + Buffer = NULL; > + Size = 0; > + gBS->HandleProtocol ( > + FvHandleBuffer[Index], > + &gEfiFirmwareVolume2ProtocolGuid, > + (VOID **) &Fv > + ); > + Status = Fv->ReadSection ( > + Fv, > + &gUefiShellFileGuid, > + EFI_SECTION_PE32, > + 0, > + &Buffer, > + &Size, > + &AuthenticationStatus > + ); > + if (!EFI_ERROR (Status)) { > + // > + // Found the shell file > + // > + break; > + } > + } > + > + if (EFI_ERROR (Status)) { > + if (FvHandleCount) { > + FreePool (FvHandleBuffer); > + } > + return NULL; > + } > + > + DevicePath = DevicePathFromHandle (FvHandleBuffer[Index]); > + > + if (FvHandleCount) { > + FreePool (FvHandleBuffer); > + } > + > + return DevicePath; > +} > + > /** > Register a boot option using a file GUID in the FV. > > @@ -109,15 +176,12 @@ PlatformRegisterFvBootOption ( > 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 = AppendDevicePathNode ( > - DevicePathFromHandle (LoadedImage->DeviceHandle), > + BdsGetShellFvDevicePath(), > (EFI_DEVICE_PATH_PROTOCOL *)&FileNode > ); > > @@ -248,7 +312,7 @@ PlatformBootManagerAfterConsole ( > // > // Register UEFI Shell > // > - PlatformRegisterFvBootOption (PcdGetPtr (PcdShellFile), L"UEFI Shell", > LOAD_OPTION_ACTIVE); > + PlatformRegisterFvBootOption (&gUefiShellFileGuid, L"UEFI Shell", > LOAD_OPTION_ACTIVE); > > if (FixedPcdGetBool (PcdBootManagerEscape)) { > Print ( > diff --git > a/UefiPayloadPkg/Library/PlatformBootManagerLib/PlatformBootManagerLib.inf > b/UefiPayloadPkg/Library/PlatformBootManagerLib/PlatformBootManagerLib.inf > index f9626175e2..a3951b7a7e 100644 > --- a/UefiPayloadPkg/Library/PlatformBootManagerLib/PlatformBootManagerLib.inf > +++ b/UefiPayloadPkg/Library/PlatformBootManagerLib/PlatformBootManagerLib.inf > @@ -1,7 +1,7 @@ > ## @file > # Include all platform action which can be customized by IBV/OEM. > # > -# Copyright (c) 2012 - 2021, Intel Corporation. All rights reserved.<BR> > +# Copyright (c) 2012 - 2023, Intel Corporation. All rights reserved.<BR> > # SPDX-License-Identifier: BSD-2-Clause-Patent > # > ## > @@ -32,6 +32,7 @@ > MdePkg/MdePkg.dec > MdeModulePkg/MdeModulePkg.dec > UefiPayloadPkg/UefiPayloadPkg.dec > + ShellPkg/ShellPkg.dec > > [LibraryClasses] > BaseLib > @@ -52,6 +53,7 @@ > [Guids] > gEfiEndOfDxeEventGroupGuid > gEdkiiBootManagerMenuFileGuid > + gUefiShellFileGuid > > [Protocols] > gEfiGenericMemTestProtocolGuid ## CONSUMES > @@ -69,7 +71,6 @@ > gEfiMdeModulePkgTokenSpaceGuid.PcdConOutRow > gEfiMdeModulePkgTokenSpaceGuid.PcdConOutColumn > gEfiMdeModulePkgTokenSpaceGuid.PcdConInConnectOnDemand > - gUefiPayloadPkgTokenSpaceGuid.PcdShellFile > gEfiMdePkgTokenSpaceGuid.PcdUartDefaultBaudRate > gEfiMdePkgTokenSpaceGuid.PcdUartDefaultDataBits > gEfiMdePkgTokenSpaceGuid.PcdUartDefaultParity > diff --git a/UefiPayloadPkg/UefiPayloadPkg.dec > b/UefiPayloadPkg/UefiPayloadPkg.dec > index a23a7b5a78..8d111f3a90 100644 > --- a/UefiPayloadPkg/UefiPayloadPkg.dec > +++ b/UefiPayloadPkg/UefiPayloadPkg.dec > @@ -67,9 +67,6 @@ > gUefiPayloadPkgTokenSpaceGuid.PcdPayloadFdMemSize|0|UINT32|0x10000002 > ## Save bootloader parameter > gUefiPayloadPkgTokenSpaceGuid.PcdBootloaderParameter|0|UINT64|0x10000004 > > -## FFS filename to find the shell application. > -gUefiPayloadPkgTokenSpaceGuid.PcdShellFile|{ 0x83, 0xA5, 0x04, 0x7C, 0x3E, > 0x9E, 0x1c, 0x4f, 0xAD, 0x65, 0xE0, 0x52, 0x68, 0xD0, 0xB4, 0xD1 > }|VOID*|0x10000005 > - > ## Used to help reduce fragmentation in the EFI memory map > > gUefiPayloadPkgTokenSpaceGuid.PcdMemoryTypeEfiACPIReclaimMemory|0x19|UINT32|0x10000012 > > gUefiPayloadPkgTokenSpaceGuid.PcdMemoryTypeEfiACPIMemoryNVS|0x04|UINT32|0x10000013 > -- > 2.39.1.windows.1 > > > > ------------ > Groups.io Links: You receive all messages sent to this group. > View/Reply Online (#104480): https://edk2.groups.io/g/devel/message/104480 > Mute This Topic: https://groups.io/mt/98799622/1770412 > Group Owner: devel+ow...@edk2.groups.io > Unsubscribe: https://edk2.groups.io/g/devel/unsub [mike.maslen...@gmail.com] > ------------ > > -=-=-=-=-=-=-=-=-=-=-=- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#104497): https://edk2.groups.io/g/devel/message/104497 Mute This Topic: https://groups.io/mt/98799622/21656 Group Owner: devel+ow...@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [arch...@mail-archive.com] -=-=-=-=-=-=-=-=-=-=-=-