[PATCH V12 00/47] Enable Intel TDX in OvmfPkg (Config-A)


Min Xu
 

REF: https://bugzilla.tianocore.org/show_bug.cgi?id=3249

Intel's Trust Domain Extensions (Intel TDX) refers to an Intel technology
that extends Virtual Machines Extensions (VMX) and Multi-Key Total Memory
Encryption (MKTME) with a new kind of virutal machines guest called a
Trust Domain (TD). A TD is desinged to run in a CPU mode that protects the
confidentiality of TD memory contents and the TD's CPU state from other
software, including the hosting Virtual-Machine Monitor (VMM), unless
explicitly shared by the TD itself.

There are 2 configurations for TDVF to upstream. See below link for
the definitions of the 2 configurations.
https://edk2.groups.io/g/devel/message/76367

This patch-set is to enable Config-A in OvmfPkg.
- Merge the *basic* TDVF feature to existing OvmfX64Pkg.dsc. (Align
with existing SEV)
- Threat model: VMM is NOT out of TCB. (We don’t make things worse.)
- The OvmfX64Pkg.dsc includes SEV/TDX/normal OVMF basic boot capability.
The final binary can run on SEV/TDX/normal OVMF
- No changes to existing OvmfPkgX64 image layout.
- No need to add additional security features if they do not exist today
- No need to remove features if they exist today.
- RTMR is not supported
- PEI phase is NOT skipped in either Td or Non-Td

Patch 01 - 33 are changes in SEC phase. Also some libraries in these
patches are workable in SEC/PEI/DXE.

Patch 16 - 29 extract the common codes from OvmfPkg/PlatformPei to a new
PlatformInitLib. After that OvmfPkg/PlatformPei is refactored with this
lib. These 14 patches are currently reviewed in another separate
patch-set. https://edk2.groups.io/g/devel/message/87327

Patch 34 - 39 are changes in PEI phase.

Patch 40 - 44 are changes in DXE phase.

Patch 45 - 47 are for local Apic timer DXE driver.

[TDX]: https://software.intel.com/content/dam/develop/external/us/en/
documents/tdx-whitepaper-final9-17.pdf

[TDX-Module]: https://software.intel.com/content/dam/develop/external/
us/en/documents/tdx-module-1.0-public-spec-v0.931.pdf

[TDVF]: https://software.intel.com/content/dam/develop/external/us/en/
documents/tdx-virtual-firmware-design-guide-rev-1.pdf

[GCHI]: https://software.intel.com/content/dam/develop/external/us/en/
documents/intel-tdx-guest-hypervisor-communication-interface-1.0-344426-002.pdf

Code is at https://github.com/mxu9/edk2/tree/tdvf_wave2.v12

v12 changes:
- Update MpInitLib based on the review feedbacks. Please see
https://edk2.groups.io/g/devel/message/88173.
- Update the code base to 2b4b8013fe45.

v11 changes:
- Update MpInitlib based on the review comments. Please see
https://edk2.groups.io/g/devel/message/88089
- Update the code base to 3ef2071927fa.

v10 changes:
- Update MpInitLib based on the review comments. Please see the
discussion: https://edk2.groups.io/g/devel/message/87902
- Update the code base to ec0b54849b23.

v9 changes:
- Move the definition of EFI_RESOURCE_MEMORY_UNACCEPTED from MdePkg
to OvmfPkg as in internal implementation. Because it has not been
added in PI spec. After the definition is added in PI spec, it can
be moved to MdePkg.
- Add definition of new CPUID leaf 0x21 in
MdePkg/Include/Register/Intel/Cpuid.h.
- Use switch-case to hanle VC/VE handling together in
CpuExceptionHandlerLib.
- Refactor changes for Tdx guest in MpInitLib.
- Refine the comments in BaseLib and PlatformInitLib.
- Other minor updates and changes.

v8 changes:
- Based on the comments of PlatformInitLib and OvmfPkg/PlatformPei,
a separte patch-set is created for the changes. It is now under review
https://edk2.groups.io/g/devel/message/87327
- Based on the comments, TdCall/TdVmCall/TdIsEnabled is wrapped with
MDE_CPU_IA32 and MDE_CPU_X64.
- EFI_RESOURCE_ATTRIBUTE_ENCRYPTED is removed based on the TDVF Spec
update. Instead EFI_RESOURCE_MEMORY_UNACCEPTED is added to indicate
the memory which to be accepted in TDVF. The corresponding logic
of AcceptMemory is updated as well. Please see Patch 31.
- PcdIa32EferChangeAllowed is deleted. Because for Td guest
IA32_EFER.NXE is set by default. So we only need check whether it has
been set before it is to be set again. See Patch 35.
- Based on comments PcdTdxSharedBitMask is defined in
[PcdsFixedAtBuild, PcdsPatchableInModule, PcdsDynamic, PcdsDynamicEx]
- Delete un-necessary header files in TdxLib.h.
- Other minor updates and changes.

