From nobody Fri Nov 15 10:48:30 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of groups.io designates 66.175.222.108 as permitted sender) client-ip=66.175.222.108; envelope-from=bounce+27952+90226+1787277+3901457@groups.io; helo=mail02.groups.io; Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of groups.io designates 66.175.222.108 as permitted sender) smtp.mailfrom=bounce+27952+90226+1787277+3901457@groups.io; dmarc=fail(p=none dis=none) header.from=intel.com ARC-Seal: i=1; a=rsa-sha256; t=1654484444; cv=none; d=zohomail.com; s=zohoarc; b=n+wT3aBu1NoHf2Vxktibh+1cj+HCdXjaXGSetXna8QjOdG68PqTYlZtglHs9L+ZMdZ1HU57+J90koshvLEts78lTmic0iB1RQ2oB8BMxncMOYV/xipSsrnU+VcTwhTzEJZp9wfLq2juJZ3KjRC72Wa4nGG5Avse6qcRuOtVu0/s= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1654484444; h=Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Id:List-Help:List-Unsubscribe:MIME-Version:Message-ID:Reply-To:References:Sender:Subject:To; bh=SmfKG15T4mY9Ix8O32Qzuh1/Cqe49OBGnJsSMrjCvns=; b=CNN9xmnju0Lfc1cpkehNZhUVtDtjl+wwzFqaQB63JoSFPYW8mNOFtzsYpLesK9O2AnTmlzOa2NDOOy0wIUyD1KCq7282Ar5ySnfyrLAqP1+2W7N3KiQ3bhR0WSKb6fUcw9nYc65AY5mf12JssdB2ckIeNIK5bZD6RNKGJR066q0= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of groups.io designates 66.175.222.108 as permitted sender) smtp.mailfrom=bounce+27952+90226+1787277+3901457@groups.io; dmarc=fail header.from= (p=none dis=none) Received: from mail02.groups.io (mail02.groups.io [66.175.222.108]) by mx.zohomail.com with SMTPS id 1654484444534669.5946315167915; Sun, 5 Jun 2022 20:00:44 -0700 (PDT) Return-Path: X-Received: by 127.0.0.2 with SMTP id RPh0YY1788612x1FvquN10N3; Sun, 05 Jun 2022 20:00:44 -0700 X-Received: from mga09.intel.com (mga09.intel.com [134.134.136.24]) by mx.groups.io with SMTP id smtpd.web08.27749.1654484424914450989 for ; Sun, 05 Jun 2022 20:00:43 -0700 X-IronPort-AV: E=McAfee;i="6400,9594,10369"; a="276458143" X-IronPort-AV: E=Sophos;i="5.91,280,1647327600"; d="scan'208";a="276458143" X-Received: from fmsmga004.fm.intel.com ([10.253.24.48]) by orsmga102.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 05 Jun 2022 20:00:43 -0700 X-IronPort-AV: E=Sophos;i="5.91,280,1647327600"; d="scan'208";a="647285811" X-Received: from mxu9-mobl1.ccr.corp.intel.com ([10.255.29.66]) by fmsmga004-auth.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 05 Jun 2022 20:00:41 -0700 From: "Min Xu" To: devel@edk2.groups.io Cc: Min M Xu , Erdem Aktas , Gerd Hoffmann , James Bottomley , Jiewen Yao , Tom Lendacky Subject: [edk2-devel] [PATCH 10/14] OvmfPkg: Introduce lazy accept in PlatformInitLib and PlatformPei Date: Mon, 6 Jun 2022 10:59:58 +0800 Message-Id: In-Reply-To: References: MIME-Version: 1.0 Precedence: Bulk List-Unsubscribe: List-Subscribe: List-Help: Sender: devel@edk2.groups.io List-Id: Mailing-List: list devel@edk2.groups.io; contact devel+owner@edk2.groups.io Reply-To: devel@edk2.groups.io,min.m.xu@intel.com X-Gm-Message-State: WUUFOfXKe95vbhQC2Ca4gO1Ax1787277AA= Content-Transfer-Encoding: quoted-printable DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=groups.io; q=dns/txt; s=20140610; t=1654484444; bh=47oLgXfNxiwpxM48JppqOWd+OyE1WLNdOsnGzbZg7WU=; h=Cc:Date:From:Reply-To:Subject:To; b=qi/+CnxZ5iRDsH97dBK2TSlYrxazcIo2fFxbLpUzZlQh0WNEcyt2vn6BRuKUlTzS4nX JdYwgzAMSLV4IYV6/0uZopKNmDoYyixNPmnPQQH/o2t49tTm9+r3PIbkK1rkht/GzDRfT F1W+u2IxEmGZ++oOv+NyL4sf6hzOlB1JkPc= X-ZohoMail-DKIM: pass (identity @groups.io) X-ZM-MESSAGEID: 1654484444968100032 Content-Type: text/plain; charset="utf-8" From: Min M Xu RFC: https://bugzilla.tianocore.org/show_bug.cgi?id=3D3937 There are below major changes in PlatformInitLib/PlatformPei 1. ProcessHobList The unaccepted memory is accepted if the accumulated accepted memory is smaller than the LazyAcceptMemSize. If a EFI_RESOURCE_MEMORY_UNACCEPTED hob is cross the LazyAcceptMemSize, it will be split into 2 parts and only the left one is accepted. The max accepted memory address is stored in Tdx workarea which will be used in TransferTdxHobList. 2. TransferTdxHobList Transfer the unaccepted memory hob to EFI_RESOURCE_SYSTEM_MEMORY hob if it is accepted. As it is mentioned in 1), there may be a EFI_RESOURCE_MEMORY_UNACCEPTED hob which only part of the memory describes in the hob is accepted. We also handles this situation in TransferTdxHobList. 3. PlatformAdjustSystemMemorySizeBelow4gbForLazyAccep The system memory size below 4GB may be larger than the accepted memory. This function is used to handle this situation. Cc: Erdem Aktas Cc: Gerd Hoffmann Cc: James Bottomley Cc: Jiewen Yao Cc: Tom Lendacky Signed-off-by: Min Xu --- OvmfPkg/Include/Library/PlatformInitLib.h | 6 + OvmfPkg/Library/PlatformInitLib/IntelTdx.c | 143 ++++++++++++++++-- OvmfPkg/Library/PlatformInitLib/MemDetect.c | 27 ++++ .../PlatformInitLib/PlatformInitLib.inf | 1 + OvmfPkg/PlatformPei/MemDetect.c | 5 + 5 files changed, 171 insertions(+), 11 deletions(-) diff --git a/OvmfPkg/Include/Library/PlatformInitLib.h b/OvmfPkg/Include/Li= brary/PlatformInitLib.h index 2987a367cc9c..187efcf34e14 100644 --- a/OvmfPkg/Include/Library/PlatformInitLib.h +++ b/OvmfPkg/Include/Library/PlatformInitLib.h @@ -144,6 +144,12 @@ PlatformGetSystemMemorySizeBelow4gb ( IN EFI_HOB_PLATFORM_INFO *PlatformInfoHob ); =20 +UINT32 +EFIAPI +PlatformAdjustSystemMemorySizeBelow4gbForLazyAccept ( + IN UINT32 LowerMemorySize + ); + /** Initialize the PhysMemAddressWidth field in PlatformInfoHob based on gue= st RAM size. **/ diff --git a/OvmfPkg/Library/PlatformInitLib/IntelTdx.c b/OvmfPkg/Library/P= latformInitLib/IntelTdx.c index 396b14d919d2..7be466ee34d1 100644 --- a/OvmfPkg/Library/PlatformInitLib/IntelTdx.c +++ b/OvmfPkg/Library/PlatformInitLib/IntelTdx.c @@ -24,7 +24,8 @@ #include #include =20 -#define ALIGNED_2MB_MASK 0x1fffff +#define ALIGNED_2MB_MASK 0x1fffff +#define MEGABYTE_SHIFT 20 =20 /** This function will be called to accept pages. Only BSP accepts pages. @@ -375,15 +376,33 @@ ProcessHobList ( EFI_STATUS Status; EFI_PEI_HOB_POINTERS Hob; EFI_PHYSICAL_ADDRESS PhysicalEnd; + TDX_WORK_AREA *WorkArea; + UINT64 ResourceLength; + UINT64 AccumulateAcceptedMemory; + UINT64 LazyAcceptMemSize; + UINT64 MaxAcceptedMemoryAddress; =20 Status =3D EFI_SUCCESS; ASSERT (VmmHobList !=3D NULL); Hob.Raw =3D (UINT8 *)VmmHobList; =20 + AccumulateAcceptedMemory =3D 0; + MaxAcceptedMemoryAddress =3D 0; + LazyAcceptMemSize =3D FixedPcdGet64 (PcdLazyAcceptPartialMemorySi= ze); + // + // If specified accept size is zero, accept all of the memory. + // Else transfer the size in megabyte to the number in byte. + // + if (LazyAcceptMemSize =3D=3D 0) { + LazyAcceptMemSize =3D MAX_UINT64; + } else { + LazyAcceptMemSize <<=3D MEGABYTE_SHIFT; + } + // // Parse the HOB list until end of list or matching type is found. // - while (!END_OF_HOB_LIST (Hob)) { + while (!END_OF_HOB_LIST (Hob) && AccumulateAcceptedMemory < LazyAcceptMe= mSize) { if (Hob.Header->HobType =3D=3D EFI_HOB_TYPE_RESOURCE_DESCRIPTOR) { DEBUG ((DEBUG_INFO, "\nResourceType: 0x%x\n", Hob.ResourceDescriptor= ->ResourceType)); =20 @@ -393,7 +412,17 @@ ProcessHobList ( DEBUG ((DEBUG_INFO, "ResourceLength: 0x%llx\n", Hob.ResourceDescri= ptor->ResourceLength)); DEBUG ((DEBUG_INFO, "Owner: %g\n\n", &Hob.ResourceDescriptor->Owne= r)); =20 - PhysicalEnd =3D Hob.ResourceDescriptor->PhysicalStart + Hob.Resour= ceDescriptor->ResourceLength; + PhysicalEnd =3D Hob.ResourceDescriptor->PhysicalStart + Hob.Res= ourceDescriptor->ResourceLength; + ResourceLength =3D Hob.ResourceDescriptor->ResourceLength; + + if (AccumulateAcceptedMemory + ResourceLength > LazyAcceptMemSize)= { + // + // If the memory can't be accepted completely, accept the part o= f it to meet the + // PcdLazyAcceptPartialMemorySize. + // + ResourceLength =3D LazyAcceptMemSize - AccumulateAcceptedMemory; + PhysicalEnd =3D Hob.ResourceDescriptor->PhysicalStart + Resou= rceLength; + } =20 Status =3D BspAcceptMemoryResourceRange ( Hob.ResourceDescriptor->PhysicalStart, @@ -402,12 +431,26 @@ ProcessHobList ( if (EFI_ERROR (Status)) { break; } + + AccumulateAcceptedMemory +=3D ResourceLength; + MaxAcceptedMemoryAddress =3D PhysicalEnd; } } =20 Hob.Raw =3D GET_NEXT_HOB (Hob); } =20 + // + // Record MaxAcceptedMemoryAddress in OvmfWorkArea. + // This information is needed in TransferTdxHobList and ContructFwHobLis= t(at PeilessStartupLib). + // But in SEC phase we cannot use a global variable to pass this value. = So it has + // to be stored in OvmfWorkarea. + // + WorkArea =3D (TDX_WORK_AREA *)FixedPcdGet32 (PcdOvmfWorkAreaBase); + ASSERT (WorkArea !=3D NULL); + ASSERT (WorkArea->Header.GuestType =3D=3D CcGuestTypeIntelTdx); + WorkArea->SecTdxWorkArea.MaxAcceptedMemoryAddress =3D MaxAcceptedMemoryA= ddress; + return Status; } =20 @@ -460,6 +503,74 @@ ProcessTdxHobList ( return Status; } =20 +/** + * Build ResourceDescriptorHob for the unaccepted memory region. + * This memory region may be splitted into 2 parts because of lazy accept. + * + * @param Hob Point to the EFI_HOB_RESOURCE_DESCRIPTOR + * @param MaxAcceptedMemoryAddress The max accepted memory address + * @return VOID + */ +VOID +BuildResourceDescriptorHobForUnacceptedMemory ( + IN EFI_HOB_RESOURCE_DESCRIPTOR *Hob, + IN UINT64 MaxAcceptedMemoryAddress + ) +{ + EFI_PHYSICAL_ADDRESS PhysicalStart; + EFI_PHYSICAL_ADDRESS PhysicalEnd; + UINT64 ResourceLength; + EFI_RESOURCE_TYPE ResourceType; + EFI_RESOURCE_ATTRIBUTE_TYPE ResourceAttribute; + UINT64 AcceptedResourceLength; + + ASSERT (Hob->ResourceType =3D=3D EFI_RESOURCE_MEMORY_UNACCEPTED); + + ResourceType =3D EFI_RESOURCE_MEMORY_UNACCEPTED; + ResourceAttribute =3D Hob->ResourceAttribute; + PhysicalStart =3D Hob->PhysicalStart; + ResourceLength =3D Hob->ResourceLength; + PhysicalEnd =3D PhysicalStart + ResourceLength; + + if (PhysicalEnd <=3D MaxAcceptedMemoryAddress) { + // + // This memory region has been accepted. + // + ResourceType =3D EFI_RESOURCE_SYSTEM_MEMORY; + ResourceAttribute |=3D (EFI_RESOURCE_ATTRIBUTE_PRESENT | EFI_RESOURCE_= ATTRIBUTE_INITIALIZED | EFI_RESOURCE_ATTRIBUTE_TESTED); + } else if (PhysicalStart >=3D MaxAcceptedMemoryAddress) { + // + // This memory region hasn't been accepted. + // So keep the ResourceType and ResourceAttribute unchange. + // + } else { + // + // This memory region is splitted into 2 parts: + // the accepted and unaccepted. + // + AcceptedResourceLength =3D MaxAcceptedMemoryAddress - Hob->PhysicalSta= rt; + + // We build the ResourceDescriptorHob for the accepted part. + // The unaccepted part will be build out side the if-else block. + BuildResourceDescriptorHob ( + EFI_RESOURCE_SYSTEM_MEMORY, + ResourceAttribute | (EFI_RESOURCE_ATTRIBUTE_PRESENT | EFI_RESOURCE_A= TTRIBUTE_INITIALIZED | EFI_RESOURCE_ATTRIBUTE_TESTED), + Hob->PhysicalStart, + AcceptedResourceLength + ); + + PhysicalStart =3D Hob->PhysicalStart + AcceptedResourceLength; + ResourceLength -=3D AcceptedResourceLength; + } + + BuildResourceDescriptorHob ( + ResourceType, + ResourceAttribute, + PhysicalStart, + ResourceLength + ); +} + /** Transfer the incoming HobList for the TD to the final HobList for Dxe. The Hobs transferred in this function are ResourceDescriptor hob and @@ -477,6 +588,16 @@ TransferTdxHobList ( EFI_PEI_HOB_POINTERS Hob; EFI_RESOURCE_TYPE ResourceType; EFI_RESOURCE_ATTRIBUTE_TYPE ResourceAttribute; + UINT64 MaxAcceptedMemoryAddress; + TDX_WORK_AREA *WorkArea; + + WorkArea =3D (TDX_WORK_AREA *)FixedPcdGet32 (PcdOvmfWorkAreaBase); + ASSERT (WorkArea !=3D NULL); + ASSERT (WorkArea->Header.GuestType =3D=3D CcGuestTypeIntelTdx); + MaxAcceptedMemoryAddress =3D WorkArea->SecTdxWorkArea.MaxAcceptedMemoryA= ddress; + if (MaxAcceptedMemoryAddress =3D=3D 0) { + MaxAcceptedMemoryAddress =3D MAX_UINT64; + } =20 // // PcdOvmfSecGhcbBase is used as the TD_HOB in Tdx guest. @@ -489,16 +610,16 @@ TransferTdxHobList ( ResourceAttribute =3D Hob.ResourceDescriptor->ResourceAttribute; =20 if (ResourceType =3D=3D EFI_RESOURCE_MEMORY_UNACCEPTED) { - ResourceType =3D EFI_RESOURCE_SYSTEM_MEMORY; - ResourceAttribute |=3D (EFI_RESOURCE_ATTRIBUTE_PRESENT | EFI_RES= OURCE_ATTRIBUTE_INITIALIZED | EFI_RESOURCE_ATTRIBUTE_TESTED); + BuildResourceDescriptorHobForUnacceptedMemory (Hob.ResourceDescr= iptor, MaxAcceptedMemoryAddress); + } else { + BuildResourceDescriptorHob ( + ResourceType, + ResourceAttribute, + Hob.ResourceDescriptor->PhysicalStart, + Hob.ResourceDescriptor->ResourceLength + ); } =20 - BuildResourceDescriptorHob ( - ResourceType, - ResourceAttribute, - Hob.ResourceDescriptor->PhysicalStart, - Hob.ResourceDescriptor->ResourceLength - ); break; case EFI_HOB_TYPE_MEMORY_ALLOCATION: BuildMemoryAllocationHob ( diff --git a/OvmfPkg/Library/PlatformInitLib/MemDetect.c b/OvmfPkg/Library/= PlatformInitLib/MemDetect.c index c28d7601f87e..2bb346f31d44 100644 --- a/OvmfPkg/Library/PlatformInitLib/MemDetect.c +++ b/OvmfPkg/Library/PlatformInitLib/MemDetect.c @@ -41,6 +41,8 @@ Module Name: =20 #include =20 +#define MEGABYTE_SHIFT 20 + VOID EFIAPI PlatformQemuUc32BaseInitialization ( @@ -288,6 +290,31 @@ GetHighestSystemMemoryAddressFromPvhMemmap ( return HighestAddress; } =20 +UINT32 +EFIAPI +PlatformAdjustSystemMemorySizeBelow4gbForLazyAccept ( + IN UINT32 LowerMemorySize + ) +{ + #ifdef MDE_CPU_X64 + UINT64 LazyAcceptMemSize; + + LazyAcceptMemSize =3D FixedPcdGet64 (PcdLazyAcceptPartialMemorySize); + // + // If specified accept size is not zero, + // transfer the size in megabyte to the number in byte. + // + if (LazyAcceptMemSize !=3D 0) { + LazyAcceptMemSize <<=3D MEGABYTE_SHIFT; + if (LazyAcceptMemSize < LowerMemorySize) { + LowerMemorySize =3D (UINT32)(UINTN)LazyAcceptMemSize; + } + } + + #endif + return LowerMemorySize; +} + UINT32 EFIAPI PlatformGetSystemMemorySizeBelow4gb ( diff --git a/OvmfPkg/Library/PlatformInitLib/PlatformInitLib.inf b/OvmfPkg/= Library/PlatformInitLib/PlatformInitLib.inf index d2a0bec43452..affb2fb90408 100644 --- a/OvmfPkg/Library/PlatformInitLib/PlatformInitLib.inf +++ b/OvmfPkg/Library/PlatformInitLib/PlatformInitLib.inf @@ -95,6 +95,7 @@ gUefiOvmfPkgTokenSpaceGuid.PcdGuidedExtractHandlerTableSize =20 gUefiOvmfPkgTokenSpaceGuid.PcdTdxAcceptPageSize + gUefiOvmfPkgTokenSpaceGuid.PcdLazyAcceptPartialMemorySize =20 [FeaturePcd] gEfiMdeModulePkgTokenSpaceGuid.PcdDxeIplSwitchToLongMode diff --git a/OvmfPkg/PlatformPei/MemDetect.c b/OvmfPkg/PlatformPei/MemDetec= t.c index 2e47b1322990..acc1d7f63ee8 100644 --- a/OvmfPkg/PlatformPei/MemDetect.c +++ b/OvmfPkg/PlatformPei/MemDetect.c @@ -279,6 +279,11 @@ PublishPeiMemory ( LowerMemorySize -=3D mPlatformInfoHob.Q35TsegMbytes * SIZE_1MB; } =20 + // + // Adjustment for Lazy accept because it may accept part of the memory. + // + LowerMemorySize =3D PlatformAdjustSystemMemorySizeBelow4gbForLazyAccept = (LowerMemorySize); + S3AcpiReservedMemoryBase =3D 0; S3AcpiReservedMemorySize =3D 0; =20 --=20 2.29.2.windows.2 -=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#90226): https://edk2.groups.io/g/devel/message/90226 Mute This Topic: https://groups.io/mt/91570207/1787277 Group Owner: devel+owner@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [importer@patchew.org] -=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-