summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--ArmVirtPkg/ArmVirtQemu.dsc1
-rw-r--r--OvmfPkg/AcpiPlatformDxe/AcpiPlatform.c8
-rw-r--r--OvmfPkg/AcpiPlatformDxe/AcpiPlatform.h6
-rw-r--r--OvmfPkg/AcpiPlatformDxe/AcpiPlatformDxe.inf3
-rw-r--r--OvmfPkg/AcpiPlatformDxe/CloudHvAcpi.c87
-rw-r--r--OvmfPkg/OvmfPkg.dec1
6 files changed, 105 insertions, 1 deletions
diff --git a/ArmVirtPkg/ArmVirtQemu.dsc b/ArmVirtPkg/ArmVirtQemu.dsc
index f77443229e..1dea715e9e 100644
--- a/ArmVirtPkg/ArmVirtQemu.dsc
+++ b/ArmVirtPkg/ArmVirtQemu.dsc
@@ -68,6 +68,7 @@
VirtNorFlashPlatformLib|ArmVirtPkg/Library/NorFlashQemuLib/NorFlashQemuLib.inf
CapsuleLib|MdeModulePkg/Library/DxeCapsuleLibNull/DxeCapsuleLibNull.inf
+ CcProbeLib|MdePkg/Library/CcProbeLibNull/CcProbeLibNull.inf
BootLogoLib|MdeModulePkg/Library/BootLogoLib/BootLogoLib.inf
PlatformBootManagerLib|ArmVirtPkg/Library/PlatformBootManagerLib/PlatformBootManagerLib.inf
PlatformBmPrintScLib|OvmfPkg/Library/PlatformBmPrintScLib/PlatformBmPrintScLib.inf
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
@@ -21,6 +21,12 @@ typedef struct S3_CONTEXT S3_CONTEXT;
EFI_STATUS
EFIAPI
+InstallCloudHvTablesTdx (
+ IN EFI_ACPI_TABLE_PROTOCOL *AcpiProtocol
+ );
+
+EFI_STATUS
+EFIAPI
InstallCloudHvTables (
IN EFI_ACPI_TABLE_PROTOCOL *AcpiProtocol
);
diff --git a/OvmfPkg/AcpiPlatformDxe/AcpiPlatformDxe.inf b/OvmfPkg/AcpiPlatformDxe/AcpiPlatformDxe.inf
index 09daf30bcd..1647a90add 100644
--- a/OvmfPkg/AcpiPlatformDxe/AcpiPlatformDxe.inf
+++ b/OvmfPkg/AcpiPlatformDxe/AcpiPlatformDxe.inf
@@ -45,6 +45,8 @@
QemuFwCfgS3Lib
UefiBootServicesTableLib
UefiDriverEntryPoint
+ HobLib
+ CcProbeLib
[Protocols]
gEfiAcpiTableProtocolGuid # PROTOCOL ALWAYS_CONSUMED
@@ -53,6 +55,7 @@
[Guids]
gRootBridgesConnectedEventGroupGuid
+ gUefiOvmfPkgTdxAcpiHobGuid
[Pcd]
gEfiMdeModulePkgTokenSpaceGuid.PcdPciDisableBusEnumeration
diff --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
EFIAPI
diff --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