v7 changes:
- Based on the comments from last review, 8 PlatformInitLib patches
are squashed into 4 patches (#17-#20). These 4 patches are not
related to Tdx guest. Tdx related codes of PlatformInitLib is
in #21.
- gUefiOvmfPkgTdxPlatformGuid is renamed as gUefiOvmfPkgPlatformInfoGuid.
Because this GUID is used not only by Tdx guest, but also by
Legacy guest.
- PlatformInitLibNull is deleted.
- In PlatformPei Pml4Entries is cap at 512 entries when
mPhysMemAddressWidth > 48.

v7 not-addressed comments
- Comments in MpInitLib have not been addressed yet. It will be
addressed in the following version.
- Thanks much for your understanding.

v6 changes:
- PlatformInitLib and OvmfPkg/PlatformPei refactoring are covered in
patch from 17 - 24. These patches are not related to Tdx guest. Tdx
related codes of PlatformInitLib is in patch 25.
- In the previous patch-sets, TdHob is processed in
OvmfPkg/Sec/IntelTdx.c. Per Gerd's suggestion they are now moved
to PlatformInitLib/IntelTdx.c. So that they can be reused in Config-B.
- The default Accept page size is changed from 4K to 2M.
- The BspAcceptMemoryResourceRange is refactored according to Gerd's
comment.
- In ApRunLoop.nasm command field is set to zero as acknowledgement.
This is a fix based on the ACPI Spec v6.4,Sec titled "Multiprocessor
Wakeup Structure".

v6 not-addressed comments
- Comments in MpInitLib have not been addressed yet. It will be
addressed in the following version.
- Thanks much for your understanding.

v5 changes:
- PlatformInitLib is introduced which wraps the common functions in
OvmfPkg/PlatformPei. It is because there are a lot of duplicated
codes for Platform initialization in PEI phase and there are at least
3 variants of PlatformPei. Another reason is that in TDVF Config-B
PEI-less boot needs the similar initiliazation as PlatformPei. Based
on the discussion with the community, PlatformInitLib is introduced.
As the first stage OvmfPkg/PlatformPei is refactored with this lib.
In the future the other 2 PlatformPei variants will be refactored
as well.
- PcdIgnoreVeHalt is deprecated.
- Add spec link for Mailbox.
- Other minor changes, such as comments, uncrustify formats, etc.

v5 not-addressed comments
- Comments in MpInitLib have not been addressed yet. It will be
addressed in the following version.
- Some comments may be missed. I will re-visit the review emails.
- Thanks much for your understanding.

v4 changes:
- Split the TdxLib into 2 libraries. The TDX basic functions
(TdCall / TdVmCall / TdIsEnabled) are moved to BaseLib (#2).
The other functions are in TdxLib. (#3)
- Based on above changes (TdCall/TdVmCall/TdIsEnabled in BaseLib)
the TdxLib.inf is not necessary in some Pkgs, such as
UefiPayloadPkg. The duplicated source code are deleted (BaseIoLib
is the sample).
- Drop the Accepting pages with TDX MP service. Instead only BSP
accepts pages. There maybe boot performance issue. There are some
mitigations to it, such as 2M accept page size, lazy accept, etc.
We will re-visit this issue in a separate patch-set.
- Relocate Mailbox in TdxDxe driver instead of in PlatformPei. This
is to keep consistence with Config-B (PEI is skipped in Config-B).
- SetMmioSharedBit in TdxDxe driver instead of in DxeIplPeim after
CreateIdentityMappingPageTables. This is to keep consistence with
Config-B (PEI is skipped in Config-B).
- Some other minor changes, such as switch-case indention.
- Rebase the code base (commit: 8c06c53b585a) and update the code with
uncrustify.

v4 not-addressed comments:
- Comments in MpInitLib have not been addressed yet. It will be
addressed in the next version.
- BaseMemEncryptTdxLib is suggested to be merged with
BaseMemEncryptSevLib. It will be addressed in the next version.
- Gerd suggests a generic page table walker which is able to set
and clear bits for a given memory range in both SEV and TDX guest.
This suggestion will be addressed in the next version.
- Some comments may be missed. I will re-visit the review emails.
- Thanks much for your understanding.

v3 changes:
- LocalApicTimerDxe is split out to be a separate patch-series.
- VmTdExitLibNull/VmgExitLib are removed. Instead the VmgExitLib
is extended to handle #VE exception. (Patch 3-5)
- Split the Tdx support of base IoLib into 4 commits. (Patch 6-9)
- Alter of MADT table is updated. In previous version it was
created from scratch. Now it gets the installed table, copy
it to a larger buffer and append the ACPI_MADT_MPWK to it.
(Patch 25)
- Changes in BaseXApicX2ApicLib is refined based on the
feedbacks. (Add spec link of MSR access definition, rename
some funtion name, etc.) (Patch 11)
- Use PcdConfidentialComputingGuestAttr to probe TDX guest instead
of CPUID. But in some cases PcdConfidentialComputingGuestAttr
cannot be used because it has not been set yet.
- Some other minor changes.

v3 not-addressed comments:
- Some of the comments have not been addressed. This is because I
need more time to consider how to address these comments.
At the same time I want to submit a new version based on the above
changes so that community can review in a more efficient way.
(v2 is the version one month ago).
- Comments in MpInitLib have not been addressed yet. It will be
addressed in v4.
- BaseMemEncryptTdxLib should be merged with BaseMemEncryptSevLib.
It will be addressed in v4.
- Some comments may be missed. I will re-visit the review emails.
- Thanks much for your understanding.

v2 changes:
- Remove TdxProbeLib. It is to reduce the depencies of the lib.
- In v1 a new function (AllocatePagesWithMemoryType) is added in
PeiMemoryAllocationLib. This function is not necessary. It can
be replaced by PeiServicesAllocatePages.
- IoLibFifo.c is added in BaseIoLibIntrinsic. This file includes
the functions of read/write of I/O port fifo. These functions
will call TdIoReadFifo or SevIoReadFifo by checking TDX or SEV
in run-time.
- DXE related patches are added. (Patch 22-28)
- Fix typo in commit/comment message, or some minor changes.
- Rebase the edk2 code base. (4cc1458dbe00)

Cc: Brijesh Singh <brijesh.singh@...>
Cc: Eric Dong <eric.dong@...>
Cc: Erdem Aktas <erdemaktas@...>
Cc: Hao A Wu <hao.a.wu@...>
Cc: Jian J Wang <jian.j.wang@...>
Cc: James Bottomley <jejb@...>
Cc: Jiewen Yao <jiewen.yao@...>
Cc: Liming Gao <gaoliming@...>
Cc: Michael D Kinney <michael.d.kinney@...>
Cc: Ray Ni <ray.ni@...>
Cc: Rahul Kumar <rahul1.kumar@...>
Cc: Tom Lendacky <thomas.lendacky@...>
Cc: Zhiguang Liu <zhiguang.liu@...>
Cc: Gerd Hoffmann <kraxel@...>
Signed-off-by: Min Xu <min.m.xu@...>

Min Xu (47):
MdePkg: Add Tdx.h
MdePkg: Update Cpuid.h for Tdx
MdePkg: Introduce basic Tdx functions in BaseLib
MdePkg: Add TdxLib to wrap Tdx operations
UefiCpuPkg: Extend VmgExitLibNull to handle #VE exception
OvmfPkg: Extend VmgExitLib to handle #VE exception
UefiCpuPkg/CpuExceptionHandler: Add base support for the #VE exception
MdePkg: Add helper functions for Tdx guest in BaseIoLibIntrinsic
MdePkg: Support mmio for Tdx guest in BaseIoLibIntrinsic
MdePkg: Support IoFifo for Tdx guest in BaseIoLibIntrinsic
MdePkg: Support IoRead/IoWrite for Tdx guest in BaseIoLibIntrinsic
UefiCpuPkg: Support TDX in BaseXApicX2ApicLib
MdePkg: Add macro to check SEV / TDX guest
UefiCpuPkg: Enable Tdx support in MpInitLib
OvmfPkg: Add IntelTdx.h in OvmfPkg/Include/IndustryStandard
OvmfPkg: Add TdxMailboxLib
OvmfPkg: Create initial version of PlatformInitLib
OvmfPkg/PlatformInitLib: Add hob functions
OvmfPkg/PlatformPei: Move global variables to PlatformInfoHob
OvmfPkg/PlatformPei: Refactor MiscInitialization
OvmfPkg/PlatformPei: Refactor MiscInitialization for CloudHV
OvmfPkg/PlatformPei: Refactor AddressWidthInitialization
OvmfPkg/PlatformPei: Refactor MaxCpuCountInitialization
OvmfPkg/PlatformPei: Refactor QemuUc32BaseInitialization
OvmfPkg/PlatformPei: Refactor InitializeRamRegions
OvmfPkg/PlatformPei: Refactor MemMapInitialization
OvmfPkg/PlatformPei: Refactor NoexecDxeInitialization
OvmfPkg/PlatformPei: Refactor MiscInitialization
OvmfPkg/PlatformInitLib: Create MemDetect.c
OvmfPkg/PlatformInitLib: Move functions to Platform.c
OvmfPkg: Update PlatformInitLib to process Tdx hoblist
OvmfPkg/Sec: Declare local variable as volatile in
SecCoreStartupWithStack
OvmfPkg: Update Sec to support Tdx
OvmfPkg: Check Tdx in QemuFwCfgPei to avoid DMA operation
MdeModulePkg: Skip setting IA32_ERER.NXE if it has already been set
MdeModulePkg: Add PcdTdxSharedBitMask
UefiCpuPkg: Update AddressEncMask in CpuPageTable
OvmfPkg: Update PlatformInitLib for Tdx guest
OvmfPkg: Update PlatformPei to support Tdx guest
OvmfPkg: Update AcpiPlatformDxe to alter MADT table
OvmfPkg/BaseMemEncryptTdxLib: Add TDX helper library
OvmfPkg: Add TdxDxe driver
OvmfPkg/QemuFwCfgLib: Support Tdx in QemuFwCfgDxe
OvmfPkg: Update IoMmuDxe to support TDX
OvmfPkg: Rename XenTimerDxe to LocalApicTimerDxe
UefiCpuPkg: Setting initial-count register as the last step
OvmfPkg: Switch timer in build time for OvmfPkg

.../Core/DxeIplPeim/X64/VirtualMemory.c | 8 +-
MdeModulePkg/MdeModulePkg.dec | 4 +
.../Include/ConfidentialComputingGuestAttr.h | 3 +
MdePkg/Include/IndustryStandard/Tdx.h | 203 ++++
MdePkg/Include/Library/BaseLib.h | 66 ++
MdePkg/Include/Library/TdxLib.h | 92 ++
MdePkg/Include/Register/Intel/Cpuid.h | 35 +-
.../BaseIoLibIntrinsic/BaseIoLibIntrinsic.inf | 2 +
.../BaseIoLibIntrinsicSev.inf | 7 +
MdePkg/Library/BaseIoLibIntrinsic/IoLib.c | 81 +-
MdePkg/Library/BaseIoLibIntrinsic/IoLibFifo.c | 217 ++++
MdePkg/Library/BaseIoLibIntrinsic/IoLibGcc.c | 51 +-
.../BaseIoLibIntrinsic/IoLibInternalTdx.c | 674 +++++++++++++
.../BaseIoLibIntrinsic/IoLibInternalTdxNull.c | 497 +++++++++
MdePkg/Library/BaseIoLibIntrinsic/IoLibMsc.c | 73 +-
MdePkg/Library/BaseIoLibIntrinsic/IoLibSev.h | 166 +++
MdePkg/Library/BaseIoLibIntrinsic/IoLibTdx.h | 410 ++++++++
.../BaseIoLibIntrinsic/X64/IoFifoSev.nasm | 34 +-
MdePkg/Library/BaseLib/BaseLib.inf | 4 +
MdePkg/Library/BaseLib/IntelTdxNull.c | 83 ++
MdePkg/Library/BaseLib/X64/TdCall.nasm | 85 ++
MdePkg/Library/BaseLib/X64/TdProbe.c | 63 ++
MdePkg/Library/BaseLib/X64/TdVmcall.nasm | 145 +++
MdePkg/Library/TdxLib/AcceptPages.c | 181 ++++
MdePkg/Library/TdxLib/Rtmr.c | 84 ++
MdePkg/Library/TdxLib/TdInfo.c | 115 +++
MdePkg/Library/TdxLib/TdxLib.inf | 37 +
MdePkg/Library/TdxLib/TdxLibNull.c | 106 ++
MdePkg/MdePkg.dec | 3 +
MdePkg/MdePkg.dsc | 1 +
OvmfPkg/AcpiPlatformDxe/AcpiPlatformDxe.inf | 1 +
OvmfPkg/AcpiPlatformDxe/QemuFwCfgAcpi.c | 14 +-
OvmfPkg/AmdSev/AmdSevX64.dsc | 11 +-
OvmfPkg/AmdSev/AmdSevX64.fdf | 3 +-
OvmfPkg/Bhyve/BhyveX64.dsc | 5 +
OvmfPkg/CloudHv/CloudHvX64.dsc | 8 +-
OvmfPkg/CloudHv/CloudHvX64.fdf | 2 +-
OvmfPkg/Include/IndustryStandard/IntelTdx.h | 67 ++
OvmfPkg/Include/Library/MemEncryptTdxLib.h | 81 ++
OvmfPkg/Include/Library/PlatformInitLib.h | 237 +++++
OvmfPkg/Include/Library/TdxMailboxLib.h | 76 ++
.../Include/Protocol/QemuAcpiTableNotify.h | 27 +
OvmfPkg/Include/TdxCommondefs.inc | 51 +
OvmfPkg/IoMmuDxe/AmdSevIoMmu.c | 103 +-
OvmfPkg/IoMmuDxe/AmdSevIoMmu.h | 6 +-
OvmfPkg/IoMmuDxe/IoMmuDxe.c | 6 +-
OvmfPkg/IoMmuDxe/IoMmuDxe.inf | 5 +
.../BaseMemEncryptTdxLib.inf | 44 +
.../BaseMemEncryptTdxLibNull.inf | 35 +
.../BaseMemoryEncryptionNull.c | 90 ++
.../BaseMemEncryptTdxLib/MemoryEncryption.c | 948 ++++++++++++++++++
.../BaseMemEncryptTdxLib/VirtualMemory.h | 181 ++++
.../PlatformInitLib}/Cmos.c | 32 +-
OvmfPkg/Library/PlatformInitLib/IntelTdx.c | 563 +++++++++++
.../Library/PlatformInitLib/IntelTdxNull.c | 46 +
OvmfPkg/Library/PlatformInitLib/MemDetect.c | 856 ++++++++++++++++
OvmfPkg/Library/PlatformInitLib/Platform.c | 573 +++++++++++
.../PlatformInitLib/PlatformInitLib.inf | 98 ++
OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgDxe.c | 9 +-
.../Library/QemuFwCfgLib/QemuFwCfgDxeLib.inf | 1 +
.../QemuFwCfgLib/QemuFwCfgLibInternal.h | 11 +
OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgPei.c | 32 +
.../Library/QemuFwCfgLib/QemuFwCfgPeiLib.inf | 2 +
OvmfPkg/Library/TdxMailboxLib/TdxMailbox.c | 141 +++
.../Library/TdxMailboxLib/TdxMailboxLib.inf | 52 +
.../Library/TdxMailboxLib/TdxMailboxNull.c | 85 ++
OvmfPkg/Library/VmgExitLib/SecVmgExitLib.inf | 3 +-
OvmfPkg/Library/VmgExitLib/VmTdExitHandler.h | 32 +
.../Library/VmgExitLib/VmTdExitVeHandler.c | 559 +++++++++++
OvmfPkg/Library/VmgExitLib/VmgExitLib.inf | 2 +
.../Library/VmgExitLib/X64/TdVmcallCpuid.nasm | 146 +++
.../LocalApicTimerDxe.c} | 4 +-
.../LocalApicTimerDxe.h} | 4 +-
.../LocalApicTimerDxe.inf} | 7 +-
OvmfPkg/Microvm/MicrovmX64.dsc | 8 +-
OvmfPkg/Microvm/MicrovmX64.fdf | 2 +-
OvmfPkg/OvmfPkg.dec | 17 +
OvmfPkg/OvmfPkgIa32.dsc | 15 +-
OvmfPkg/OvmfPkgIa32.fdf | 8 +-
OvmfPkg/OvmfPkgIa32X64.dsc | 15 +-
OvmfPkg/OvmfPkgIa32X64.fdf | 8 +-
OvmfPkg/OvmfPkgX64.dsc | 32 +-
OvmfPkg/OvmfPkgX64.fdf | 11 +-
OvmfPkg/OvmfXen.dsc | 7 +-
OvmfPkg/OvmfXen.fdf | 2 +-
OvmfPkg/PlatformPei/AmdSev.c | 8 +-
OvmfPkg/PlatformPei/Cmos.h | 48 -
OvmfPkg/PlatformPei/FeatureControl.c | 7 +-
OvmfPkg/PlatformPei/Fv.c | 4 +-
OvmfPkg/PlatformPei/IntelTdx.c | 51 +
OvmfPkg/PlatformPei/MemDetect.c | 889 ++--------------
OvmfPkg/PlatformPei/MemTypeInfo.c | 2 +-
OvmfPkg/PlatformPei/Platform.c | 631 ++----------
OvmfPkg/PlatformPei/Platform.h | 97 +-
OvmfPkg/PlatformPei/PlatformPei.inf | 6 +-
OvmfPkg/Sec/SecMain.c | 44 +-
OvmfPkg/Sec/SecMain.inf | 3 +
OvmfPkg/Sec/X64/SecEntry.nasm | 82 ++
OvmfPkg/TdxDxe/TdxAcpiTable.c | 213 ++++
OvmfPkg/TdxDxe/TdxAcpiTable.h | 60 ++
OvmfPkg/TdxDxe/TdxDxe.c | 261 +++++
OvmfPkg/TdxDxe/TdxDxe.inf | 64 ++
OvmfPkg/TdxDxe/X64/ApRunLoop.nasm | 90 ++
UefiCpuPkg/CpuDxe/CpuDxe.inf | 1 +
UefiCpuPkg/CpuDxe/CpuPageTable.c | 3 +
UefiCpuPkg/Include/Library/VmgExitLib.h | 28 +
.../BaseXApicX2ApicLib/BaseXApicX2ApicLib.c | 170 +++-
.../PeiDxeSmmCpuException.c | 53 +-
.../SecPeiCpuException.c | 57 +-
UefiCpuPkg/Library/MpInitLib/DxeMpInitLib.inf | 3 +
UefiCpuPkg/Library/MpInitLib/MpIntelTdx.h | 69 ++
UefiCpuPkg/Library/MpInitLib/MpLib.c | 63 +-
UefiCpuPkg/Library/MpInitLib/MpLibTdx.c | 106 ++
UefiCpuPkg/Library/MpInitLib/MpLibTdxNull.c | 69 ++
UefiCpuPkg/Library/MpInitLib/PeiMpInitLib.inf | 3 +
.../Library/VmgExitLibNull/VmTdExitNull.c | 38 +
.../Library/VmgExitLibNull/VmgExitLibNull.inf | 1 +
117 files changed, 10472 insertions(+), 1666 deletions(-)
create mode 100644 MdePkg/Include/IndustryStandard/Tdx.h
create mode 100644 MdePkg/Include/Library/TdxLib.h
create mode 100644 MdePkg/Library/BaseIoLibIntrinsic/IoLibFifo.c
create mode 100644 MdePkg/Library/BaseIoLibIntrinsic/IoLibInternalTdx.c
create mode 100644 MdePkg/Library/BaseIoLibIntrinsic/IoLibInternalTdxNull.c
create mode 100644 MdePkg/Library/BaseIoLibIntrinsic/IoLibSev.h
create mode 100644 MdePkg/Library/BaseIoLibIntrinsic/IoLibTdx.h
create mode 100644 MdePkg/Library/BaseLib/IntelTdxNull.c
create mode 100644 MdePkg/Library/BaseLib/X64/TdCall.nasm
create mode 100644 MdePkg/Library/BaseLib/X64/TdProbe.c
create mode 100644 MdePkg/Library/BaseLib/X64/TdVmcall.nasm
create mode 100644 MdePkg/Library/TdxLib/AcceptPages.c
create mode 100644 MdePkg/Library/TdxLib/Rtmr.c
create mode 100644 MdePkg/Library/TdxLib/TdInfo.c
create mode 100644 MdePkg/Library/TdxLib/TdxLib.inf
create mode 100644 MdePkg/Library/TdxLib/TdxLibNull.c
create mode 100644 OvmfPkg/Include/IndustryStandard/IntelTdx.h
create mode 100644 OvmfPkg/Include/Library/MemEncryptTdxLib.h
create mode 100644 OvmfPkg/Include/Library/PlatformInitLib.h
create mode 100644 OvmfPkg/Include/Library/TdxMailboxLib.h
create mode 100644 OvmfPkg/Include/Protocol/QemuAcpiTableNotify.h
create mode 100644 OvmfPkg/Include/TdxCommondefs.inc
create mode 100644 OvmfPkg/Library/BaseMemEncryptTdxLib/BaseMemEncryptTdxLib.inf
create mode 100644 OvmfPkg/Library/BaseMemEncryptTdxLib/BaseMemEncryptTdxLibNull.inf
create mode 100644 OvmfPkg/Library/BaseMemEncryptTdxLib/BaseMemoryEncryptionNull.c
create mode 100644 OvmfPkg/Library/BaseMemEncryptTdxLib/MemoryEncryption.c
create mode 100644 OvmfPkg/Library/BaseMemEncryptTdxLib/VirtualMemory.h
rename OvmfPkg/{PlatformPei => Library/PlatformInitLib}/Cmos.c (61%)
create mode 100644 OvmfPkg/Library/PlatformInitLib/IntelTdx.c
create mode 100644 OvmfPkg/Library/PlatformInitLib/IntelTdxNull.c
create mode 100644 OvmfPkg/Library/PlatformInitLib/MemDetect.c
create mode 100644 OvmfPkg/Library/PlatformInitLib/Platform.c
create mode 100644 OvmfPkg/Library/PlatformInitLib/PlatformInitLib.inf
create mode 100644 OvmfPkg/Library/TdxMailboxLib/TdxMailbox.c
create mode 100644 OvmfPkg/Library/TdxMailboxLib/TdxMailboxLib.inf
create mode 100644 OvmfPkg/Library/TdxMailboxLib/TdxMailboxNull.c
create mode 100644 OvmfPkg/Library/VmgExitLib/VmTdExitHandler.h
create mode 100644 OvmfPkg/Library/VmgExitLib/VmTdExitVeHandler.c
create mode 100644 OvmfPkg/Library/VmgExitLib/X64/TdVmcallCpuid.nasm
rename OvmfPkg/{XenTimerDxe/XenTimerDxe.c => LocalApicTimerDxe/LocalApicTimerDxe.c} (95%)
rename OvmfPkg/{XenTimerDxe/XenTimerDxe.h => LocalApicTimerDxe/LocalApicTimerDxe.h} (96%)
rename OvmfPkg/{XenTimerDxe/XenTimerDxe.inf => LocalApicTimerDxe/LocalApicTimerDxe.inf} (80%)
delete mode 100644 OvmfPkg/PlatformPei/Cmos.h
create mode 100644 OvmfPkg/PlatformPei/IntelTdx.c
create mode 100644 OvmfPkg/TdxDxe/TdxAcpiTable.c
create mode 100644 OvmfPkg/TdxDxe/TdxAcpiTable.h
create mode 100644 OvmfPkg/TdxDxe/TdxDxe.c
create mode 100644 OvmfPkg/TdxDxe/TdxDxe.inf
create mode 100644 OvmfPkg/TdxDxe/X64/ApRunLoop.nasm
create mode 100644 UefiCpuPkg/Library/MpInitLib/MpIntelTdx.h
create mode 100644 UefiCpuPkg/Library/MpInitLib/MpLibTdx.c
create mode 100644 UefiCpuPkg/Library/MpInitLib/MpLibTdxNull.c
create mode 100644 UefiCpuPkg/Library/VmgExitLibNull/VmTdExitNull.c

