From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail02.groups.io (mail02.groups.io [66.175.222.108]) by spool.mail.gandi.net (Postfix) with ESMTPS id B8425941946 for ; Wed, 24 Jan 2024 15:00:12 +0000 (UTC) DKIM-Signature: a=rsa-sha256; bh=J6L2K2CEQlPSEPtc3fe1GxZvpIdNfHTXcqJjmBBO3rc=; c=relaxed/simple; d=groups.io; h=From:To:Cc:References:In-Reply-To:Subject:Date:Message-ID:MIME-Version:Thread-Index:Precedence:List-Subscribe:List-Help:Sender:List-Id:Mailing-List:Delivered-To:Reply-To:List-Unsubscribe-Post:List-Unsubscribe:Content-Type:Content-Transfer-Encoding:Content-Language; s=20140610; t=1706108411; v=1; b=bmX+7TcHyjy+Al8BpTZOUGaEKlhwVOtLpXp3aAcWnWmq0LUpA4pzFqzUFOowsTZjxB1eVlVS vpYZ+yi/PVXqMvZJPXIJEi0RNMMzH0vM/dU7M5pcsdOBZQA4rZr7S9jmCW4oMZHahw19ZwFqMht SXFYV3XxAgirjAUy+4p/DB0Y= X-Received: by 127.0.0.2 with SMTP id xBmXYY7687511xY9okYVDvyu; Wed, 24 Jan 2024 07:00:11 -0800 X-Received: from cxsh.intel-email.com (cxsh.intel-email.com [121.46.250.151]) by mx.groups.io with SMTP id smtpd.web11.24674.1706108391120549943 for ; Wed, 24 Jan 2024 07:00:10 -0800 X-Received: from cxsh.intel-email.com (localhost [127.0.0.1]) by cxsh.intel-email.com (Postfix) with ESMTP id 85EABDDA79D for ; Wed, 24 Jan 2024 22:59:46 +0800 (CST) X-Received: from localhost (localhost [127.0.0.1]) by cxsh.intel-email.com (Postfix) with ESMTP id 80CCDDDA798 for ; Wed, 24 Jan 2024 22:59:46 +0800 (CST) X-Received: from mail.byosoft.com.cn (mail.byosoft.com.cn [58.240.74.242]) by cxsh.intel-email.com (Postfix) with SMTP id C79F9DDA792 for ; Wed, 24 Jan 2024 22:59:41 +0800 (CST) X-Received: from DESKTOPS6D0PVI ([114.93.194.54]) (envelope-sender ) by 192.168.6.13 with ESMTP(SSL) for ; Wed, 24 Jan 2024 22:59:35 +0800 X-WM-Sender: gaoliming@byosoft.com.cn X-Originating-IP: 114.93.194.54 X-WM-AuthFlag: YES X-WM-AuthUser: gaoliming@byosoft.com.cn From: "gaoliming via groups.io" To: "'Michael D Kinney'" , Cc: "'Aaron Li'" , "'Liu Yun'" , "'Andrew Fish'" References: <20240123202424.1960-1-michael.d.kinney@intel.com> In-Reply-To: <20240123202424.1960-1-michael.d.kinney@intel.com> Subject: =?UTF-8?B?W2VkazItZGV2ZWxdIOWbnuWkjTogW1BhdGNoIHYyIDEvMV0gTWRlTW9kdWxlUGtnL0NvcmUvRHhlOiBTZXQgTWVtb3J5VHlwZUluZm8gYmluIHJhbmdlIGZyb20gSE9C?= Date: Wed, 24 Jan 2024 22:59:37 +0800 Message-ID: <01d301da4ed5$f3527940$d9f76bc0$@byosoft.com.cn> MIME-Version: 1.0 Thread-Index: AQKlaLmYUGFC0Hf9tRtlc8DcZosrw69S2Ttw Precedence: Bulk 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,gaoliming@byosoft.com.cn List-Unsubscribe-Post: List-Unsubscribe=One-Click List-Unsubscribe: X-Gm-Message-State: lVxyk2OAA2N5ceiZx2Hp9jxMx7686176AA= Content-Type: text/plain; charset="gb2312" Content-Transfer-Encoding: quoted-printable Content-Language: zh-cn X-GND-Status: LEGIT Authentication-Results: spool.mail.gandi.net; dkim=pass header.d=groups.io header.s=20140610 header.b=bmX+7TcH; dmarc=none; spf=pass (spool.mail.gandi.net: domain of bounce@groups.io designates 66.175.222.108 as permitted sender) smtp.mailfrom=bounce@groups.io Mike: Current algorithm tries to reserve the top available memory for memory typ= e bin range.=20 If the platform uses new way to describe the memory range, should we suggest the rule to still=20 use the top memory resource hob for the memory type bin range? Thanks Liming > -----=D3=CA=BC=FE=D4=AD=BC=FE----- > =B7=A2=BC=FE=C8=CB: Michael D Kinney > =B7=A2=CB=CD=CA=B1=BC=E4: 2024=C4=EA1=D4=C224=C8=D5 4:24 > =CA=D5=BC=FE=C8=CB: devel@edk2.groups.io > =B3=AD=CB=CD: Liming Gao ; Aaron Li > ; Liu Yun ; Andrew Fish > > =D6=F7=CC=E2: [Patch v2 1/1] MdeModulePkg/Core/Dxe: Set MemoryTypeInfo bi= n > range from HOB >=20 > Provide an optional method for PEI to declare a specific address > range to use for the Memory Type Information bins. The current > algorithm uses heuristics that tends to place the Memory Type > Information bins in the same location, but memory configuration > changes across boots or algorithm changes across a firmware > updates could potentially change the Memory Type Information bin > location. >=20 > If the HOB List contains a Resource Descriptor HOB that > describes tested system memory and has an Owner GUID of > gEfiMemoryTypeInformationGuid, then use the address range > described by the Resource Descriptor HOB as the preferred > location of the Memory Type Information bins. If this HOB is > not detected, then the current behavior is preserved. >=20 > The HOB with an Owner GUID of gEfiMemoryTypeInformationGuid > is ignored for the following conditions: > * The HOB with an Owner GUID of gEfiMemoryTypeInformationGuid > is smaller than the Memory Type Information bins. > * The HOB list contains more than one Resource Descriptor HOB > with an owner GUID of gEfiMemoryTypeInformationGuid. > * The Resource Descriptor HOB with an Owner GUID of > gEfiMemoryTypeInformationGuid is the same Resource Descriptor > HOB that that describes the PHIT memory range. >=20 > Update the DxeMain initialization order to initialize GCD > services before any runtime allocations are performed. This > is required to prevent runtime data fragmentation when the > UEFI System Table and UEFI Runtime Service Table is allocated. >=20 > Cc: Liming Gao > Cc: Aaron Li > Cc: Liu Yun > Cc: Andrew Fish > Signed-off-by: Michael D Kinney > --- > MdeModulePkg/Core/Dxe/DxeMain.h | 6 ++ > MdeModulePkg/Core/Dxe/DxeMain/DxeMain.c | 23 +++--- > MdeModulePkg/Core/Dxe/Gcd/Gcd.c | 72 ++++++++++++++++- > MdeModulePkg/Core/Dxe/Mem/Page.c | 101 > ++++++++++++++++++++++++ > 4 files changed, 190 insertions(+), 12 deletions(-) >=20 > diff --git a/MdeModulePkg/Core/Dxe/DxeMain.h > b/MdeModulePkg/Core/Dxe/DxeMain.h > index 86a7be2f5188..53e26703f8c7 100644 > --- a/MdeModulePkg/Core/Dxe/DxeMain.h > +++ b/MdeModulePkg/Core/Dxe/DxeMain.h > @@ -277,6 +277,12 @@ CoreInitializePool ( > VOID > ); >=20 > +VOID > +CoreSetMemoryTypeInformationRange ( > + IN EFI_PHYSICAL_ADDRESS Start, > + IN UINT64 Length > + ); > + > /** > Called to initialize the memory map and add descriptors to > the current descriptor list. > diff --git a/MdeModulePkg/Core/Dxe/DxeMain/DxeMain.c > b/MdeModulePkg/Core/Dxe/DxeMain/DxeMain.c > index 0e0f9769b99d..17d510a287e5 100644 > --- a/MdeModulePkg/Core/Dxe/DxeMain/DxeMain.c > +++ b/MdeModulePkg/Core/Dxe/DxeMain/DxeMain.c > @@ -276,6 +276,18 @@ DxeMain ( >=20 > MemoryProfileInit (HobStart); >=20 > + // > + // Start the Image Services. > + // > + Status =3D CoreInitializeImageServices (HobStart); > + ASSERT_EFI_ERROR (Status); > + > + // > + // Initialize the Global Coherency Domain Services > + // > + Status =3D CoreInitializeGcdServices (&HobStart, MemoryBaseAddress, > MemoryLength); > + ASSERT_EFI_ERROR (Status); > + > // > // Allocate the EFI System Table and EFI Runtime Service Table from > EfiRuntimeServicesData > // Use the templates to initialize the contents of the EFI System Tabl= e and > EFI Runtime Services Table > @@ -289,16 +301,9 @@ DxeMain ( > gDxeCoreST->RuntimeServices =3D gDxeCoreRT; >=20 > // > - // Start the Image Services. > + // Update DXE Core Loaded Image Protocol with allocated UEFI System > Table > // > - Status =3D CoreInitializeImageServices (HobStart); > - ASSERT_EFI_ERROR (Status); > - > - // > - // Initialize the Global Coherency Domain Services > - // > - Status =3D CoreInitializeGcdServices (&HobStart, MemoryBaseAddress, > MemoryLength); > - ASSERT_EFI_ERROR (Status); > + gDxeCoreLoadedImage->SystemTable =3D gDxeCoreST; >=20 > // > // Call constructor for all libraries > diff --git a/MdeModulePkg/Core/Dxe/Gcd/Gcd.c > b/MdeModulePkg/Core/Dxe/Gcd/Gcd.c > index 792cd2e0af23..c450d1bf2531 100644 > --- a/MdeModulePkg/Core/Dxe/Gcd/Gcd.c > +++ b/MdeModulePkg/Core/Dxe/Gcd/Gcd.c > @@ -2238,6 +2238,8 @@ CoreInitializeMemoryServices ( > EFI_HOB_HANDOFF_INFO_TABLE *PhitHob; > EFI_HOB_RESOURCE_DESCRIPTOR *ResourceHob; > EFI_HOB_RESOURCE_DESCRIPTOR *PhitResourceHob; > + EFI_HOB_RESOURCE_DESCRIPTOR > *MemoryTypeInformationResourceHob; > + UINTN Count; > EFI_PHYSICAL_ADDRESS BaseAddress; > UINT64 Length; > UINT64 Attributes; > @@ -2289,12 +2291,47 @@ CoreInitializeMemoryServices ( > // > // See if a Memory Type Information HOB is available > // > - GuidHob =3D GetFirstGuidHob (&gEfiMemoryTypeInformationGuid); > + MemoryTypeInformationResourceHob =3D NULL; > + GuidHob =3D GetFirstGuidHob > (&gEfiMemoryTypeInformationGuid); > if (GuidHob !=3D NULL) { > EfiMemoryTypeInformation =3D GET_GUID_HOB_DATA (GuidHob); > DataSize =3D GET_GUID_HOB_DATA_SIZE (GuidHob); > if ((EfiMemoryTypeInformation !=3D NULL) && (DataSize > 0) && (DataS= ize > <=3D (EfiMaxMemoryType + 1) * sizeof (EFI_MEMORY_TYPE_INFORMATION))) { > CopyMem (&gMemoryTypeInformation, EfiMemoryTypeInformation, > DataSize); > + > + // > + // Look for Resource Descriptor HOB with a ResourceType of System > Memory > + // and an Owner GUID of gEfiMemoryTypeInformationGuid. If more > than 1 is > + // found, then set MemoryTypeInformationResourceHob to NULL. > + // > + Count =3D 0; > + for (Hob.Raw =3D *HobStart; !END_OF_HOB_LIST (Hob); Hob.Raw =3D > GET_NEXT_HOB (Hob)) { > + if (GET_HOB_TYPE (Hob) !=3D > EFI_HOB_TYPE_RESOURCE_DESCRIPTOR) { > + continue; > + } > + > + ResourceHob =3D Hob.ResourceDescriptor; > + if (!CompareGuid (&ResourceHob->Owner, > &gEfiMemoryTypeInformationGuid)) { > + continue; > + } > + > + Count++; > + if (ResourceHob->ResourceType !=3D > EFI_RESOURCE_SYSTEM_MEMORY) { > + continue; > + } > + > + if ((ResourceHob->ResourceAttribute & > MEMORY_ATTRIBUTE_MASK) !=3D TESTED_MEMORY_ATTRIBUTES) { > + continue; > + } > + > + if (ResourceHob->ResourceLength >=3D > CalculateTotalMemoryBinSizeNeeded ()) { > + MemoryTypeInformationResourceHob =3D ResourceHob; > + } > + } > + > + if (Count > 1) { > + MemoryTypeInformationResourceHob =3D NULL; > + } > } > } >=20 > @@ -2344,6 +2381,15 @@ CoreInitializeMemoryServices ( > PhitResourceHob =3D ResourceHob; > Found =3D TRUE; >=20 > + // > + // If a Memory Type Information Resource HOB was found and is the > same > + // Resource HOB that describes the PHIT HOB, then ignore the Memory > Type > + // Information Resource HOB. > + // > + if (MemoryTypeInformationResourceHob =3D=3D PhitResourceHob) { > + MemoryTypeInformationResourceHob =3D NULL; > + } > + > // > // Compute range between PHIT EfiMemoryTop and the end of the > Resource Descriptor HOB > // > @@ -2387,8 +2433,9 @@ CoreInitializeMemoryServices ( > if (Length < MinimalMemorySizeNeeded) { > // > // Search all the resource descriptor HOBs from the highest possible > addresses down for a memory > - // region that is big enough to initialize the DXE core. Always ski= p the > PHIT Resource HOB. > - // The max address must be within the physically addressible range for > the processor. > + // region that is big enough to initialize the DXE core. Always ski= p the > PHIT Resource HOB > + // and the Memory Type Information Resource HOB. The max address > must be within the physically > + // addressable range for the processor. > // > HighAddress =3D MAX_ALLOC_ADDRESS; > for (Hob.Raw =3D *HobStart; !END_OF_HOB_LIST (Hob); Hob.Raw =3D > GET_NEXT_HOB (Hob)) { > @@ -2399,6 +2446,13 @@ CoreInitializeMemoryServices ( > continue; > } >=20 > + // > + // Skip the Resource Descriptor HOB that contains Memory Type > Information bins > + // > + if (Hob.ResourceDescriptor =3D=3D MemoryTypeInformationResourceHob= ) > { > + continue; > + } > + > // > // Skip all HOBs except Resource Descriptor HOBs > // > @@ -2466,6 +2520,18 @@ CoreInitializeMemoryServices ( > Capabilities =3D > CoreConvertResourceDescriptorHobAttributesToCapabilities > (EfiGcdMemoryTypeSystemMemory, Attributes); > } >=20 > + if (MemoryTypeInformationResourceHob !=3D NULL) { > + // > + // If a Memory Type Information Resource HOB was found, then use the > address > + // range of the Memory Type Information Resource HOB as the > preferred > + // address range for the Memory Type Information bins. > + // > + CoreSetMemoryTypeInformationRange ( > + MemoryTypeInformationResourceHob->PhysicalStart, > + MemoryTypeInformationResourceHob->ResourceLength > + ); > + } > + > // > // Declare the very first memory region, so the EFI Memory Services ar= e > available. > // > diff --git a/MdeModulePkg/Core/Dxe/Mem/Page.c > b/MdeModulePkg/Core/Dxe/Mem/Page.c > index 6497af573353..458c62090265 100644 > --- a/MdeModulePkg/Core/Dxe/Mem/Page.c > +++ b/MdeModulePkg/Core/Dxe/Mem/Page.c > @@ -532,6 +532,107 @@ CoreLoadingFixedAddressHook ( > return; > } >=20 > +/** > + Sets the preferred memory range to use for the Memory Type Information > bins. > + This service must be called before fist call to CoreAddMemoryDescriptor(). > + > + If the location of the Memory Type Information bins has already been > + established or the size of the range provides is smaller than all the > + Memory Type Information bins, then the range provides is not used. > + > + @param Start The start address of the Memory Type Information > range. > + @param Length The size, in bytes, of the Memory Type Information > range. > +**/ > +VOID > +CoreSetMemoryTypeInformationRange ( > + IN EFI_PHYSICAL_ADDRESS Start, > + IN UINT64 Length > + ) > +{ > + EFI_PHYSICAL_ADDRESS Top; > + EFI_MEMORY_TYPE Type; > + UINTN Index; > + UINTN Size; > + > + // > + // Return if Memory Type Information bin locations have already been set > + // > + if (mMemoryTypeInformationInitialized) { > + return; > + } > + > + // > + // Return if size of the Memory Type Information bins is greater than > Length > + // > + Size =3D 0; > + for (Index =3D 0; gMemoryTypeInformation[Index].Type !=3D > EfiMaxMemoryType; Index++) { > + // > + // Make sure the memory type in the gMemoryTypeInformation[] array > is valid > + // > + Type =3D (EFI_MEMORY_TYPE)(gMemoryTypeInformation[Index].Type); > + if ((UINT32)Type > EfiMaxMemoryType) { > + continue; > + } > + > + Size +=3D EFI_PAGES_TO_SIZE > (gMemoryTypeInformation[Index].NumberOfPages); > + } > + > + if (Size > Length) { > + return; > + } > + > + // > + // Loop through each memory type in the order specified by the > + // gMemoryTypeInformation[] array > + // > + Top =3D Start + Length; > + for (Index =3D 0; gMemoryTypeInformation[Index].Type !=3D > EfiMaxMemoryType; Index++) { > + // > + // Make sure the memory type in the gMemoryTypeInformation[] array > is valid > + // > + Type =3D (EFI_MEMORY_TYPE)(gMemoryTypeInformation[Index].Type); > + if ((UINT32)Type > EfiMaxMemoryType) { > + continue; > + } > + > + if (gMemoryTypeInformation[Index].NumberOfPages !=3D 0) { > + mMemoryTypeStatistics[Type].MaximumAddress =3D Top - 1; > + Top -=3D > EFI_PAGES_TO_SIZE (gMemoryTypeInformation[Index].NumberOfPages); > + mMemoryTypeStatistics[Type].BaseAddress =3D Top; > + > + // > + // If the current base address is the lowest address so far, then > update > + // the default maximum address > + // > + if (mMemoryTypeStatistics[Type].BaseAddress < > mDefaultMaximumAddress) { > + mDefaultMaximumAddress =3D > mMemoryTypeStatistics[Type].BaseAddress - 1; > + } > + > + mMemoryTypeStatistics[Type].NumberOfPages =3D > gMemoryTypeInformation[Index].NumberOfPages; > + gMemoryTypeInformation[Index].NumberOfPages =3D 0; > + } > + } > + > + // > + // If the number of pages reserved for a memory type is 0, then all > + // allocations for that type should be in the default range. > + // > + for (Type =3D (EFI_MEMORY_TYPE)0; Type < EfiMaxMemoryType; Type++) { > + for (Index =3D 0; gMemoryTypeInformation[Index].Type !=3D > EfiMaxMemoryType; Index++) { > + if (Type =3D=3D > (EFI_MEMORY_TYPE)gMemoryTypeInformation[Index].Type) { > + mMemoryTypeStatistics[Type].InformationIndex =3D Index; > + } > + } > + > + mMemoryTypeStatistics[Type].CurrentNumberOfPages =3D 0; > + if (mMemoryTypeStatistics[Type].MaximumAddress =3D=3D > MAX_ALLOC_ADDRESS) { > + mMemoryTypeStatistics[Type].MaximumAddress =3D > mDefaultMaximumAddress; > + } > + } > + > + mMemoryTypeInformationInitialized =3D TRUE; > +} > + > /** > Called to initialize the memory map and add descriptors to > the current descriptor list. > -- > 2.40.1.windows.1 -=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 (#114308): https://edk2.groups.io/g/devel/message/114308 Mute This Topic: https://groups.io/mt/103933112/7686176 Group Owner: devel+owner@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [rebecca@openfw.io] -=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-