From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mga09.intel.com (mga09.intel.com [134.134.136.24]) by mx.groups.io with SMTP id smtpd.web11.2818.1667279643333273629 for ; Mon, 31 Oct 2022 22:14:03 -0700 Authentication-Results: mx.groups.io; dkim=fail reason="unable to parse pub key" header.i=@intel.com header.s=intel header.b=YYDg5d8Z; spf=pass (domain: intel.com, ip: 134.134.136.24, 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=1667279643; x=1698815643; h=from:to:cc:subject:date:message-id:mime-version: content-transfer-encoding; bh=gXfn+KB/2d80NkGoxSY4FkdkvSCli7i3BM7ymfr7vIY=; b=YYDg5d8ZPzKAyZ82DUnQ6lfavErJoFkBOBdS9o4lbsm+thJV0kSvd9Uc 2/+INaWu+G0dXxHDpITqaYAmEFEAQ7Vdzeu3y6y5OmQ2klwAHDpfdLx46 auntlgQN/jyPzQiPkW5YAALkFIjdjNNDCaU0Q5lr62SzcxFORXJd1zBmZ 9W16bebIGahU+p5zntfcvSX317ZYH5TgVtL+xNjP0Uv3Xcg0b0pP4gtjv BBG0vtSv/RV39SvylkgK39uoQhljm+JPLeiBZ+XcXuRDYzCRS58MRkOd1 ogt5CWM1JajbYB5YvCDSdzQLSpUpXmbIpdwiDBkiYRyHZg3MNr5fa3oya Q==; X-IronPort-AV: E=McAfee;i="6500,9779,10517"; a="310162621" X-IronPort-AV: E=Sophos;i="5.95,229,1661842800"; d="scan'208";a="310162621" Received: from fmsmga006.fm.intel.com ([10.253.24.20]) by orsmga102.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 31 Oct 2022 22:14:02 -0700 X-IronPort-AV: E=McAfee;i="6500,9779,10517"; a="878985419" X-IronPort-AV: E=Sophos;i="5.95,229,1661842800"; d="scan'208";a="878985419" Received: from mxu9-mobl1.ccr.corp.intel.com ([10.255.29.119]) by fmsmga006-auth.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 31 Oct 2022 22:13:59 -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 V5 00/10] Introduce Lazy-accept for Tdx guest Date: Tue, 1 Nov 2022 13:13:39 +0800 Message-Id: <20221101051349.13-1-min.m.xu@intel.com> 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()" As the first stage we accept all the memory under 4G. Please see the discussion in https://edk2.groups.io/g/devel/message/93086 This patch-set is related to code first, so there is a edk2-staging branch. Please see https://github.com/tianocore/edk2-staging/tree/TDVF Patch 1-4: Introduce lazy-accept related definitions. Patch 5-6: Update Dxe and shell for unaccepted memory. Patch 7: Update OvmfPkg for unaccepted memory. Patch 8 - 10: Introduce EfiMemoryAcceptProtocol and realize it in TdxDxe. Code: https://github.com/mxu9/edk2/tree/lazyaccept.v5 v5 changes: - Rebase the patch-set to commit df7ce74e6c75. - Add reviewed-by in MdeModulePkg/MdePkg related patches(#1/2/4/5/8). - Add acked-by in patch#7. v4 changes: - To follow the name convention of EDKII code first, the name of EFI_RESOURCE_MEMORY_UNACCEPTED is updated to BZ3937_EFI_RESOURCE_MEMORY_UNACCEPTED. - Remove the definition of MaxAcceptedMemoryAddress because in current stage we will accept all the memory under 4G. So MaxAcceptedMemoryAddress is not useable in this assumption. - Because this is related to code first, there is edk2-staging branch. The branch link is attached. https://github.com/tianocore/edk2-staging/tree/TDVF 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 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 (1): MdePkg: The prototype definition of EdkiiMemoryAcceptProtocol Min M Xu (9): MdeModulePkg: Add PrePiHob.h MdePkg: Increase EFI_RESOURCE_MAX_MEMORY_TYPE OvmfPkg: Use BZ3937_EFI_RESOURCE_MEMORY_UNACCEPTED 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: Introduce lazy accept in PlatformInitLib and PlatformPei 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 + .../BaseMemEncryptTdxLib.inf | 3 + .../BaseMemEncryptTdxLib/MemoryEncryption.c | 12 +- OvmfPkg/Library/PeilessStartupLib/Hob.c | 5 +- OvmfPkg/Library/PlatformInitLib/IntelTdx.c | 98 ++++++++++++++--- OvmfPkg/Library/PlatformInitLib/MemDetect.c | 2 + OvmfPkg/TdxDxe/TdxDxe.c | 103 ++++++++++++++++++ OvmfPkg/TdxDxe/TdxDxe.inf | 2 + .../UefiShellDebug1CommandsLib/MemMap.c | 13 +++ .../UefiShellDebug1CommandsLib.uni | 3 +- 18 files changed, 381 insertions(+), 40 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