From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mga06.intel.com (mga06.intel.com [134.134.136.31]) by mx.groups.io with SMTP id smtpd.web12.46431.1661581332997885650 for ; Fri, 26 Aug 2022 23:22:13 -0700 Authentication-Results: mx.groups.io; dkim=fail reason="unable to parse pub key" header.i=@intel.com header.s=intel header.b=Aec40Ie8; spf=pass (domain: intel.com, ip: 134.134.136.31, mailfrom: min.m.xu@intel.com) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1661581332; x=1693117332; h=from:to:cc:subject:date:message-id:mime-version: content-transfer-encoding; bh=EJ8FJptCqd+e/kQk9OPbV9gMumT5nbSu/qQOxph5L9U=; b=Aec40Ie8D5ROzF2KiYaG14JOtBdnGqYHEX5NCoK4HEm32HlmZ0uxFt8S nPKFl7Ax14SwK1em1xCrTtw0m1zBiP9SgZKNdZKwvtq7kIORVkyVeb63x HI9i7nEnvdA82FUPwNKbRDdWyBdad3tWrBOSFmUPh5AqoYEsgGr1x+qX4 lOr7NQwAnx1tfGnxrGwhkSq/w86Czx0IPPde6qDumiD8ZL+AbEBQJ21Rf 7cEsYZk02spJVQunPRwbs94Ow2RAWJxvpiQCr1gChNcYH38xPBN99ULlp YHUypxKk2zZhChYCpI3jQO3oFqaJE4BPSlSdSQ/tc6xiA079PYCenVA2I w==; X-IronPort-AV: E=McAfee;i="6500,9779,10451"; a="356355776" X-IronPort-AV: E=Sophos;i="5.93,267,1654585200"; d="scan'208";a="356355776" Received: from fmsmga008.fm.intel.com ([10.253.24.58]) by orsmga104.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 26 Aug 2022 23:22:12 -0700 X-IronPort-AV: E=Sophos;i="5.93,267,1654585200"; d="scan'208";a="671738697" Received: from mxu9-mobl1.ccr.corp.intel.com ([10.249.171.119]) by fmsmga008-auth.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 26 Aug 2022 23:22:08 -0700 From: "Min Xu" To: devel@edk2.groups.io Cc: Min Xu , Zhichao Gao , Michael D Kinney , Zhiguang Liu , Jian J Wang , Liming Gao , Ray Ni , Erdem Aktas , Gerd Hoffmann , James Bottomley , Jiewen Yao , Tom Lendacky , Jiaqi Gao Subject: [PATCH V2 00/14] Introduce Lazy-accept for Tdx guest Date: Sat, 27 Aug 2022 14:21:07 +0800 Message-Id: X-Mailer: git-send-email 2.29.2.windows.2 MIME-Version: 1.0 Content-Transfer-Encoding: 8bit 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()" In current implementation, we configure the lazy accept memory size with PcdLazyAcceptPartialMemorySize in build time. If the PcdLazyAcceptPartialMemorySize is 0, it means to accept all the memory under 4G. This is to optimize the performance. Patch 1-4: Introduce lazy-accept related definitions. Patch 5-6: Update Dxe and shell for unaccepted memory. Patch 7 - 11: Update OvmfPkg for unaccepted memory. Patch 12 - 13: Introduce EfiMemoryAcceptProtocol and realize it in TdxDxe. Patch 14: Update Pool and Page functions to accept memory when OOM occurs. Code: https://github.com/mxu9/edk2/tree/lazyaccept.v2 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 Cc: Michael D Kinney Cc: Zhiguang Liu Cc: Jian J Wang Cc: Liming Gao Cc: Ray Ni Cc: Erdem Aktas Cc: Gerd Hoffmann Cc: James Bottomley Cc: Jiewen Yao Cc: Tom Lendacky Signed-off-by: Jiaqi Gao Signed-off-by: Min Xu Jiaqi Gao (2): MdePkg: The prototype definition of EdkiiMemoryAcceptProtocol MdeModulePkg: Pool and page functions accept memory when OOM occurs Min M Xu (12): 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 PCD and DEFINEs for Lazy Accept page. 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/DxeMain.inf | 1 + MdeModulePkg/Core/Dxe/Gcd/Gcd.c | 6 + MdeModulePkg/Core/Dxe/Mem/Imem.h | 16 ++ MdeModulePkg/Core/Dxe/Mem/Page.c | 253 ++++++++++++++++-- MdeModulePkg/Core/Dxe/Mem/Pool.c | 14 + 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/Library/PlatformInitLib.h | 6 + OvmfPkg/Include/WorkArea.h | 1 + OvmfPkg/IntelTdx/IntelTdxX64.dsc | 8 + .../BaseMemEncryptTdxLib.inf | 3 + .../BaseMemEncryptTdxLib/MemoryEncryption.c | 12 +- OvmfPkg/Library/PeilessStartupLib/Hob.c | 26 +- .../PeilessStartupLib/PeilessStartupLib.inf | 1 + OvmfPkg/Library/PlatformInitLib/IntelTdx.c | 154 ++++++++++- OvmfPkg/Library/PlatformInitLib/MemDetect.c | 27 ++ .../PlatformInitLib/PlatformInitLib.inf | 1 + OvmfPkg/OvmfPkg.dec | 4 + OvmfPkg/OvmfPkgX64.dsc | 9 + OvmfPkg/PlatformPei/MemDetect.c | 5 + OvmfPkg/TdxDxe/TdxDxe.c | 103 +++++++ OvmfPkg/TdxDxe/TdxDxe.inf | 2 + .../UefiShellDebug1CommandsLib/MemMap.c | 13 + .../UefiShellDebug1CommandsLib.uni | 3 +- 29 files changed, 741 insertions(+), 38 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