--
2.29.2.windows.2


Yao, Jiewen
 

Thanks Min
Series: Reviewed-by: Jiewen Yao <Jiewen.yao@...>

-----Original Message-----
From: Xu, Min M <min.m.xu@...>
Sent: Wednesday, March 30, 2022 7:46 AM
To: devel@edk2.groups.io
Cc: Xu, Min M <min.m.xu@...>; Brijesh Singh <brijesh.singh@...>;
Dong, Eric <eric.dong@...>; Aktas, Erdem <erdemaktas@...>;
Wu, Hao A <hao.a.wu@...>; Wang, Jian J <jian.j.wang@...>;
James Bottomley <jejb@...>; Yao, Jiewen <jiewen.yao@...>;
Gao, Liming <gaoliming@...>; Kinney, Michael D
<michael.d.kinney@...>; Ni, Ray <ray.ni@...>; Kumar, Rahul1
<rahul1.kumar@...>; Tom Lendacky <thomas.lendacky@...>; Liu,
Zhiguang <zhiguang.liu@...>; Gerd Hoffmann <kraxel@...>
Subject: [PATCH V12 00/47] Enable Intel TDX in OvmfPkg (Config-A)

REF: https://bugzilla.tianocore.org/show_bug.cgi?id=3249

Intel's Trust Domain Extensions (Intel TDX) refers to an Intel technology
that extends Virtual Machines Extensions (VMX) and Multi-Key Total Memory
Encryption (MKTME) with a new kind of virutal machines guest called a
Trust Domain (TD). A TD is desinged to run in a CPU mode that protects the
confidentiality of TD memory contents and the TD's CPU state from other
software, including the hosting Virtual-Machine Monitor (VMM), unless
explicitly shared by the TD itself.

