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]
-=-=-=-=-=-=-=-=-=-=-=-


Reply via email to