public inbox for devel@edk2.groups.io
 help / color / mirror / Atom feed
From: "Min Xu" <min.m.xu@intel.com>
To: devel@edk2.groups.io
Cc: Min Xu <min.m.xu@intel.com>,
	Ard Biesheuvel <ardb+tianocore@kernel.org>,
	Jordan Justen <jordan.l.justen@intel.com>,
	Brijesh Singh <brijesh.singh@amd.com>,
	Erdem Aktas <erdemaktas@google.com>,
	James Bottomley <jejb@linux.ibm.com>,
	Jiewen Yao <jiewen.yao@intel.com>,
	Tom Lendacky <thomas.lendacky@amd.com>,
	Gerd Hoffmann <kraxel@redhat.com>
Subject: [PATCH V11 38/47] OvmfPkg: Update PlatformInitLib for Tdx guest
Date: Mon, 28 Mar 2022 16:08:17 +0800	[thread overview]
Message-ID: <07f02403b7a6162cc584764dbe45b7cf3f119749.1648454441.git.min.m.xu@intel.com> (raw)
In-Reply-To: <cover.1648454440.git.min.m.xu@intel.com>

RFC: https://bugzilla.tianocore.org/show_bug.cgi?id=3429

There are below changes in PlatformInitLib for Tdx guest:

1. Publish ram regions
In Tdx guest, the system memory is passed in TdHob by host VMM. So
the major task of PlatformTdxPublishRamRegions is to walk thru the
TdHob list and transfer the ResourceDescriptorHob and MemoryAllocationHob
to the hobs in DXE phase.

2. Build MemoryAllocationHob for Tdx Mailbox and Ovmf work area.

3. Update of PlatformAddressWidthInitialization. The physical
address width that Tdx guest supports is either 48 or 52.

4. Update of PlatformMemMapInitialization.
0xA0000 - 0xFFFFF is VGA bios region.  Platform initialization marks the
region as MMIO region. Dxe code maps MMIO region as IO region.
As TDX guest, MMIO region is maps as shared.  However VGA BIOS doesn't need
to be shared.  Guest TDX Linux maps VGA BIOS as private and accesses for
BIOS and stuck on repeating EPT violation.  VGA BIOS (more generally ROM
region) should be private.  Skip marking VGA BIOA region [0xa000, 0xfffff]
as MMIO in HOB.

Cc: Ard Biesheuvel <ardb+tianocore@kernel.org>
Cc: Jordan Justen <jordan.l.justen@intel.com>
Cc: Brijesh Singh <brijesh.singh@amd.com>
Cc: Erdem Aktas <erdemaktas@google.com>
Cc: James Bottomley <jejb@linux.ibm.com>
Cc: Jiewen Yao <jiewen.yao@intel.com>
Cc: Tom Lendacky <thomas.lendacky@amd.com>
Cc: Gerd Hoffmann <kraxel@redhat.com>
Acked-by: Gerd Hoffmann <kraxel@redhat.com>
Signed-off-by: Min Xu <min.m.xu@intel.com>
---
 OvmfPkg/Include/Library/PlatformInitLib.h     | 14 ++++++
 OvmfPkg/Library/PlatformInitLib/IntelTdx.c    | 49 +++++++++++++++++++
 .../Library/PlatformInitLib/IntelTdxNull.c    | 16 ++++++
 OvmfPkg/Library/PlatformInitLib/MemDetect.c   | 14 ++++++
 OvmfPkg/Library/PlatformInitLib/Platform.c    |  4 +-
 5 files changed, 96 insertions(+), 1 deletion(-)

diff --git a/OvmfPkg/Include/Library/PlatformInitLib.h b/OvmfPkg/Include/Library/PlatformInitLib.h
index 6152a43d0da7..2987a367cc9c 100644
--- a/OvmfPkg/Include/Library/PlatformInitLib.h
+++ b/OvmfPkg/Include/Library/PlatformInitLib.h
@@ -220,4 +220,18 @@ ProcessTdxHobList (
   VOID
   );
 