There are 2 configurations for TDVF to upstream. See below link for
the definitions of the 2 configurations.
https://edk2.groups.io/g/devel/message/76367

This patch-set is to enable Config-A in OvmfPkg.
- Merge the *basic* TDVF feature to existing OvmfX64Pkg.dsc. (Align
with existing SEV)
- Threat model: VMM is NOT out of TCB. (We don’t make things worse.)
- The OvmfX64Pkg.dsc includes SEV/TDX/normal OVMF basic boot capability.
The final binary can run on SEV/TDX/normal OVMF
- No changes to existing OvmfPkgX64 image layout.
- No need to add additional security features if they do not exist today
- No need to remove features if they exist today.
- RTMR is not supported
- PEI phase is NOT skipped in either Td or Non-Td

Patch 01 - 33 are changes in SEC phase. Also some libraries in these
patches are workable in SEC/PEI/DXE.

Patch 16 - 29 extract the common codes from OvmfPkg/PlatformPei to a new
PlatformInitLib. After that OvmfPkg/PlatformPei is refactored with this
lib. These 14 patches are currently reviewed in another separate
patch-set. https://edk2.groups.io/g/devel/message/87327

Patch 34 - 39 are changes in PEI phase.

Patch 40 - 44 are changes in DXE phase.

Patch 45 - 47 are for local Apic timer DXE driver.

