Mike:
  OK. I agree this patch can assure the memory type be always allocated at the 
same address. I have no comments for this change.  

Thanks
Liming
> -----邮件原件-----
> 发件人: Kinney, Michael D <michael.d.kin...@intel.com>
> 发送时间: 2024年1月25日 9:39
> 收件人: devel@edk2.groups.io; gaolim...@byosoft.com.cn; 'Laszlo Ersek'
> <ler...@redhat.com>
> 抄送: Li, Aaron <aaron...@intel.com>; Liu, Yun Y <yun.y....@intel.com>;
> 'Andrew Fish' <af...@apple.com>; Kinney, Michael D
> <michael.d.kin...@intel.com>
> 主题: RE: [edk2-devel] 回复: [Patch v2 1/1] MdeModulePkg/Core/Dxe: Set
> MemoryTypeInfo bin range from HOB
> 
> Hi Liming,
> 
> The exact range that may or may not support S4 resume may be OS
> dependent.
> I am not sure.
> 
> In general, a UEFI OS should not be dependent on specific UEFI memory
> types being above or below specific addresses.
> 
> The only S4 requirement I know of is landing the memory types at the
> same address.
> 
> If you are aware of additional constraints for specific OSes, then
> that is good information, but not sure where to put it.
> 
> Mike
> 
> > -----Original Message-----
> > From: devel@edk2.groups.io <devel@edk2.groups.io> On Behalf Of
> gaoliming
> > via groups.io
> > Sent: Wednesday, January 24, 2024 5:19 PM
> > To: Kinney, Michael D <michael.d.kin...@intel.com>; 'Laszlo Ersek'
> > <ler...@redhat.com>; devel@edk2.groups.io
> > Cc: Li, Aaron <aaron...@intel.com>; Liu, Yun Y <yun.y....@intel.com>;
> > 'Andrew Fish' <af...@apple.com>
> > Subject: 回复: [edk2-devel] 回复: [Patch v2 1/1]
> MdeModulePkg/Core/Dxe:
> > Set MemoryTypeInfo bin range from HOB
> >
> > Mike:
> >   I suggest to document the recommended usage of the specified memory
> > type info bin range. I worry that someone configures the low memory
> > range for the memory type info bin range. It may still cause S4 failure.
> >
> > Thanks
> > Liming
> > > -----邮件原件-----
> > > 发件人: Kinney, Michael D <michael.d.kin...@intel.com>
> > > 发送时间: 2024年1月25日 1:53
> > > 收件人: Laszlo Ersek <ler...@redhat.com>; devel@edk2.groups.io;
> > > gaolim...@byosoft.com.cn
> > > 抄送: Li, Aaron <aaron...@intel.com>; Liu, Yun Y
> > <yun.y....@intel.com>;
> > > 'Andrew Fish' <af...@apple.com>; Kinney, Michael D
> > > <michael.d.kin...@intel.com>
> > > 主题: RE: [edk2-devel] 回复: [Patch v2 1/1] MdeModulePkg/Core/Dxe:
> Set
> > > MemoryTypeInfo bin range from HOB
> > >
> > > Hi Liming,
> > >
> > > The current algorithm allocates the bins from the top of the first
> > > memory range given to the DXE Core.  This is not guaranteed to be
> > > the top of RAM.  The heuristic will use the memory range from the
> > > PHIT HOB if it is considered big enough.  If PHIT is not big enough
> > > then a search of the HOBs is made for one that is considered big
> > > enough near the top of memory that is tested.
> > >
> > > Additional memory can be added or promoted from untested to tested
> > > after DXE Core init and that added or promoted memory may have
> > > a higher address than the initial memory given to the DXE Core.
> > >
> > > With current heuristics, platforms have to carefully construct the
> > > HOBs in PEIM phase to get the behavior where these bins are at the
> > > top of RAM.
> > >
> > > With this feature, it provides precise control over where the
> > > bins are placed.
> > >
> > > Mike
> > >
> > > > -----Original Message-----
> > > > From: Laszlo Ersek <ler...@redhat.com>
> > > > Sent: Wednesday, January 24, 2024 8:17 AM
> > > > To: devel@edk2.groups.io; gaolim...@byosoft.com.cn; Kinney, Michael
> > D
> > > > <michael.d.kin...@intel.com>
> > > > Cc: Li, Aaron <aaron...@intel.com>; Liu, Yun Y
> > <yun.y....@intel.com>;
> > > > 'Andrew Fish' <af...@apple.com>
> > > > Subject: Re: [edk2-devel] 回复: [Patch v2 1/1]
> > MdeModulePkg/Core/Dxe:
> > > > Set MemoryTypeInfo bin range from HOB
> > > >
> > > > On 1/24/24 15:59, gaoliming via groups.io wrote:
> > > > > Mike:
> > > > >  Current algorithm tries to reserve the top available memory for
> > > > memory type
> > > > > bin range.
> > > > >  If the platform uses new way to describe the memory range, should
> > we
> > > > > suggest the rule to still
> > > > >  use the top memory resource hob for the memory type bin range?
> > > >
> > > > How would that work, technically? If the platform specifies a
> > concrete
> > > > address range, how can that be reconciled with using the top of RAM?
> > > >
> > > > Or do you mean documentation? I.e., a note for platform implementors
> > > > that they should point their new HOB to the top of RAM?
> > > >
> > > > Thanks
> > > > Laszlo
> > > >
> > > > >
> > > > > Thanks
> > > > > Liming
> > > > >> -----邮件原件-----
> > > > >> 发件人: Michael D Kinney <michael.d.kin...@intel.com>
> > > > >> 发送时间: 2024年1月24日 4:24
> > > > >> 收件人: devel@edk2.groups.io
> > > > >> 抄送: Liming Gao <gaolim...@byosoft.com.cn>; Aaron Li
> > > > >> <aaron...@intel.com>; Liu Yun <yun.y....@intel.com>; Andrew Fish
> > > > >> <af...@apple.com>
> > > > >> 主题: [Patch v2 1/1] MdeModulePkg/Core/Dxe: Set
> MemoryTypeInfo
> > > bin
> > > > >> range from HOB
> > > > >>
> > > > >> 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.
> > > > >>
> > > > >> 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.
> > > > >>
> > > > >> 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.
> > > > >>
> > > > >> 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.
> > > > >>
> > > > >> Cc: Liming Gao <gaolim...@byosoft.com.cn>
> > > > >> Cc: Aaron Li <aaron...@intel.com>
> > > > >> Cc: Liu Yun <yun.y....@intel.com>
> > > > >> Cc: Andrew Fish <af...@apple.com>
> > > > >> Signed-off-by: Michael D Kinney <michael.d.kin...@intel.com>
> > > > >> ---
> > > > >>  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(-)
> > > > >>
> > > > >> 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
> > > > >>    );
> > > > >>
> > > > >> +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 (
> > > > >>
> > > > >>    MemoryProfileInit (HobStart);
> > > > >>
> > > > >> +  //
> > > > >> +  // Start the Image Services.
> > > > >> +  //
> > > > >> +  Status = CoreInitializeImageServices (HobStart);
> > > > >> +  ASSERT_EFI_ERROR (Status);
> > > > >> +
> > > > >> +  //
> > > > >> +  // Initialize the Global Coherency Domain Services
> > > > >> +  //
> > > > >> +  Status = 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
> > > > Table
> > > > > and
> > > > >> EFI Runtime Services Table
> > > > >> @@ -289,16 +301,9 @@ DxeMain (
> > > > >>    gDxeCoreST->RuntimeServices = gDxeCoreRT;
> > > > >>
> > > > >>    //
> > > > >> -  // Start the Image Services.
> > > > >> +  // Update DXE Core Loaded Image Protocol with allocated UEFI
> > > > System
> > > > >> Table
> > > > >>    //
> > > > >> -  Status = CoreInitializeImageServices (HobStart);
> > > > >> -  ASSERT_EFI_ERROR (Status);
> > > > >> -
> > > > >> -  //
> > > > >> -  // Initialize the Global Coherency Domain Services
> > > > >> -  //
> > > > >> -  Status = CoreInitializeGcdServices (&HobStart,
> > MemoryBaseAddress,
> > > > >> MemoryLength);
> > > > >> -  ASSERT_EFI_ERROR (Status);
> > > > >> +  gDxeCoreLoadedImage->SystemTable = gDxeCoreST;
> > > > >>
> > > > >>    //
> > > > >>    // 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 = GetFirstGuidHob (&gEfiMemoryTypeInformationGuid);
> > > > >> +  MemoryTypeInformationResourceHob = NULL;
> > > > >> +  GuidHob                          = GetFirstGuidHob
> > > > >> (&gEfiMemoryTypeInformationGuid);
> > > > >>    if (GuidHob != NULL) {
> > > > >>      EfiMemoryTypeInformation = GET_GUID_HOB_DATA
> (GuidHob);
> > > > >>      DataSize                 = GET_GUID_HOB_DATA_SIZE
> > > (GuidHob);
> > > > >>      if ((EfiMemoryTypeInformation != NULL) && (DataSize > 0) &&
> > > > (DataSize
> > > > >> <= (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 = 0;
> > > > >> +      for (Hob.Raw = *HobStart; !END_OF_HOB_LIST (Hob);
> Hob.Raw
> > > =
> > > > >> GET_NEXT_HOB (Hob)) {
> > > > >> +        if (GET_HOB_TYPE (Hob) !=
> > > > >> EFI_HOB_TYPE_RESOURCE_DESCRIPTOR) {
> > > > >> +          continue;
> > > > >> +        }
> > > > >> +
> > > > >> +        ResourceHob = Hob.ResourceDescriptor;
> > > > >> +        if (!CompareGuid (&ResourceHob->Owner,
> > > > >> &gEfiMemoryTypeInformationGuid)) {
> > > > >> +          continue;
> > > > >> +        }
> > > > >> +
> > > > >> +        Count++;
> > > > >> +        if (ResourceHob->ResourceType !=
> > > > >> EFI_RESOURCE_SYSTEM_MEMORY) {
> > > > >> +          continue;
> > > > >> +        }
> > > > >> +
> > > > >> +        if ((ResourceHob->ResourceAttribute &
> > > > >> MEMORY_ATTRIBUTE_MASK) != TESTED_MEMORY_ATTRIBUTES) {
> > > > >> +          continue;
> > > > >> +        }
> > > > >> +
> > > > >> +        if (ResourceHob->ResourceLength >=
> > > > >> CalculateTotalMemoryBinSizeNeeded ()) {
> > > > >> +          MemoryTypeInformationResourceHob = ResourceHob;
> > > > >> +        }
> > > > >> +      }
> > > > >> +
> > > > >> +      if (Count > 1) {
> > > > >> +        MemoryTypeInformationResourceHob = NULL;
> > > > >> +      }
> > > > >>      }
> > > > >>    }
> > > > >>
> > > > >> @@ -2344,6 +2381,15 @@ CoreInitializeMemoryServices (
> > > > >>      PhitResourceHob = ResourceHob;
> > > > >>      Found           = TRUE;
> > > > >>
> > > > >> +    //
> > > > >> +    // 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 == PhitResourceHob)
> {
> > > > >> +      MemoryTypeInformationResourceHob = 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
> > > > skip
> > > > > 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
> > > > skip
> > > > > 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 = MAX_ALLOC_ADDRESS;
> > > > >>      for (Hob.Raw = *HobStart; !END_OF_HOB_LIST (Hob);
> Hob.Raw =
> > > > >> GET_NEXT_HOB (Hob)) {
> > > > >> @@ -2399,6 +2446,13 @@ CoreInitializeMemoryServices (
> > > > >>          continue;
> > > > >>        }
> > > > >>
> > > > >> +      //
> > > > >> +      // Skip the Resource Descriptor HOB that contains Memory
> > Type
> > > > >> Information bins
> > > > >> +      //
> > > > >> +      if (Hob.ResourceDescriptor ==
> > > > MemoryTypeInformationResourceHob)
> > > > >> {
> > > > >> +        continue;
> > > > >> +      }
> > > > >> +
> > > > >>        //
> > > > >>        // Skip all HOBs except Resource Descriptor HOBs
> > > > >>        //
> > > > >> @@ -2466,6 +2520,18 @@ CoreInitializeMemoryServices (
> > > > >>      Capabilities =
> > > > >> CoreConvertResourceDescriptorHobAttributesToCapabilities
> > > > >> (EfiGcdMemoryTypeSystemMemory, Attributes);
> > > > >>    }
> > > > >>
> > > > >> +  if (MemoryTypeInformationResourceHob != 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 are
> > > > >> 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;
> > > > >>  }
> > > > >>
> > > > >> +/**
> > > > >> +  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 = 0;
> > > > >> +  for (Index = 0; gMemoryTypeInformation[Index].Type !=
> > > > >> EfiMaxMemoryType; Index++) {
> > > > >> +    //
> > > > >> +    // Make sure the memory type in the
> gMemoryTypeInformation[]
> > > > array
> > > > >> is valid
> > > > >> +    //
> > > > >> +    Type =
> > > (EFI_MEMORY_TYPE)(gMemoryTypeInformation[Index].Type);
> > > > >> +    if ((UINT32)Type > EfiMaxMemoryType) {
> > > > >> +      continue;
> > > > >> +    }
> > > > >> +
> > > > >> +    Size += 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 = Start + Length;
> > > > >> +  for (Index = 0; gMemoryTypeInformation[Index].Type !=
> > > > >> EfiMaxMemoryType; Index++) {
> > > > >> +    //
> > > > >> +    // Make sure the memory type in the
> gMemoryTypeInformation[]
> > > > array
> > > > >> is valid
> > > > >> +    //
> > > > >> +    Type =
> > > (EFI_MEMORY_TYPE)(gMemoryTypeInformation[Index].Type);
> > > > >> +    if ((UINT32)Type > EfiMaxMemoryType) {
> > > > >> +      continue;
> > > > >> +    }
> > > > >> +
> > > > >> +    if (gMemoryTypeInformation[Index].NumberOfPages != 0) {
> > > > >> +      mMemoryTypeStatistics[Type].MaximumAddress = Top - 1;
> > > > >> +      Top                                       -=
> > > > >> EFI_PAGES_TO_SIZE
> > > (gMemoryTypeInformation[Index].NumberOfPages);
> > > > >> +      mMemoryTypeStatistics[Type].BaseAddress    = Top;
> > > > >> +
> > > > >> +      //
> > > > >> +      // If the current base address is the lowest address so
> > far,
> > > > then
> > > > >> update
> > > > >> +      // the default maximum address
> > > > >> +      //
> > > > >> +      if (mMemoryTypeStatistics[Type].BaseAddress <
> > > > >> mDefaultMaximumAddress) {
> > > > >> +        mDefaultMaximumAddress =
> > > > >> mMemoryTypeStatistics[Type].BaseAddress - 1;
> > > > >> +      }
> > > > >> +
> > > > >> +      mMemoryTypeStatistics[Type].NumberOfPages   =
> > > > >> gMemoryTypeInformation[Index].NumberOfPages;
> > > > >> +      gMemoryTypeInformation[Index].NumberOfPages = 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 = (EFI_MEMORY_TYPE)0; Type < EfiMaxMemoryType;
> > > Type++) {
> > > > >> +    for (Index = 0; gMemoryTypeInformation[Index].Type !=
> > > > >> EfiMaxMemoryType; Index++) {
> > > > >> +      if (Type ==
> > > > >> (EFI_MEMORY_TYPE)gMemoryTypeInformation[Index].Type) {
> > > > >> +        mMemoryTypeStatistics[Type].InformationIndex = Index;
> > > > >> +      }
> > > > >> +    }
> > > > >> +
> > > > >> +    mMemoryTypeStatistics[Type].CurrentNumberOfPages = 0;
> > > > >> +    if (mMemoryTypeStatistics[Type].MaximumAddress ==
> > > > >> MAX_ALLOC_ADDRESS) {
> > > > >> +      mMemoryTypeStatistics[Type].MaximumAddress =
> > > > >> mDefaultMaximumAddress;
> > > > >> +    }
> > > > >> +  }
> > > > >> +
> > > > >> +  mMemoryTypeInformationInitialized = TRUE;
> > > > >> +}
> > > > >> +
> > > > >>  /**
> > > > >>    Called to initialize the memory map and add descriptors to
> > > > >>    the current descriptor list.
> > > > >> --
> > > > >> 2.40.1.windows.1
> > > > >
> > > > >
> > > > >
> > > > >
> > > > >
> > > > >
> > > > >
> > > > >
> >
> >
> >
> >
> >
> > 
> >





-=-=-=-=-=-=-=-=-=-=-=-
Groups.io Links: You receive all messages sent to this group.
View/Reply Online (#114619): https://edk2.groups.io/g/devel/message/114619
Mute This Topic: https://groups.io/mt/103978575/21656
Group Owner: devel+ow...@edk2.groups.io
Unsubscribe: https://edk2.groups.io/g/devel/unsub [arch...@mail-archive.com]
-=-=-=-=-=-=-=-=-=-=-=-


Reply via email to