OvmfPkg/AcpiPlatformDxe: Differentiate TDX case for Cloud Hypervisor

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.gao@intel.com>
Signed-off-by: Sebastien Boeuf <sebastien.boeuf@intel.com>
Reviewed-by: Min Xu <min.m.xu@intel.com>
Reviewed-by: Jiewen Yao <jiewen.yao@intel.com>
This commit is contained in:
Sebastien Boeuf
2022-12-15 23:10:04 +08:00
committed by mergify[bot]
parent 57162cb62d
commit e254c71e9e
6 changed files with 105 additions and 1 deletions

View File

@ -68,6 +68,7 @@
VirtNorFlashPlatformLib|ArmVirtPkg/Library/NorFlashQemuLib/NorFlashQemuLib.inf VirtNorFlashPlatformLib|ArmVirtPkg/Library/NorFlashQemuLib/NorFlashQemuLib.inf
CapsuleLib|MdeModulePkg/Library/DxeCapsuleLibNull/DxeCapsuleLibNull.inf CapsuleLib|MdeModulePkg/Library/DxeCapsuleLibNull/DxeCapsuleLibNull.inf
CcProbeLib|MdePkg/Library/CcProbeLibNull/CcProbeLibNull.inf
BootLogoLib|MdeModulePkg/Library/BootLogoLib/BootLogoLib.inf BootLogoLib|MdeModulePkg/Library/BootLogoLib/BootLogoLib.inf
PlatformBootManagerLib|ArmVirtPkg/Library/PlatformBootManagerLib/PlatformBootManagerLib.inf PlatformBootManagerLib|ArmVirtPkg/Library/PlatformBootManagerLib/PlatformBootManagerLib.inf
PlatformBmPrintScLib|OvmfPkg/Library/PlatformBmPrintScLib/PlatformBmPrintScLib.inf PlatformBmPrintScLib|OvmfPkg/Library/PlatformBmPrintScLib/PlatformBmPrintScLib.inf

View File

@ -9,6 +9,8 @@
#include <OvmfPlatforms.h> // CLOUDHV_DEVICE_ID #include <OvmfPlatforms.h> // CLOUDHV_DEVICE_ID
#include <Library/CcProbeLib.h> // CcProbe(), CcGuestTypeIntelTdx
#include "AcpiPlatform.h" #include "AcpiPlatform.h"
/** /**
@ -33,7 +35,11 @@ InstallAcpiTables (
HostBridgeDevId = PcdGet16 (PcdOvmfHostBridgePciDevId); HostBridgeDevId = PcdGet16 (PcdOvmfHostBridgePciDevId);
if (HostBridgeDevId == CLOUDHV_DEVICE_ID) { if (HostBridgeDevId == CLOUDHV_DEVICE_ID) {
if (CcProbe () == CcGuestTypeIntelTdx) {
Status = InstallCloudHvTablesTdx (AcpiTable);
} else {
Status = InstallCloudHvTables (AcpiTable); Status = InstallCloudHvTables (AcpiTable);
}
} else { } else {
Status = InstallQemuFwCfgTables (AcpiTable); Status = InstallQemuFwCfgTables (AcpiTable);
} }

View File

@ -19,6 +19,12 @@ typedef struct {
typedef struct S3_CONTEXT S3_CONTEXT; typedef struct S3_CONTEXT S3_CONTEXT;
EFI_STATUS
EFIAPI
InstallCloudHvTablesTdx (
IN EFI_ACPI_TABLE_PROTOCOL *AcpiProtocol
);
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
InstallCloudHvTables ( InstallCloudHvTables (

View File

@ -45,6 +45,8 @@
QemuFwCfgS3Lib QemuFwCfgS3Lib
UefiBootServicesTableLib UefiBootServicesTableLib
UefiDriverEntryPoint UefiDriverEntryPoint
HobLib
CcProbeLib
[Protocols] [Protocols]
gEfiAcpiTableProtocolGuid # PROTOCOL ALWAYS_CONSUMED gEfiAcpiTableProtocolGuid # PROTOCOL ALWAYS_CONSUMED
@ -53,6 +55,7 @@
[Guids] [Guids]
gRootBridgesConnectedEventGroupGuid gRootBridgesConnectedEventGroupGuid
gUefiOvmfPkgTdxAcpiHobGuid
[Pcd] [Pcd]
gEfiMdeModulePkgTokenSpaceGuid.PcdPciDisableBusEnumeration gEfiMdeModulePkgTokenSpaceGuid.PcdPciDisableBusEnumeration

View File

@ -7,14 +7,101 @@
**/ **/
#include <IndustryStandard/Acpi.h> // EFI_ACPI_DESCRIPTION_HEADER
#include <IndustryStandard/CloudHv.h> // CLOUDHV_RSDP_ADDRESS #include <IndustryStandard/CloudHv.h> // CLOUDHV_RSDP_ADDRESS
#include <IndustryStandard/Xen/arch-x86/hvm/start_info.h> // hvm_start_info #include <IndustryStandard/Xen/arch-x86/hvm/start_info.h> // hvm_start_info
#include <Library/BaseLib.h> // CpuDeadLoop() #include <Library/BaseLib.h> // CpuDeadLoop()
#include <Library/DebugLib.h> // DEBUG() #include <Library/DebugLib.h> // DEBUG()
#include <Library/PcdLib.h> // PcdGet32() #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" #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 // Get the ACPI tables from EBDA start
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI

View File

@ -151,6 +151,7 @@
gConfidentialComputingSevSnpBlobGuid = {0x067b1f5f, 0xcf26, 0x44c5, {0x85, 0x54, 0x93, 0xd7, 0x77, 0x91, 0x2d, 0x42}} gConfidentialComputingSevSnpBlobGuid = {0x067b1f5f, 0xcf26, 0x44c5, {0x85, 0x54, 0x93, 0xd7, 0x77, 0x91, 0x2d, 0x42}}
gUefiOvmfPkgPlatformInfoGuid = {0xdec9b486, 0x1f16, 0x47c7, {0x8f, 0x68, 0xdf, 0x1a, 0x41, 0x88, 0x8b, 0xa5}} gUefiOvmfPkgPlatformInfoGuid = {0xdec9b486, 0x1f16, 0x47c7, {0x8f, 0x68, 0xdf, 0x1a, 0x41, 0x88, 0x8b, 0xa5}}
gVMMBootOrderGuid = {0x668f4529, 0x63d0, 0x4bb5, {0xb6, 0x5d, 0x6f, 0xbb, 0x9d, 0x36, 0xa4, 0x4a}} 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] [Ppis]
# PPI whose presence in the PPI database signals that the TPM base address # PPI whose presence in the PPI database signals that the TPM base address