+/**
+  In Tdx guest, the system memory is passed in TdHob by host VMM. So
+  the major task of PlatformTdxPublishRamRegions is to walk thru the
+  TdHob list and transfer the ResourceDescriptorHob and MemoryAllocationHob
+  to the hobs in DXE phase.
+
+  MemoryAllocationHob should also be created for Mailbox and Ovmf work area.
+**/
+VOID
+EFIAPI
+PlatformTdxPublishRamRegions (
+  VOID
+  );
+
 #endif // PLATFORM_INIT_LIB_H_
diff --git a/OvmfPkg/Library/PlatformInitLib/IntelTdx.c b/OvmfPkg/Library/PlatformInitLib/IntelTdx.c
index e9196b7ffaa7..c6d7c8bb6e0e 100644
--- a/OvmfPkg/Library/PlatformInitLib/IntelTdx.c
+++ b/OvmfPkg/Library/PlatformInitLib/IntelTdx.c
@@ -512,3 +512,52 @@ TransferTdxHobList (
     Hob.Raw = GET_NEXT_HOB (Hob);
   }
 }
+
+/**
+  In Tdx guest, the system memory is passed in TdHob by host VMM. So
+  the major task of PlatformTdxPublishRamRegions is to walk thru the
+  TdHob list and transfer the ResourceDescriptorHob and MemoryAllocationHob
+  to the hobs in DXE phase.
+
+  MemoryAllocationHob should also be created for Mailbox and Ovmf work area.
+**/
+VOID
+EFIAPI
+PlatformTdxPublishRamRegions (
+  VOID
+  )
+{
+  if (!TdIsEnabled ()) {
+    return;
+  }
+
+  TransferTdxHobList ();
+
+  //
+  // The memory region defined by PcdOvmfSecGhcbBackupBase is pre-allocated by
+  // host VMM and used as the td mailbox at the beginning of system boot.
+  //
+  BuildMemoryAllocationHob (
+    FixedPcdGet32 (PcdOvmfSecGhcbBackupBase),
+    FixedPcdGet32 (PcdOvmfSecGhcbBackupSize),
+    EfiACPIMemoryNVS
+    );
+
+  if (FixedPcdGet32 (PcdOvmfWorkAreaSize) != 0) {
+    //
+    // Reserve the work area.
+    //
+    // Since this memory range will be used by the Reset Vector on S3
+    // resume, it must be reserved as ACPI NVS.
+    //
+    // If S3 is unsupported, then various drivers might still write to the
+    // work area. We ought to prevent DXE from serving allocation requests
+    // such that they would overlap the work area.
+    //
+    BuildMemoryAllocationHob (
+      (EFI_PHYSICAL_ADDRESS)(UINTN)FixedPcdGet32 (PcdOvmfWorkAreaBase),
+      (UINT64)(UINTN)FixedPcdGet32 (PcdOvmfWorkAreaSize),
+      EfiBootServicesData
+      );
+  }
+}
diff --git a/OvmfPkg/Library/PlatformInitLib/IntelTdxNull.c b/OvmfPkg/Library/PlatformInitLib/IntelTdxNull.c
index af90e0866e89..3ebe582af8de 100644
--- a/OvmfPkg/Library/PlatformInitLib/IntelTdxNull.c
+++ b/OvmfPkg/Library/PlatformInitLib/IntelTdxNull.c
@@ -28,3 +28,19 @@ ProcessTdxHobList (
 {
   return EFI_UNSUPPORTED;
 }
+
+/**
+  In Tdx guest, the system memory is passed in TdHob by host VMM. So
+  the major task of PlatformTdxPublishRamRegions is to walk thru the
+  TdHob list and transfer the ResourceDescriptorHob and MemoryAllocationHob
+  to the hobs in DXE phase.
+
+  MemoryAllocationHob should also be created for Mailbox and Ovmf work area.
+**/
+VOID
+EFIAPI
+PlatformTdxPublishRamRegions (
+  VOID
+  )
+{
+}
diff --git a/OvmfPkg/Library/PlatformInitLib/MemDetect.c b/OvmfPkg/Library/PlatformInitLib/MemDetect.c
index 911c0906cb3d..4c1dedf863c3 100644
--- a/OvmfPkg/Library/PlatformInitLib/MemDetect.c
+++ b/OvmfPkg/Library/PlatformInitLib/MemDetect.c
@@ -37,6 +37,8 @@ Module Name:
 #include <Library/MtrrLib.h>
 #include <Library/QemuFwCfgLib.h>
 #include <Library/QemuFwCfgSimpleParserLib.h>
+#include <Library/TdxLib.h>
+
 #include <Library/PlatformInitLib.h>
 
 VOID
@@ -528,7 +530,19 @@ PlatformAddressWidthInitialization (
     PhysMemAddressWidth = 36;
   }
 
+ #if defined (MDE_CPU_X64)
+  if (TdIsEnabled ()) {
+    if (TdSharedPageMask () == (1ULL << 47)) {
+      PhysMemAddressWidth = 48;
+    } else {
+      PhysMemAddressWidth = 52;
+    }
+  }
+
+  ASSERT (PhysMemAddressWidth <= 52);
+ #else
   ASSERT (PhysMemAddressWidth <= 48);
+ #endif
 
   PlatformInfoHob->FirstNonAddress     = FirstNonAddress;
   PlatformInfoHob->PhysMemAddressWidth = PhysMemAddressWidth;
diff --git a/OvmfPkg/Library/PlatformInitLib/Platform.c b/OvmfPkg/Library/PlatformInitLib/Platform.c
index c4fa7d445394..101074f6100d 100644
--- a/OvmfPkg/Library/PlatformInitLib/Platform.c
+++ b/OvmfPkg/Library/PlatformInitLib/Platform.c
@@ -136,7 +136,9 @@ PlatformMemMapInitialization (
   //
   // Video memory + Legacy BIOS region
   //
-  PlatformAddIoMemoryRangeHob (0x0A0000, BASE_1MB);
+  if (!TdIsEnabled ()) {
+    PlatformAddIoMemoryRangeHob (0x0A0000, BASE_1MB);
+  }
 
   if (PlatformInfoHob->HostBridgeDevId == 0xffff /* microvm */) {
     PlatformAddIoMemoryBaseSizeHob (MICROVM_GED_MMIO_BASE, SIZE_4KB);
-- 
2.29.2.windows.2


  parent reply	other threads:[~2022-03-28  8:10 UTC|newest]

Thread overview: 41+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-03-28  8:07 [PATCH V11 00/47] Enable Intel TDX in OvmfPkg (Config-A) Min Xu
2022-03-28  8:07 ` [PATCH V11 01/47] MdePkg: Add Tdx.h Min Xu
2022-03-28  8:07 ` [PATCH V11 02/47] MdePkg: Update Cpuid.h for Tdx Min Xu
2022-03-28  8:07 ` [PATCH V11 03/47] MdePkg: Introduce basic Tdx functions in BaseLib Min Xu
2022-03-28  8:07 ` [PATCH V11 04/47] MdePkg: Add TdxLib to wrap Tdx operations Min Xu
2022-03-28  8:07 ` [PATCH V11 05/47] UefiCpuPkg: Extend VmgExitLibNull to handle #VE exception Min Xu
2022-03-28  8:07 ` [PATCH V11 06/47] OvmfPkg: Extend VmgExitLib " Min Xu
2022-03-28  8:07 ` [PATCH V11 07/47] UefiCpuPkg/CpuExceptionHandler: Add base support for the " Min Xu
2022-03-28  8:07 ` [PATCH V11 08/47] MdePkg: Add helper functions for Tdx guest in BaseIoLibIntrinsic Min Xu
2022-03-28  8:07 ` [PATCH V11 09/47] MdePkg: Support mmio " Min Xu
2022-03-28  8:07 ` [PATCH V11 10/47] MdePkg: Support IoFifo " Min Xu
2022-03-28  8:07 ` [PATCH V11 11/47] MdePkg: Support IoRead/IoWrite " Min Xu
2022-03-28  8:07 ` [PATCH V11 12/47] UefiCpuPkg: Support TDX in BaseXApicX2ApicLib Min Xu
2022-03-28  8:07 ` [PATCH V11 13/47] MdePkg: Add macro to check SEV / TDX guest Min Xu
2022-03-28  8:07 ` [PATCH V11 14/47] UefiCpuPkg: Enable Tdx support in MpInitLib Min Xu
2022-03-28  8:24   ` Ni, Ray
2022-03-29 12:03     ` Min Xu
2022-03-28  8:07 ` [PATCH V11 15/47] OvmfPkg: Add IntelTdx.h in OvmfPkg/Include/IndustryStandard Min Xu
2022-03-28  8:07 ` [PATCH V11 16/47] OvmfPkg: Add TdxMailboxLib Min Xu
2022-03-28  8:07 ` [PATCH V11 17/47] OvmfPkg: Create initial version of PlatformInitLib Min Xu
2022-03-28  8:07 ` [PATCH V11 18/47] OvmfPkg/PlatformInitLib: Add hob functions Min Xu
2022-03-28  8:07 ` [PATCH V11 19/47] OvmfPkg/PlatformPei: Move global variables to PlatformInfoHob Min Xu
2022-03-28  8:07 ` [PATCH V11 20/47] OvmfPkg/PlatformPei: Refactor MiscInitialization Min Xu
2022-03-28  8:08 ` [PATCH V11 21/47] OvmfPkg/PlatformPei: Refactor MiscInitialization for CloudHV Min Xu
2022-03-28  8:08 ` [PATCH V11 22/47] OvmfPkg/PlatformPei: Refactor AddressWidthInitialization Min Xu
2022-03-28  8:08 ` [PATCH V11 23/47] OvmfPkg/PlatformPei: Refactor MaxCpuCountInitialization Min Xu
2022-03-28  8:08 ` [PATCH V11 24/47] OvmfPkg/PlatformPei: Refactor QemuUc32BaseInitialization Min Xu
2022-03-28  8:08 ` [PATCH V11 25/47] OvmfPkg/PlatformPei: Refactor InitializeRamRegions Min Xu
2022-03-28  8:08 ` [PATCH V11 26/47] OvmfPkg/PlatformPei: Refactor MemMapInitialization Min Xu
2022-03-28  8:08 ` [PATCH V11 27/47] OvmfPkg/PlatformPei: Refactor NoexecDxeInitialization Min Xu
2022-03-28  8:08 ` [PATCH V11 28/47] OvmfPkg/PlatformPei: Refactor MiscInitialization Min Xu
2022-03-28  8:08 ` [PATCH V11 30/47] OvmfPkg/PlatformInitLib: Move functions to Platform.c Min Xu
2022-03-28  8:08 ` [PATCH V11 31/47] OvmfPkg: Update PlatformInitLib to process Tdx hoblist Min Xu
2022-03-28  8:08 ` [PATCH V11 32/47] OvmfPkg/Sec: Declare local variable as volatile in SecCoreStartupWithStack Min Xu
2022-03-28  8:08 ` [PATCH V11 33/47] OvmfPkg: Update Sec to support Tdx Min Xu
2022-03-28  8:08 ` [PATCH V11 34/47] OvmfPkg: Check Tdx in QemuFwCfgPei to avoid DMA operation Min Xu
2022-03-28  8:08 ` [PATCH V11 35/47] MdeModulePkg: Skip setting IA32_ERER.NXE if it has already been set Min Xu
2022-03-28  8:08 ` [PATCH V11 36/47] MdeModulePkg: Add PcdTdxSharedBitMask Min Xu
2022-03-28  8:08 ` [PATCH V11 37/47] UefiCpuPkg: Update AddressEncMask in CpuPageTable Min Xu
2022-03-28  8:08 ` Min Xu [this message]
2022-03-28  8:08 ` [PATCH V11 39/47] OvmfPkg: Update PlatformPei to support Tdx guest Min Xu

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-list from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=07f02403b7a6162cc584764dbe45b7cf3f119749.1648454441.git.min.m.xu@intel.com \
    --to=devel@edk2.groups.io \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox