\r
#include <OvmfPlatforms.h> // CLOUDHV_DEVICE_ID\r
\r
+#include <Library/CcProbeLib.h> // CcProbe(), CcGuestTypeIntelTdx\r
+\r
#include "AcpiPlatform.h"\r
\r
/**\r
\r
HostBridgeDevId = PcdGet16 (PcdOvmfHostBridgePciDevId);\r
if (HostBridgeDevId == CLOUDHV_DEVICE_ID) {\r
- Status = InstallCloudHvTables (AcpiTable);\r
+ if (CcProbe () == CcGuestTypeIntelTdx) {\r
+ Status = InstallCloudHvTablesTdx (AcpiTable);\r
+ } else {\r
+ Status = InstallCloudHvTables (AcpiTable);\r
+ }\r
} else {\r
Status = InstallQemuFwCfgTables (AcpiTable);\r
}\r
\r
**/\r
\r
+#include <IndustryStandard/Acpi.h> // EFI_ACPI_DESCRIPTION_HEADER\r
#include <IndustryStandard/CloudHv.h> // CLOUDHV_RSDP_ADDRESS\r
#include <IndustryStandard/Xen/arch-x86/hvm/start_info.h> // hvm_start_info\r
#include <Library/BaseLib.h> // CpuDeadLoop()\r
#include <Library/DebugLib.h> // DEBUG()\r
#include <Library/PcdLib.h> // PcdGet32()\r
+#include <Library/HobLib.h> // GetFirstGuidHob(), GetNextGuidHob()\r
+#include <Library/UefiBootServicesTableLib.h> // gBS\r
+\r
+#include <Protocol/AcpiSystemDescriptionTable.h>\r
+#include <Protocol/AcpiTable.h>\r
+#include <Protocol/QemuAcpiTableNotify.h> // QEMU_ACPI_TABLE_NOTIFY_PROTOCOL\r
\r
#include "AcpiPlatform.h"\r
\r
+EFI_HANDLE mChAcpiHandle = NULL;\r
+QEMU_ACPI_TABLE_NOTIFY_PROTOCOL mChAcpiNotifyProtocol;\r
+\r
+EFI_STATUS\r
+EFIAPI\r
+InstallCloudHvTablesTdx (\r
+ IN EFI_ACPI_TABLE_PROTOCOL *AcpiProtocol\r
+ )\r
+{\r
+ EFI_STATUS Status;\r
+ UINTN TableHandle;\r
+\r
+ EFI_PEI_HOB_POINTERS Hob;\r
+ EFI_ACPI_DESCRIPTION_HEADER *CurrentTable;\r
+ EFI_ACPI_DESCRIPTION_HEADER *DsdtTable;\r
+\r
+ DsdtTable = NULL;\r
+ TableHandle = 0;\r
+\r
+ Hob.Guid = (EFI_HOB_GUID_TYPE *)GetFirstGuidHob (&gUefiOvmfPkgTdxAcpiHobGuid);\r
+\r
+ while (Hob.Guid != NULL) {\r
+ CurrentTable = (EFI_ACPI_DESCRIPTION_HEADER *)(&Hob.Guid->Name + 1);\r
+ if (!AsciiStrnCmp ((CHAR8 *)&CurrentTable->Signature, "DSDT", 4)) {\r
+ DsdtTable = CurrentTable;\r
+ } else {\r
+ //\r
+ // Install the tables\r
+ //\r
+ Status = AcpiProtocol->InstallAcpiTable (\r
+ AcpiProtocol,\r
+ CurrentTable,\r
+ CurrentTable->Length,\r
+ &TableHandle\r
+ );\r
+ for (UINTN i = 0; i < CurrentTable->Length; i++) {\r
+ DEBUG ((DEBUG_INFO, " %x", *((UINT8 *)CurrentTable + i)));\r
+ }\r
+\r
+ DEBUG ((DEBUG_INFO, "\n"));\r
+ }\r
+\r
+ Hob.Raw = GET_NEXT_HOB (Hob.Raw);\r
+ Hob.Guid = (EFI_HOB_GUID_TYPE *)GetNextGuidHob (&gUefiOvmfPkgTdxAcpiHobGuid, Hob.Raw);\r
+ }\r
+\r
+ //\r
+ // Install DSDT table. If we reached this point without finding the DSDT,\r
+ // then we're out of sync with the hypervisor, and cannot continue.\r
+ //\r
+ if (DsdtTable == NULL) {\r
+ DEBUG ((DEBUG_INFO, "%a: no DSDT found\n", __FUNCTION__));\r
+ ASSERT (FALSE);\r
+ }\r
+\r
+ Status = AcpiProtocol->InstallAcpiTable (\r
+ AcpiProtocol,\r
+ DsdtTable,\r
+ DsdtTable->Length,\r
+ &TableHandle\r
+ );\r
+ if (EFI_ERROR (Status)) {\r
+ ASSERT_EFI_ERROR (Status);\r
+ return Status;\r
+ }\r
+\r
+ //\r
+ // Install a protocol to notify that the ACPI table provided by CH is\r
+ // ready.\r
+ //\r
+ gBS->InstallProtocolInterface (\r
+ &mChAcpiHandle,\r
+ &gQemuAcpiTableNotifyProtocolGuid,\r
+ EFI_NATIVE_INTERFACE,\r
+ &mChAcpiNotifyProtocol\r
+ );\r
+\r
+ return EFI_SUCCESS;\r
+}\r
+\r
// Get the ACPI tables from EBDA start\r
EFI_STATUS\r
EFIAPI\r
gConfidentialComputingSevSnpBlobGuid = {0x067b1f5f, 0xcf26, 0x44c5, {0x85, 0x54, 0x93, 0xd7, 0x77, 0x91, 0x2d, 0x42}}\r
gUefiOvmfPkgPlatformInfoGuid = {0xdec9b486, 0x1f16, 0x47c7, {0x8f, 0x68, 0xdf, 0x1a, 0x41, 0x88, 0x8b, 0xa5}}\r
gVMMBootOrderGuid = {0x668f4529, 0x63d0, 0x4bb5, {0xb6, 0x5d, 0x6f, 0xbb, 0x9d, 0x36, 0xa4, 0x4a}}\r
+ gUefiOvmfPkgTdxAcpiHobGuid = {0x6a0c5870, 0xd4ed, 0x44f4, {0xa1, 0x35, 0xdd, 0x23, 0x8b, 0x6f, 0x0c, 0x8d}}\r
\r
[Ppis]\r
# PPI whose presence in the PPI database signals that the TPM base address\r