From 9a76c7945b762ed8abed3b917aa6217846ae1918 Mon Sep 17 00:00:00 2001 From: Dun Tan Date: Tue, 4 Jun 2024 09:52:52 +0800 Subject: SecurityPkg: Build gEdkiiTcg2AcpiCommunicateBufferHobGuid Install a callback of gEfiPeiMemoryDiscoveredPpiGuid to build the gEdkiiTcg2AcpiCommunicateBufferHobGuid in the Tcg2ConfigPei PEIM. The HOB contains a buffer reserved by MmUnblockMemoryLib. The buffer will be used in Tcg2Acpi driver to retrive information from standalone mm environment. Signed-off-by: Dun Tan --- SecurityPkg/Tcg/Tcg2Config/Tcg2ConfigPei.inf | 3 ++ SecurityPkg/Tcg/Tcg2Config/Tcg2ConfigPeim.c | 52 ++++++++++++++++++++++++++++ 2 files changed, 55 insertions(+) diff --git a/SecurityPkg/Tcg/Tcg2Config/Tcg2ConfigPei.inf b/SecurityPkg/Tcg/Tcg2Config/Tcg2ConfigPei.inf index b0c9c44e29..f7213b2780 100644 --- a/SecurityPkg/Tcg/Tcg2Config/Tcg2ConfigPei.inf +++ b/SecurityPkg/Tcg/Tcg2Config/Tcg2ConfigPei.inf @@ -47,6 +47,7 @@ Tpm12CommandLib Tpm12DeviceLib HobLib + MmUnblockMemoryLib [Guids] ## SOMETIMES_CONSUMES ## Variable:L"TCG2_CONFIGURATION" @@ -56,10 +57,12 @@ gEfiTpmDeviceInstanceNoneGuid ## SOMETIMES_CONSUMES ## GUID # TPM device identifier gEdkiiTpmInstanceHobGuid gEdkiiTcgPhysicalPresenceInterfaceVerHobGuid + gEdkiiTcg2AcpiCommunicateBufferHobGuid [Ppis] gEfiPeiReadOnlyVariable2PpiGuid ## CONSUMES gPeiTpmInitializationDonePpiGuid ## SOMETIMES_PRODUCES + gEfiPeiMemoryDiscoveredPpiGuid [Pcd] gEfiSecurityPkgTokenSpaceGuid.PcdTpmInstanceGuid ## PRODUCES diff --git a/SecurityPkg/Tcg/Tcg2Config/Tcg2ConfigPeim.c b/SecurityPkg/Tcg/Tcg2Config/Tcg2ConfigPeim.c index 9840deb210..ce78e32537 100644 --- a/SecurityPkg/Tcg/Tcg2Config/Tcg2ConfigPeim.c +++ b/SecurityPkg/Tcg/Tcg2Config/Tcg2ConfigPeim.c @@ -9,6 +9,8 @@ SPDX-License-Identifier: BSD-2-Clause-Patent #include #include +#include +#include #include #include @@ -17,6 +19,7 @@ SPDX-License-Identifier: BSD-2-Clause-Patent #include #include #include +#include #include #include @@ -51,6 +54,53 @@ DetectTpmDevice ( IN UINT8 SetupTpmDevice ); +/** + Build gEdkiiTcg2AcpiCommunicateBufferHobGuid. + + @param[in] PeiServices General purpose services available to every PEIM. + @param[in] NotifyDescriptor The notification structure this PEIM registered on install. + @param[in] Ppi The memory discovered PPI. Not used. + + @retval EFI_SUCCESS The function completed successfully. + @retval others Failed to build Tcg2AcpiCommunicateBuffer Hob. + +**/ +EFI_STATUS +EFIAPI +BuildTcg2AcpiCommunicateBufferHob ( + IN EFI_PEI_SERVICES **PeiServices, + IN EFI_PEI_NOTIFY_DESCRIPTOR *NotifyDescriptor, + IN VOID *Ppi + ) +{ + TCG2_ACPI_COMMUNICATE_BUFFER *Tcg2AcpiCommunicateBufferHob; + EFI_STATUS Status; + VOID *Buffer; + UINTN Pages; + + Pages = sizeof (TCG_NVS); + Buffer = AllocateRuntimePages (Pages); + ASSERT (Buffer != NULL); + + Status = MmUnblockMemoryRequest ((UINTN)Buffer, Pages); + if ((Status != EFI_UNSUPPORTED) && EFI_ERROR (Status)) { + return Status; + } + + Tcg2AcpiCommunicateBufferHob = BuildGuidHob (&gEdkiiTcg2AcpiCommunicateBufferHobGuid, sizeof (TCG2_ACPI_COMMUNICATE_BUFFER)); + ASSERT (Tcg2AcpiCommunicateBufferHob != NULL); + Tcg2AcpiCommunicateBufferHob->Tcg2AcpiCommunicateBuffer = (UINTN)Buffer; + Tcg2AcpiCommunicateBufferHob->Pages = Pages; + + return EFI_SUCCESS; +} + +EFI_PEI_NOTIFY_DESCRIPTOR mPostMemNotifyList = { + (EFI_PEI_PPI_DESCRIPTOR_NOTIFY_CALLBACK | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST), + &gEfiPeiMemoryDiscoveredPpiGuid, + BuildTcg2AcpiCommunicateBufferHob +}; + /** The entry point for Tcg2 configuration driver. @@ -155,6 +205,8 @@ Tcg2ConfigPeimEntryPoint ( ); ASSERT (Hob != NULL); + PeiServicesNotifyPpi (&mPostMemNotifyList); + // // Selection done // -- cgit