RFC: https://bugzilla.tianocore.org/show_bug.cgi?id=3937
UnacceptedMemory is one of the four defined types of TD memory in Intel TDX guest. TDVF must invoke TDCALL [TDG.MEM.PAGE.ACCEPT] the unaccepted memory before use it. See [TDVF] Section 7.1. TDVF: https://www.intel.com/content/dam/develop/external/us/en/ documents/tdx-virtual-firmware-design-guide-rev-1.01.pdf It is a time-consuming task which impacts the boot performance badly. One of the mitigation is the lazy-accept mechanism. That the whole system memory is divided into 2 parts, one is accepted in bios phase, the other is tagged as EfiGcdMemoryTypeUnaccepted and OS will handle these "unaccepted" memories. See "UEFI Spec v2.9 Table 7-5 Memory Type Usage before ExitBootServices()" As the first stage we accept all the memory under 4G. Please see the discussion in https://edk2.groups.io/g/devel/message/93086 Patch 1-4: Introduce lazy-accept related definitions. Patch 5-6: Update Dxe and shell for unaccepted memory. Patch 7 - 9: Update OvmfPkg for unaccepted memory. Patch 10 - 12: Introduce EfiMemoryAcceptProtocol and realize it in TdxDxe. Code: https://github.com/mxu9/edk2/tree/lazyaccept.v3 v3 changes: - As the first stage we accept all the memory under 4G. See the discussion in https://edk2.groups.io/g/devel/message/93086 - "Pool and page functions accept memory when OOM occurs" is dropped. See the discussion in https://edk2.groups.io/g/devel/message/93086 - PlatformAdjustSystemMemorySizeBelow4gbForLazyAccep is deleted because in current stage we accept all the memory under 4G. v2 changes: - Fix a typo that change EfiUnacceptedMemory to EfiUnacceptedMemoryType. - Define EFI_GCD_MEMORY_TYPE_UNACCEPTED in PrePiDxeCis.h because it has not been defined in PI spec. - AllocatePages should return EFI_INVALID_PARAMETERS if input MemoryType is EfiUnacceptedMemoryType. - Use EDKII_ prefix instead of EFI_ prefix in the protocol name of EDKII_MEMORY_ACCEPT_PROTOCOL_GUID. Because this protocol is not EFI defined. - Accept memory under 4G even if the PcdLazyAcceptPartialMemorySize is bigger than 4G. So with this setting, even if the PcdLazyAcceptPartialMemorySize is 0 (which means to accept all memories), only the memory under 4G will be accepted. This is to optimize the performance. Cc: Zhichao Gao <zhichao....@intel.com> Cc: Michael D Kinney <michael.d.kin...@intel.com> Cc: Zhiguang Liu <zhiguang....@intel.com> Cc: Jian J Wang <jian.j.w...@intel.com> Cc: Liming Gao <gaolim...@byosoft.com.cn> Cc: Ray Ni <ray...@intel.com> Cc: Erdem Aktas <erdemak...@google.com> Cc: Gerd Hoffmann <kra...@redhat.com> Cc: James Bottomley <j...@linux.ibm.com> Cc: Jiewen Yao <jiewen....@intel.com> Cc: Tom Lendacky <thomas.lenda...@amd.com> Signed-off-by: Jiaqi Gao <jiaqi....@intel.com> Signed-off-by: Min Xu <min.m...@intel.com> Jiaqi Gao (1): MdePkg: The prototype definition of EdkiiMemoryAcceptProtocol Min M Xu (11): MdeModulePkg: Add PrePiHob.h MdePkg: Increase EFI_RESOURCE_MAX_MEMORY_TYPE OvmfPkg: Use EFI_RESOURCE_MEMORY_UNACCEPTED which defined in MdeModulePkg MdePkg: Add UEFI Unaccepted memory definition MdeModulePkg: Update Dxe to handle unaccepted memory type ShellPkg: Update shell command memmap to show unaccepted memory OvmfPkg: Add MaxAcceptedMemoryAddress in TDX work area OvmfPkg: Introduce lazy accept in PlatformInitLib and PlatformPei OvmfPkg: Update ConstructFwHobList for lazy accept OvmfPkg: Realize EdkiiMemoryAcceptProtocol in TdxDxe OvmfPkg: Call gEdkiiMemoryAcceptProtocolGuid to accept pages MdeModulePkg/Core/Dxe/Gcd/Gcd.c | 6 + MdeModulePkg/Core/Dxe/Mem/Page.c | 63 ++++++--- MdeModulePkg/Include/Pi/PrePiDxeCis.h | 25 ++++ MdeModulePkg/Include/Pi/PrePiHob.h | 20 +++ MdePkg/Include/Pi/PiDxeCis.h | 10 +- MdePkg/Include/Pi/PiHob.h | 11 +- MdePkg/Include/Protocol/MemoryAccept.h | 37 +++++ MdePkg/Include/Uefi/UefiMultiPhase.h | 5 + MdePkg/MdePkg.dec | 3 + OvmfPkg/Include/WorkArea.h | 1 + .../BaseMemEncryptTdxLib.inf | 3 + .../BaseMemEncryptTdxLib/MemoryEncryption.c | 12 +- OvmfPkg/Library/PeilessStartupLib/Hob.c | 26 +++- .../PeilessStartupLib/PeilessStartupLib.inf | 1 + OvmfPkg/Library/PlatformInitLib/IntelTdx.c | 131 ++++++++++++++++-- OvmfPkg/Library/PlatformInitLib/MemDetect.c | 2 + OvmfPkg/TdxDxe/TdxDxe.c | 103 ++++++++++++++ OvmfPkg/TdxDxe/TdxDxe.inf | 2 + .../UefiShellDebug1CommandsLib/MemMap.c | 13 ++ .../UefiShellDebug1CommandsLib.uni | 3 +- 20 files changed, 440 insertions(+), 37 deletions(-) create mode 100644 MdeModulePkg/Include/Pi/PrePiDxeCis.h create mode 100644 MdeModulePkg/Include/Pi/PrePiHob.h create mode 100644 MdePkg/Include/Protocol/MemoryAccept.h -- 2.29.2.windows.2 -=-=-=-=-=-=-=-=-=-=-=- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#93125): https://edk2.groups.io/g/devel/message/93125 Mute This Topic: https://groups.io/mt/93474510/21656 Group Owner: devel+ow...@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [arch...@mail-archive.com] -=-=-=-=-=-=-=-=-=-=-=-