From d61bf620beb379097eca2705e0cf135f941f13bd Mon Sep 17 00:00:00 2001 From: Laszlo Ersek Date: Thu, 11 Mar 2021 21:35:55 +0100 Subject: [PATCH 2/4] ArmVirtPkg/PlatformPeiLib: create FVB_ADDRESS_LIST Allocate and initialize FVB_ADDRESS_LIST in a new reserved memory page, and expose the address in the EDKII_FVB_ADDRESS_LIST_GUID HOB. Signed-off-by: Laszlo Ersek --- ArmVirtPkg/Library/PlatformPeiLib/PlatformPeiLib.inf | 2 + ArmVirtPkg/Library/PlatformPeiLib/PlatformPeiLib.c | 58 +++++++++++++------- 2 files changed, 41 insertions(+), 19 deletions(-) diff --git a/ArmVirtPkg/Library/PlatformPeiLib/PlatformPeiLib.inf b/ArmVirtPkg/Library/PlatformPeiLib/PlatformPeiLib.inf index 3f97ef080520..78eef962fdac 100644 --- a/ArmVirtPkg/Library/PlatformPeiLib/PlatformPeiLib.inf +++ b/ArmVirtPkg/Library/PlatformPeiLib/PlatformPeiLib.inf @@ -27,14 +27,15 @@ [Packages] OvmfPkg/OvmfPkg.dec SecurityPkg/SecurityPkg.dec [FeaturePcd] gArmVirtTokenSpaceGuid.PcdTpm2SupportEnabled [LibraryClasses] + BaseMemoryLib DebugLib HobLib FdtLib PcdLib PeiServicesLib [FixedPcd] @@ -48,11 +49,12 @@ [Pcd] [Ppis] gOvmfTpmDiscoveredPpiGuid ## SOMETIMES_PRODUCES gPeiTpmInitializationDonePpiGuid ## SOMETIMES_PRODUCES [Guids] gEarlyPL011BaseAddressGuid + gEdkiiFvbAddressListGuid gFdtHobGuid [Depex] gEfiPeiMemoryDiscoveredPpiGuid diff --git a/ArmVirtPkg/Library/PlatformPeiLib/PlatformPeiLib.c b/ArmVirtPkg/Library/PlatformPeiLib/PlatformPeiLib.c index 6c4028e17995..079ecfad336d 100644 --- a/ArmVirtPkg/Library/PlatformPeiLib/PlatformPeiLib.c +++ b/ArmVirtPkg/Library/PlatformPeiLib/PlatformPeiLib.c @@ -5,14 +5,16 @@ * * SPDX-License-Identifier: BSD-2-Clause-Patent * **/ #include +#include +#include #include #include #include #include #include #include @@ -33,33 +35,35 @@ STATIC CONST EFI_PEI_PPI_DESCRIPTOR mTpm2InitializationDonePpi = { EFI_STATUS EFIAPI PlatformPeim ( VOID ) { - VOID *Base; - VOID *NewBase; - UINTN FdtSize; - UINTN FdtPages; - UINT64 *FdtHobData; - UINT64 *UartHobData; - INT32 Node, Prev; - INT32 Parent, Depth; - CONST CHAR8 *Compatible; - CONST CHAR8 *CompItem; - CONST CHAR8 *NodeStatus; - INT32 Len; - INT32 RangesLen; - INT32 StatusLen; - CONST UINT64 *RegProp; - CONST UINT32 *RangesProp; - UINT64 UartBase; - UINT64 TpmBase; - EFI_STATUS Status; + VOID *Base; + VOID *NewBase; + UINTN FdtSize; + UINTN FdtPages; + UINT64 *FdtHobData; + UINT64 *UartHobData; + INT32 Node, Prev; + INT32 Parent, Depth; + CONST CHAR8 *Compatible; + CONST CHAR8 *CompItem; + CONST CHAR8 *NodeStatus; + INT32 Len; + INT32 RangesLen; + INT32 StatusLen; + CONST UINT64 *RegProp; + CONST UINT32 *RangesProp; + UINT64 UartBase; + UINT64 TpmBase; + EFI_STATUS Status; + FVB_ADDRESS_LIST *FvbAddressList; + FVB_ADDRESS_LIST_PTR *FvbAddressListPtrHobData; Base = (VOID*)(UINTN)PcdGet64 (PcdDeviceTreeInitialBaseAddress); ASSERT (Base != NULL); ASSERT (fdt_check_header (Base) == 0); FdtSize = fdt_totalsize (Base) + PcdGet32 (PcdDeviceTreeAllocationPadding); FdtPages = EFI_SIZE_TO_PAGES (FdtSize); @@ -181,9 +185,25 @@ PlatformPeim ( Status = PeiServicesInstallPpi (&mTpm2InitializationDonePpi); } ASSERT_EFI_ERROR (Status); } BuildFvHob (PcdGet64 (PcdFvBaseAddress), PcdGet32 (PcdFvSize)); + // + // Allocate, initialize, and expose FVB_ADDRESS_LIST. + // + FvbAddressList = AllocateReservedPages ( + EFI_SIZE_TO_PAGES (sizeof *FvbAddressList)); + ASSERT (FvbAddressList != NULL); + DEBUG ((DEBUG_VERBOSE, "%a: FvbAddressList @ %p\n", __FUNCTION__, + (VOID *)FvbAddressList)); + FvbAddressList->Signature = FVB_ADDRESS_LIST_SIGNATURE; + ZeroMem (FvbAddressList->Entry, sizeof FvbAddressList->Entry); + FvbAddressList->Next = 0; + FvbAddressListPtrHobData = BuildGuidHob (&gEdkiiFvbAddressListGuid, + sizeof *FvbAddressListPtrHobData); + ASSERT (FvbAddressListPtrHobData != NULL); + *FvbAddressListPtrHobData = (UINTN)FvbAddressList; + return EFI_SUCCESS; } -- 2.19.1.3.g30247aa5d201