On December 12, 2022 5:04 PM, Boeuf, Sebastien wrote: > Subject: [PATCH 3/3] OvmfPkg/AcpiPlatformDxe: Differentiate TDX case for > Cloud Hypervisor > > From: Sebastien Boeuf <sebastien.bo...@intel.com> > > Rely on CcProbe() to identify when running on TDX so that ACPI tables can be > retrieved differently for Cloud Hypervisor. Instead of relying on the PVH > structure to find the RSDP pointer, the tables are individually passed through > the HOB. > > Signed-off-by: Jiaqi Gao <jiaqi....@intel.com> > Signed-off-by: Sebastien Boeuf <sebastien.bo...@intel.com> > --- > OvmfPkg/AcpiPlatformDxe/AcpiPlatform.c | 8 +- > OvmfPkg/AcpiPlatformDxe/AcpiPlatform.h | 6 ++ > OvmfPkg/AcpiPlatformDxe/AcpiPlatformDxe.inf | 2 + > OvmfPkg/AcpiPlatformDxe/CloudHvAcpi.c | 87 +++++++++++++++++++++ > OvmfPkg/OvmfPkg.dec | 1 + > 5 files changed, 103 insertions(+), 1 deletion(-) > > diff --git a/OvmfPkg/AcpiPlatformDxe/AcpiPlatform.c > b/OvmfPkg/AcpiPlatformDxe/AcpiPlatform.c > index fcfb9703bd..0cc3d958be 100644 > --- a/OvmfPkg/AcpiPlatformDxe/AcpiPlatform.c > +++ b/OvmfPkg/AcpiPlatformDxe/AcpiPlatform.c > @@ -9,6 +9,8 @@ > #include <OvmfPlatforms.h> // CLOUDHV_DEVICE_ID +#include > <Library/CcProbeLib.h> // CcProbe(), CcGuestTypeIntelTdx+ #include > "AcpiPlatform.h" /**@@ -33,7 +35,11 @@ InstallAcpiTables ( > HostBridgeDevId = PcdGet16 (PcdOvmfHostBridgePciDevId); if > (HostBridgeDevId == CLOUDHV_DEVICE_ID) {- Status = InstallCloudHvTables > (AcpiTable);+ if (CcProbe () == CcGuestTypeIntelTdx) {+ Status = > InstallCloudHvTablesTdx (AcpiTable);+ } else {+ Status = > InstallCloudHvTables (AcpiTable);+ } } else { Status = > InstallQemuFwCfgTables (AcpiTable); }diff --git > a/OvmfPkg/AcpiPlatformDxe/AcpiPlatform.h > b/OvmfPkg/AcpiPlatformDxe/AcpiPlatform.h > index 342339750d..3ec5098658 100644 > --- a/OvmfPkg/AcpiPlatformDxe/AcpiPlatform.h > +++ b/OvmfPkg/AcpiPlatformDxe/AcpiPlatform.h > @@ -19,6 +19,12 @@ typedef struct { > typedef struct S3_CONTEXT S3_CONTEXT; > +EFI_STATUS+EFIAPI+InstallCloudHvTablesTdx (+ IN > EFI_ACPI_TABLE_PROTOCOL *AcpiProtocol+ );+ EFI_STATUS EFIAPI > InstallCloudHvTables (diff --git > a/OvmfPkg/AcpiPlatformDxe/AcpiPlatformDxe.inf > b/OvmfPkg/AcpiPlatformDxe/AcpiPlatformDxe.inf > index 09daf30bcd..dd03eccd88 100644 > --- a/OvmfPkg/AcpiPlatformDxe/AcpiPlatformDxe.inf > +++ b/OvmfPkg/AcpiPlatformDxe/AcpiPlatformDxe.inf > @@ -45,6 +45,7 @@ > QemuFwCfgS3Lib UefiBootServicesTableLib UefiDriverEntryPoint+ > HobLib [Protocols] gEfiAcpiTableProtocolGuid # PROTOCOL > ALWAYS_CONSUMED@@ -53,6 +54,7 @@ > [Guids] gRootBridgesConnectedEventGroupGuid+ > gUefiOvmfPkgTdxAcpiHobGuid [Pcd] > gEfiMdeModulePkgTokenSpaceGuid.PcdPciDisableBusEnumerationdiff --git > a/OvmfPkg/AcpiPlatformDxe/CloudHvAcpi.c > b/OvmfPkg/AcpiPlatformDxe/CloudHvAcpi.c > index ff59600d3e..cbe8bb9b0c 100644 > --- a/OvmfPkg/AcpiPlatformDxe/CloudHvAcpi.c > +++ b/OvmfPkg/AcpiPlatformDxe/CloudHvAcpi.c > @@ -7,14 +7,101 @@ > **/ +#include <IndustryStandard/Acpi.h> // > EFI_ACPI_DESCRIPTION_HEADER #include <IndustryStandard/CloudHv.h> > // CLOUDHV_RSDP_ADDRESS #include <IndustryStandard/Xen/arch- > x86/hvm/start_info.h> // hvm_start_info #include <Library/BaseLib.h> > // CpuDeadLoop() #include <Library/DebugLib.h> // > DEBUG() > #include <Library/PcdLib.h> // > PcdGet32()+#include > <Library/HobLib.h> // GetFirstGuidHob(), > GetNextGuidHob()+#include <Library/UefiBootServicesTableLib.h> // > gBS++#include <Protocol/AcpiSystemDescriptionTable.h>+#include > <Protocol/AcpiTable.h>+#include <Protocol/QemuAcpiTableNotify.h> > // QEMU_ACPI_TABLE_NOTIFY_PROTOCOL #include "AcpiPlatform.h" > +EFI_HANDLE mChAcpiHandle = > NULL;+QEMU_ACPI_TABLE_NOTIFY_PROTOCOL > mChAcpiNotifyProtocol;++EFI_STATUS+EFIAPI+InstallCloudHvTablesTdx (+ > IN EFI_ACPI_TABLE_PROTOCOL *AcpiProtocol+ )+{+ EFI_STATUS Status;+ > UINTN TableHandle;++ EFI_PEI_HOB_POINTERS Hob;+ > EFI_ACPI_DESCRIPTION_HEADER *CurrentTable;+ > EFI_ACPI_DESCRIPTION_HEADER *DsdtTable;++ DsdtTable = NULL;+ > TableHandle = 0;++ Hob.Guid = (EFI_HOB_GUID_TYPE *)GetFirstGuidHob > (&gUefiOvmfPkgTdxAcpiHobGuid);++ while (Hob.Guid != NULL) {+ > CurrentTable = (EFI_ACPI_DESCRIPTION_HEADER *)(&Hob.Guid->Name + > 1);+ if (!AsciiStrnCmp ((CHAR8 *)&CurrentTable->Signature, "DSDT", 4)) {+ > DsdtTable = CurrentTable;+ } else {+ //+ // Install the tables+ > //+ > Status = AcpiProtocol->InstallAcpiTable (+ > AcpiProtocol,+ > CurrentTable,+ CurrentTable->Length,+ > &TableHandle+ );+ for (UINTN i = 0; i < > CurrentTable- > >Length; i++) {+ DEBUG ((DEBUG_INFO, " %x", *((UINT8 *)CurrentTable + > i)));+ }++ DEBUG ((DEBUG_INFO, "\n"));+ }++ Hob.Raw = > GET_NEXT_HOB (Hob.Raw);+ Hob.Guid = (EFI_HOB_GUID_TYPE > *)GetNextGuidHob (&gUefiOvmfPkgTdxAcpiHobGuid, Hob.Raw);+ }++ //+ > // Install DSDT table. If we reached this point without finding the DSDT,+ // > then we're out of sync with the hypervisor, and cannot continue.+ //+ if > (DsdtTable == NULL) {+ DEBUG ((DEBUG_INFO, "%a: no DSDT found\n", > __FUNCTION__));+ ASSERT (FALSE);+ }++ Status = AcpiProtocol- > >InstallAcpiTable (+ AcpiProtocol,+ > > DsdtTable,+ > DsdtTable->Length,+ &TableHandle+ > );+ if > (EFI_ERROR (Status)) {+ ASSERT_EFI_ERROR (Status);+ return Status;+ }++ > //+ // Install a protocol to notify that the ACPI table provided by CH is+ > // > ready.+ //+ gBS->InstallProtocolInterface (+ &mChAcpiHandle,+ > &gQemuAcpiTableNotifyProtocolGuid,+ EFI_NATIVE_INTERFACE,+ > &mChAcpiNotifyProtocol+ );++ return EFI_SUCCESS;+}+ // Get the ACPI > tables from EBDA start EFI_STATUS EFIAPIdiff --git a/OvmfPkg/OvmfPkg.dec > b/OvmfPkg/OvmfPkg.dec > index 5f5556c67c..a350bb8f84 100644 > --- a/OvmfPkg/OvmfPkg.dec > +++ b/OvmfPkg/OvmfPkg.dec > @@ -151,6 +151,7 @@ > gConfidentialComputingSevSnpBlobGuid = {0x067b1f5f, 0xcf26, 0x44c5, > {0x85, 0x54, 0x93, 0xd7, 0x77, 0x91, 0x2d, 0x42}} > gUefiOvmfPkgPlatformInfoGuid = {0xdec9b486, 0x1f16, 0x47c7, {0x8f, > 0x68, 0xdf, 0x1a, 0x41, 0x88, 0x8b, 0xa5}} gVMMBootOrderGuid > = > {0x668f4529, 0x63d0, 0x4bb5, {0xb6, 0x5d, 0x6f, 0xbb, 0x9d, 0x36, 0xa4, > 0x4a}}+ gUefiOvmfPkgTdxAcpiHobGuid = {0x6a0c5870, 0xd4ed, 0x44f4, > {0xa1, 0x35, 0xdd, 0x23, 0x8b, 0x6f, 0x0c, 0x8d}} [Ppis] # PPI whose > presence in the PPI database signals that the TPM base address-- > 2.34.1
Reviewed-by: Min Xu <min.m...@intel.com> -=-=-=-=-=-=-=-=-=-=-=- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#97282): https://edk2.groups.io/g/devel/message/97282 Mute This Topic: https://groups.io/mt/95617498/21656 Group Owner: devel+ow...@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [arch...@mail-archive.com] -=-=-=-=-=-=-=-=-=-=-=-