[TDX]: https://software.intel.com/content/dam/develop/external/us/en/
documents/tdx-whitepaper-final9-17.pdf

[TDX-Module]: https://software.intel.com/content/dam/develop/external/
us/en/documents/tdx-module-1.0-public-spec-v0.931.pdf

[TDVF]: https://software.intel.com/content/dam/develop/external/us/en/
documents/tdx-virtual-firmware-design-guide-rev-1.pdf

[GCHI]: https://software.intel.com/content/dam/develop/external/us/en/
documents/intel-tdx-guest-hypervisor-communication-interface-1.0-344426-
002.pdf

Code is at https://github.com/mxu9/edk2/tree/tdvf_wave2.v12

v12 changes:
- Update MpInitLib based on the review feedbacks. Please see
https://edk2.groups.io/g/devel/message/88173.
- Update the code base to 2b4b8013fe45.

v11 changes:
- Update MpInitlib based on the review comments. Please see
https://edk2.groups.io/g/devel/message/88089
- Update the code base to 3ef2071927fa.

v10 changes:
- Update MpInitLib based on the review comments. Please see the
discussion: https://edk2.groups.io/g/devel/message/87902
- Update the code base to ec0b54849b23.

v9 changes:
- Move the definition of EFI_RESOURCE_MEMORY_UNACCEPTED from MdePkg
to OvmfPkg as in internal implementation. Because it has not been
added in PI spec. After the definition is added in PI spec, it can
be moved to MdePkg.
- Add definition of new CPUID leaf 0x21 in
MdePkg/Include/Register/Intel/Cpuid.h.
- Use switch-case to hanle VC/VE handling together in
CpuExceptionHandlerLib.
- Refactor changes for Tdx guest in MpInitLib.
- Refine the comments in BaseLib and PlatformInitLib.
- Other minor updates and changes.

v8 changes:
- Based on the comments of PlatformInitLib and OvmfPkg/PlatformPei,
a separte patch-set is created for the changes. It is now under review
https://edk2.groups.io/g/devel/message/87327
- Based on the comments, TdCall/TdVmCall/TdIsEnabled is wrapped with
MDE_CPU_IA32 and MDE_CPU_X64.
- EFI_RESOURCE_ATTRIBUTE_ENCRYPTED is removed based on the TDVF Spec
update. Instead EFI_RESOURCE_MEMORY_UNACCEPTED is added to indicate
the memory which to be accepted in TDVF. The corresponding logic
of AcceptMemory is updated as well. Please see Patch 31.
- PcdIa32EferChangeAllowed is deleted. Because for Td guest
IA32_EFER.NXE is set by default. So we only need check whether it has
been set before it is to be set again. See Patch 35.
- Based on comments PcdTdxSharedBitMask is defined in
[PcdsFixedAtBuild, PcdsPatchableInModule, PcdsDynamic, PcdsDynamicEx]
- Delete un-necessary header files in TdxLib.h.
- Other minor updates and changes.

v7 changes:
- Based on the comments from last review, 8 PlatformInitLib patches
are squashed into 4 patches (#17-#20). These 4 patches are not
related to Tdx guest. Tdx related codes of PlatformInitLib is
in #21.
- gUefiOvmfPkgTdxPlatformGuid is renamed as gUefiOvmfPkgPlatformInfoGuid.
Because this GUID is used not only by Tdx guest, but also by
Legacy guest.
- PlatformInitLibNull is deleted.
- In PlatformPei Pml4Entries is cap at 512 entries when
mPhysMemAddressWidth > 48.

v7 not-addressed comments
- Comments in MpInitLib have not been addressed yet. It will be
addressed in the following version.
- Thanks much for your understanding.

v6 changes:
- PlatformInitLib and OvmfPkg/PlatformPei refactoring are covered in
patch from 17 - 24. These patches are not related to Tdx guest. Tdx
related codes of PlatformInitLib is in patch 25.
- In the previous patch-sets, TdHob is processed in
OvmfPkg/Sec/IntelTdx.c. Per Gerd's suggestion they are now moved
to PlatformInitLib/IntelTdx.c. So that they can be reused in Config-B.
- The default Accept page size is changed from 4K to 2M.
- The BspAcceptMemoryResourceRange is refactored according to Gerd's
comment.
- In ApRunLoop.nasm command field is set to zero as acknowledgement.
This is a fix based on the ACPI Spec v6.4,Sec titled "Multiprocessor
Wakeup Structure".

v6 not-addressed comments
- Comments in MpInitLib have not been addressed yet. It will be
addressed in the following version.
- Thanks much for your understanding.

v5 changes:
- PlatformInitLib is introduced which wraps the common functions in
OvmfPkg/PlatformPei. It is because there are a lot of duplicated
codes for Platform initialization in PEI phase and there are at least
3 variants of PlatformPei. Another reason is that in TDVF Config-B
PEI-less boot needs the similar initiliazation as PlatformPei. Based
on the discussion with the community, PlatformInitLib is introduced.
As the first stage OvmfPkg/PlatformPei is refactored with this lib.
In the future the other 2 PlatformPei variants will be refactored
as well.
- PcdIgnoreVeHalt is deprecated.
- Add spec link for Mailbox.
- Other minor changes, such as comments, uncrustify formats, etc.

v5 not-addressed comments
- Comments in MpInitLib have not been addressed yet. It will be
addressed in the following version.
- Some comments may be missed. I will re-visit the review emails.
- Thanks much for your understanding.

v4 changes:
- Split the TdxLib into 2 libraries. The TDX basic functions
(TdCall / TdVmCall / TdIsEnabled) are moved to BaseLib (#2).
The other functions are in TdxLib. (#3)
- Based on above changes (TdCall/TdVmCall/TdIsEnabled in BaseLib)
the TdxLib.inf is not necessary in some Pkgs, such as
UefiPayloadPkg. The duplicated source code are deleted (BaseIoLib
is the sample).
- Drop the Accepting pages with TDX MP service. Instead only BSP
accepts pages. There maybe boot performance issue. There are some
mitigations to it, such as 2M accept page size, lazy accept, etc.
We will re-visit this issue in a separate patch-set.
- Relocate Mailbox in TdxDxe driver instead of in PlatformPei. This
is to keep consistence with Config-B (PEI is skipped in Config-B).
- SetMmioSharedBit in TdxDxe driver instead of in DxeIplPeim after
CreateIdentityMappingPageTables. This is to keep consistence with
Config-B (PEI is skipped in Config-B).
- Some other minor changes, such as switch-case indention.
- Rebase the code base (commit: 8c06c53b585a) and update the code with
uncrustify.

v4 not-addressed comments:
- Comments in MpInitLib have not been addressed yet. It will be
addressed in the next version.
- BaseMemEncryptTdxLib is suggested to be merged with
BaseMemEncryptSevLib. It will be addressed in the next version.
- Gerd suggests a generic page table walker which is able to set
and clear bits for a given memory range in both SEV and TDX guest.
This suggestion will be addressed in the next version.
- Some comments may be missed. I will re-visit the review emails.
- Thanks much for your understanding.

v3 changes:
- LocalApicTimerDxe is split out to be a separate patch-series.
- VmTdExitLibNull/VmgExitLib are removed. Instead the VmgExitLib
is extended to handle #VE exception. (Patch 3-5)
- Split the Tdx support of base IoLib into 4 commits. (Patch 6-9)
- Alter of MADT table is updated. In previous version it was
created from scratch. Now it gets the installed table, copy
it to a larger buffer and append the ACPI_MADT_MPWK to it.
(Patch 25)
- Changes in BaseXApicX2ApicLib is refined based on the
feedbacks. (Add spec link of MSR access definition, rename
some funtion name, etc.) (Patch 11)
- Use PcdConfidentialComputingGuestAttr to probe TDX guest instead
of CPUID. But in some cases PcdConfidentialComputingGuestAttr
cannot be used because it has not been set yet.
- Some other minor changes.

v3 not-addressed comments:
- Some of the comments have not been addressed. This is because I
need more time to consider how to address these comments.
At the same time I want to submit a new version based on the above
changes so that community can review in a more efficient way.
(v2 is the version one month ago).
- Comments in MpInitLib have not been addressed yet. It will be
addressed in v4.
- BaseMemEncryptTdxLib should be merged with BaseMemEncryptSevLib.
It will be addressed in v4.
- Some comments may be missed. I will re-visit the review emails.
- Thanks much for your understanding.

v2 changes:
- Remove TdxProbeLib. It is to reduce the depencies of the lib.
- In v1 a new function (AllocatePagesWithMemoryType) is added in
PeiMemoryAllocationLib. This function is not necessary. It can
be replaced by PeiServicesAllocatePages.
- IoLibFifo.c is added in BaseIoLibIntrinsic. This file includes
the functions of read/write of I/O port fifo. These functions
will call TdIoReadFifo or SevIoReadFifo by checking TDX or SEV
in run-time.
- DXE related patches are added. (Patch 22-28)
- Fix typo in commit/comment message, or some minor changes.
- Rebase the edk2 code base. (4cc1458dbe00)

Cc: Brijesh Singh <brijesh.singh@...>
Cc: Eric Dong <eric.dong@...>
Cc: Erdem Aktas <erdemaktas@...>
Cc: Hao A Wu <hao.a.wu@...>
Cc: Jian J Wang <jian.j.wang@...>
Cc: James Bottomley <jejb@...>
Cc: Jiewen Yao <jiewen.yao@...>
Cc: Liming Gao <gaoliming@...>
Cc: Michael D Kinney <michael.d.kinney@...>
Cc: Ray Ni <ray.ni@...>
Cc: Rahul Kumar <rahul1.kumar@...>
Cc: Tom Lendacky <thomas.lendacky@...>
Cc: Zhiguang Liu <zhiguang.liu@...>
Cc: Gerd Hoffmann <kraxel@...>
Signed-off-by: Min Xu <min.m.xu@...>

Min Xu (47):
MdePkg: Add Tdx.h
MdePkg: Update Cpuid.h for Tdx
MdePkg: Introduce basic Tdx functions in BaseLib
MdePkg: Add TdxLib to wrap Tdx operations
UefiCpuPkg: Extend VmgExitLibNull to handle #VE exception
OvmfPkg: Extend VmgExitLib to handle #VE exception
UefiCpuPkg/CpuExceptionHandler: Add base support for the #VE exception
MdePkg: Add helper functions for Tdx guest in BaseIoLibIntrinsic
MdePkg: Support mmio for Tdx guest in BaseIoLibIntrinsic
MdePkg: Support IoFifo for Tdx guest in BaseIoLibIntrinsic
MdePkg: Support IoRead/IoWrite for Tdx guest in BaseIoLibIntrinsic
UefiCpuPkg: Support TDX in BaseXApicX2ApicLib
MdePkg: Add macro to check SEV / TDX guest
UefiCpuPkg: Enable Tdx support in MpInitLib
OvmfPkg: Add IntelTdx.h in OvmfPkg/Include/IndustryStandard
OvmfPkg: Add TdxMailboxLib
OvmfPkg: Create initial version of PlatformInitLib
OvmfPkg/PlatformInitLib: Add hob functions
OvmfPkg/PlatformPei: Move global variables to PlatformInfoHob
OvmfPkg/PlatformPei: Refactor MiscInitialization
OvmfPkg/PlatformPei: Refactor MiscInitialization for CloudHV
OvmfPkg/PlatformPei: Refactor AddressWidthInitialization
OvmfPkg/PlatformPei: Refactor MaxCpuCountInitialization
OvmfPkg/PlatformPei: Refactor QemuUc32BaseInitialization
OvmfPkg/PlatformPei: Refactor InitializeRamRegions
OvmfPkg/PlatformPei: Refactor MemMapInitialization
OvmfPkg/PlatformPei: Refactor NoexecDxeInitialization
OvmfPkg/PlatformPei: Refactor MiscInitialization
OvmfPkg/PlatformInitLib: Create MemDetect.c
OvmfPkg/PlatformInitLib: Move functions to Platform.c
OvmfPkg: Update PlatformInitLib to process Tdx hoblist
OvmfPkg/Sec: Declare local variable as volatile in
SecCoreStartupWithStack
OvmfPkg: Update Sec to support Tdx
OvmfPkg: Check Tdx in QemuFwCfgPei to avoid DMA operation
MdeModulePkg: Skip setting IA32_ERER.NXE if it has already been set
MdeModulePkg: Add PcdTdxSharedBitMask
UefiCpuPkg: Update AddressEncMask in CpuPageTable
OvmfPkg: Update PlatformInitLib for Tdx guest
OvmfPkg: Update PlatformPei to support Tdx guest
OvmfPkg: Update AcpiPlatformDxe to alter MADT table
OvmfPkg/BaseMemEncryptTdxLib: Add TDX helper library
OvmfPkg: Add TdxDxe driver
OvmfPkg/QemuFwCfgLib: Support Tdx in QemuFwCfgDxe
OvmfPkg: Update IoMmuDxe to support TDX
OvmfPkg: Rename XenTimerDxe to LocalApicTimerDxe
UefiCpuPkg: Setting initial-count register as the last step
OvmfPkg: Switch timer in build time for OvmfPkg

.../Core/DxeIplPeim/X64/VirtualMemory.c | 8 +-
MdeModulePkg/MdeModulePkg.dec | 4 +
.../Include/ConfidentialComputingGuestAttr.h | 3 +
MdePkg/Include/IndustryStandard/Tdx.h | 203 ++++
MdePkg/Include/Library/BaseLib.h | 66 ++
MdePkg/Include/Library/TdxLib.h | 92 ++
MdePkg/Include/Register/Intel/Cpuid.h | 35 +-
.../BaseIoLibIntrinsic/BaseIoLibIntrinsic.inf | 2 +
.../BaseIoLibIntrinsicSev.inf | 7 +
MdePkg/Library/BaseIoLibIntrinsic/IoLib.c | 81 +-
MdePkg/Library/BaseIoLibIntrinsic/IoLibFifo.c | 217 ++++
MdePkg/Library/BaseIoLibIntrinsic/IoLibGcc.c | 51 +-
.../BaseIoLibIntrinsic/IoLibInternalTdx.c | 674 +++++++++++++
.../BaseIoLibIntrinsic/IoLibInternalTdxNull.c | 497 +++++++++
MdePkg/Library/BaseIoLibIntrinsic/IoLibMsc.c | 73 +-
MdePkg/Library/BaseIoLibIntrinsic/IoLibSev.h | 166 +++
MdePkg/Library/BaseIoLibIntrinsic/IoLibTdx.h | 410 ++++++++
.../BaseIoLibIntrinsic/X64/IoFifoSev.nasm | 34 +-
MdePkg/Library/BaseLib/BaseLib.inf | 4 +
MdePkg/Library/BaseLib/IntelTdxNull.c | 83 ++
MdePkg/Library/BaseLib/X64/TdCall.nasm | 85 ++
MdePkg/Library/BaseLib/X64/TdProbe.c | 63 ++
MdePkg/Library/BaseLib/X64/TdVmcall.nasm | 145 +++
MdePkg/Library/TdxLib/AcceptPages.c | 181 ++++
MdePkg/Library/TdxLib/Rtmr.c | 84 ++
MdePkg/Library/TdxLib/TdInfo.c | 115 +++
MdePkg/Library/TdxLib/TdxLib.inf | 37 +
MdePkg/Library/TdxLib/TdxLibNull.c | 106 ++
MdePkg/MdePkg.dec | 3 +
MdePkg/MdePkg.dsc | 1 +
OvmfPkg/AcpiPlatformDxe/AcpiPlatformDxe.inf | 1 +
OvmfPkg/AcpiPlatformDxe/QemuFwCfgAcpi.c | 14 +-
OvmfPkg/AmdSev/AmdSevX64.dsc | 11 +-
OvmfPkg/AmdSev/AmdSevX64.fdf | 3 +-
OvmfPkg/Bhyve/BhyveX64.dsc | 5 +
OvmfPkg/CloudHv/CloudHvX64.dsc | 8 +-
OvmfPkg/CloudHv/CloudHvX64.fdf | 2 +-
OvmfPkg/Include/IndustryStandard/IntelTdx.h | 67 ++
OvmfPkg/Include/Library/MemEncryptTdxLib.h | 81 ++
OvmfPkg/Include/Library/PlatformInitLib.h | 237 +++++
OvmfPkg/Include/Library/TdxMailboxLib.h | 76 ++
.../Include/Protocol/QemuAcpiTableNotify.h | 27 +
OvmfPkg/Include/TdxCommondefs.inc | 51 +
OvmfPkg/IoMmuDxe/AmdSevIoMmu.c | 103 +-
OvmfPkg/IoMmuDxe/AmdSevIoMmu.h | 6 +-
OvmfPkg/IoMmuDxe/IoMmuDxe.c | 6 +-
OvmfPkg/IoMmuDxe/IoMmuDxe.inf | 5 +
.../BaseMemEncryptTdxLib.inf | 44 +
.../BaseMemEncryptTdxLibNull.inf | 35 +
.../BaseMemoryEncryptionNull.c | 90 ++
.../BaseMemEncryptTdxLib/MemoryEncryption.c | 948 ++++++++++++++++++
.../BaseMemEncryptTdxLib/VirtualMemory.h | 181 ++++
.../PlatformInitLib}/Cmos.c | 32 +-
OvmfPkg/Library/PlatformInitLib/IntelTdx.c | 563 +++++++++++
.../Library/PlatformInitLib/IntelTdxNull.c | 46 +
OvmfPkg/Library/PlatformInitLib/MemDetect.c | 856 ++++++++++++++++
OvmfPkg/Library/PlatformInitLib/Platform.c | 573 +++++++++++
.../PlatformInitLib/PlatformInitLib.inf | 98 ++
OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgDxe.c | 9 +-
.../Library/QemuFwCfgLib/QemuFwCfgDxeLib.inf | 1 +
.../QemuFwCfgLib/QemuFwCfgLibInternal.h | 11 +
OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgPei.c | 32 +
.../Library/QemuFwCfgLib/QemuFwCfgPeiLib.inf | 2 +
OvmfPkg/Library/TdxMailboxLib/TdxMailbox.c | 141 +++
.../Library/TdxMailboxLib/TdxMailboxLib.inf | 52 +
.../Library/TdxMailboxLib/TdxMailboxNull.c | 85 ++
OvmfPkg/Library/VmgExitLib/SecVmgExitLib.inf | 3 +-
OvmfPkg/Library/VmgExitLib/VmTdExitHandler.h | 32 +
.../Library/VmgExitLib/VmTdExitVeHandler.c | 559 +++++++++++
OvmfPkg/Library/VmgExitLib/VmgExitLib.inf | 2 +
.../Library/VmgExitLib/X64/TdVmcallCpuid.nasm | 146 +++
.../LocalApicTimerDxe.c} | 4 +-
.../LocalApicTimerDxe.h} | 4 +-
.../LocalApicTimerDxe.inf} | 7 +-
OvmfPkg/Microvm/MicrovmX64.dsc | 8 +-
OvmfPkg/Microvm/MicrovmX64.fdf | 2 +-
OvmfPkg/OvmfPkg.dec | 17 +
OvmfPkg/OvmfPkgIa32.dsc | 15 +-
OvmfPkg/OvmfPkgIa32.fdf | 8 +-
OvmfPkg/OvmfPkgIa32X64.dsc | 15 +-
OvmfPkg/OvmfPkgIa32X64.fdf | 8 +-
OvmfPkg/OvmfPkgX64.dsc | 32 +-
OvmfPkg/OvmfPkgX64.fdf | 11 +-
OvmfPkg/OvmfXen.dsc | 7 +-
OvmfPkg/OvmfXen.fdf | 2 +-
OvmfPkg/PlatformPei/AmdSev.c | 8 +-
OvmfPkg/PlatformPei/Cmos.h | 48 -
OvmfPkg/PlatformPei/FeatureControl.c | 7 +-
OvmfPkg/PlatformPei/Fv.c | 4 +-
OvmfPkg/PlatformPei/IntelTdx.c | 51 +
OvmfPkg/PlatformPei/MemDetect.c | 889 ++--------------
OvmfPkg/PlatformPei/MemTypeInfo.c | 2 +-
OvmfPkg/PlatformPei/Platform.c | 631 ++----------
OvmfPkg/PlatformPei/Platform.h | 97 +-
OvmfPkg/PlatformPei/PlatformPei.inf | 6 +-
OvmfPkg/Sec/SecMain.c | 44 +-
OvmfPkg/Sec/SecMain.inf | 3 +
OvmfPkg/Sec/X64/SecEntry.nasm | 82 ++
OvmfPkg/TdxDxe/TdxAcpiTable.c | 213 ++++
OvmfPkg/TdxDxe/TdxAcpiTable.h | 60 ++
OvmfPkg/TdxDxe/TdxDxe.c | 261 +++++
OvmfPkg/TdxDxe/TdxDxe.inf | 64 ++
OvmfPkg/TdxDxe/X64/ApRunLoop.nasm | 90 ++
UefiCpuPkg/CpuDxe/CpuDxe.inf | 1 +
UefiCpuPkg/CpuDxe/CpuPageTable.c | 3 +
UefiCpuPkg/Include/Library/VmgExitLib.h | 28 +
.../BaseXApicX2ApicLib/BaseXApicX2ApicLib.c | 170 +++-
.../PeiDxeSmmCpuException.c | 53 +-
.../SecPeiCpuException.c | 57 +-
UefiCpuPkg/Library/MpInitLib/DxeMpInitLib.inf | 3 +
UefiCpuPkg/Library/MpInitLib/MpIntelTdx.h | 69 ++
UefiCpuPkg/Library/MpInitLib/MpLib.c | 63 +-
UefiCpuPkg/Library/MpInitLib/MpLibTdx.c | 106 ++
UefiCpuPkg/Library/MpInitLib/MpLibTdxNull.c | 69 ++
UefiCpuPkg/Library/MpInitLib/PeiMpInitLib.inf | 3 +
.../Library/VmgExitLibNull/VmTdExitNull.c | 38 +
.../Library/VmgExitLibNull/VmgExitLibNull.inf | 1 +
117 files changed, 10472 insertions(+), 1666 deletions(-)
create mode 100644 MdePkg/Include/IndustryStandard/Tdx.h
create mode 100644 MdePkg/Include/Library/TdxLib.h
create mode 100644 MdePkg/Library/BaseIoLibIntrinsic/IoLibFifo.c
create mode 100644 MdePkg/Library/BaseIoLibIntrinsic/IoLibInternalTdx.c
create mode 100644 MdePkg/Library/BaseIoLibIntrinsic/IoLibInternalTdxNull.c
create mode 100644 MdePkg/Library/BaseIoLibIntrinsic/IoLibSev.h
create mode 100644 MdePkg/Library/BaseIoLibIntrinsic/IoLibTdx.h
create mode 100644 MdePkg/Library/BaseLib/IntelTdxNull.c
create mode 100644 MdePkg/Library/BaseLib/X64/TdCall.nasm
create mode 100644 MdePkg/Library/BaseLib/X64/TdProbe.c
create mode 100644 MdePkg/Library/BaseLib/X64/TdVmcall.nasm
create mode 100644 MdePkg/Library/TdxLib/AcceptPages.c
create mode 100644 MdePkg/Library/TdxLib/Rtmr.c
create mode 100644 MdePkg/Library/TdxLib/TdInfo.c
create mode 100644 MdePkg/Library/TdxLib/TdxLib.inf
create mode 100644 MdePkg/Library/TdxLib/TdxLibNull.c
create mode 100644 OvmfPkg/Include/IndustryStandard/IntelTdx.h
create mode 100644 OvmfPkg/Include/Library/MemEncryptTdxLib.h
create mode 100644 OvmfPkg/Include/Library/PlatformInitLib.h
create mode 100644 OvmfPkg/Include/Library/TdxMailboxLib.h
create mode 100644 OvmfPkg/Include/Protocol/QemuAcpiTableNotify.h
create mode 100644 OvmfPkg/Include/TdxCommondefs.inc
create mode 100644
OvmfPkg/Library/BaseMemEncryptTdxLib/BaseMemEncryptTdxLib.inf
create mode 100644
OvmfPkg/Library/BaseMemEncryptTdxLib/BaseMemEncryptTdxLibNull.inf
create mode 100644
OvmfPkg/Library/BaseMemEncryptTdxLib/BaseMemoryEncryptionNull.c
create mode 100644
OvmfPkg/Library/BaseMemEncryptTdxLib/MemoryEncryption.c
create mode 100644
OvmfPkg/Library/BaseMemEncryptTdxLib/VirtualMemory.h
rename OvmfPkg/{PlatformPei => Library/PlatformInitLib}/Cmos.c (61%)
create mode 100644 OvmfPkg/Library/PlatformInitLib/IntelTdx.c
create mode 100644 OvmfPkg/Library/PlatformInitLib/IntelTdxNull.c
create mode 100644 OvmfPkg/Library/PlatformInitLib/MemDetect.c
create mode 100644 OvmfPkg/Library/PlatformInitLib/Platform.c
create mode 100644 OvmfPkg/Library/PlatformInitLib/PlatformInitLib.inf
create mode 100644 OvmfPkg/Library/TdxMailboxLib/TdxMailbox.c
create mode 100644 OvmfPkg/Library/TdxMailboxLib/TdxMailboxLib.inf
create mode 100644 OvmfPkg/Library/TdxMailboxLib/TdxMailboxNull.c
create mode 100644 OvmfPkg/Library/VmgExitLib/VmTdExitHandler.h
create mode 100644 OvmfPkg/Library/VmgExitLib/VmTdExitVeHandler.c
create mode 100644 OvmfPkg/Library/VmgExitLib/X64/TdVmcallCpuid.nasm
rename OvmfPkg/{XenTimerDxe/XenTimerDxe.c =>
LocalApicTimerDxe/LocalApicTimerDxe.c} (95%)
rename OvmfPkg/{XenTimerDxe/XenTimerDxe.h =>
LocalApicTimerDxe/LocalApicTimerDxe.h} (96%)
rename OvmfPkg/{XenTimerDxe/XenTimerDxe.inf =>
LocalApicTimerDxe/LocalApicTimerDxe.inf} (80%)
delete mode 100644 OvmfPkg/PlatformPei/Cmos.h
create mode 100644 OvmfPkg/PlatformPei/IntelTdx.c
create mode 100644 OvmfPkg/TdxDxe/TdxAcpiTable.c
create mode 100644 OvmfPkg/TdxDxe/TdxAcpiTable.h
create mode 100644 OvmfPkg/TdxDxe/TdxDxe.c
create mode 100644 OvmfPkg/TdxDxe/TdxDxe.inf
create mode 100644 OvmfPkg/TdxDxe/X64/ApRunLoop.nasm
create mode 100644 UefiCpuPkg/Library/MpInitLib/MpIntelTdx.h
create mode 100644 UefiCpuPkg/Library/MpInitLib/MpLibTdx.c
create mode 100644 UefiCpuPkg/Library/MpInitLib/MpLibTdxNull.c
create mode 100644 UefiCpuPkg/Library/VmgExitLibNull/VmTdExitNull.c

--
2.29.2.windows.2