Brian, I think all the PEI Allocate Pool does is make a HOB [1]. I don’t think we can remove HOBs when memory is freed as that would change pointers to pool. It may be possible to mark a region as free and allocate from that list batch 1st, and just over allocate space if needed. It could be as simple as just adding a new HOB type to represent free pool.
[1] https://github.com/tianocore/edk2/blob/master/MdeModulePkg/Core/Pei/Memory/MemoryServices.c#L878 Thanks, Andrew Fish > On Jun 22, 2022, at 12:39 PM, Brian J. Johnson <brian.john...@hpe.com> wrote: > > Sorry for the late response to this thread... > > PEI has grown greatly in complexity, as Andrew pointed out. Do we (TianoCore > community) think it's time to add a real pool manager to PEI? There's > getting to be quite a bit of post-DRAM-initialization PEI code on some > platforms. And really, having a limited amount of pre-DRAM memory available > is an even better reason for having an effective pool allocator, so the > memory can be freed and reused. > > FWIW we (HPE) needed to add a private pool allocator to manage memory for a > proprietary h/w initialization module which needs to run in post-DRAM PEI, > and depends on allocating and freeing memory in different phases of its > operation. > > Brian J. Johnson > > From: Ayush Singh [mailto:ayushdevel1...@gmail.com > <mailto:ayushdevel1...@gmail.com>] > Sent: Friday, June 10, 2022, 12:22 AM > To: Andrew Fish <af...@apple.com> <mailto:af...@apple.com> > Cc: devel@edk2.groups.io <mailto:devel@edk2.groups.io> > Subject: [edk2-devel] Clarification of Memory management in PEI phase > >> Thanks for the wonderful answer. >> >> Ayush Singh >> >> On Thu, Jun 9 2022 at 01:26:58 PM -0700, Andrew Fish <af...@apple.com> >> <mailto:af...@apple.com> wrote: >>> >>> On Jun 9, 2022, at 10:28 AM, Ayush Singh <ayushdevel1...@gmail.com >>> <mailto:ayushdevel1...@gmail.com>wrote: >>> >>> Hello everyone, >>> >>> Can anyone help me with understanding dynamic memory management in PEI >>> phase? In the UEFI Platform Integration Specification, version 1.7 >>> Errata A, Section 4.6, PEI Memory services are given which include: >>> >>> 1. InstallPeiMemory() >>> >>> This is basically: >>> (*PeiServices)->InstallPeiMemory (PeiServices, MemoryBegin, MemoryLength); >>> >>> This is how you tell the PEI Core the location of the memory that will can >>> be used in PEI. >>> >>> 2. AllocatePages() >>> 3. AllocatePool() >>> 4. CopyMem() >>> 5. SetMem() >>> 6. FreePages() >>> >>> However, no `FreePool()` service seems to be present. So how is the >>> memory allocated using `AllocatePool()` freed? >>> >>> >>> It basically gets Freed when you transition to the DXE phase. >>> >>> To step back for a minute I think it is important to remember that the main >>> job of PEI is to initialize DRAM, and deal with S3 (resuming from suspend >>> to RAM). So as soon as you have DRAM you are kind done and ready for the >>> DXE IPL so you can load the DXE Phase and start up EFI. Remember PEI is Pre >>> EFI. The reality is programming DRAM is complex and lots of code got >>> written, then lots more code got written and PEI has become large for some >>> ports. That was never the intent. PEI is designed as a way to run C code >>> when you code is running from ROM and you donā��t have any DRAM. For x86 >>> not having DRAM means you are using the cache as RAM. For some SoCs there >>> is actually an SRAM you can use. Thus the PEI memory allocation scheme is >>> designed to deal with this very constrained environment. >>> >>> You start PEI with a heap and stack. You can also allocate HOBs (Hand Off >>> Blocks). A pool allocation in PEI is just a HOB. See [1]. There is no way >>> to free a HOB. So the AllocatePool() kind of leaks into DXE too as an entry >>> in the HOB list. But when the OS called gBS->ExitBootServices() that frees >>> all non runtime memory back to the OS. >>> >>> If you look a AllocatePages/FreePages you will see AllocatePages creates a >>> HOB that points to the memory region, and FreePages just marks that HOB as >>> not used. That code is also in this file [1]. >>> >>> TL;DR there is no pool manager in PEI. >>> >>> [1] >>> https://github.com/tianocore/edk2/blob/master/MdeModulePkg/Core/Pei/Memory/MemoryServices.c#L878 >>> >>> <https://github.com/tianocore/edk2/blob/master/MdeModulePkg/Core/Pei/Memory/MemoryServices.c#L878> >>> >>> >>> Thanks, >>> >>> Andrew Fish >>> >>> Ayush Singh >>> >>> >>> >>> >>> >>> >> >> > Brian > > ------------------------------------------------------------------------------------------------------------------------------ > "It's OK to be stuck. 99% of the time in your own [research] work, > you're stuck." > -- Mark Lawrence -=-=-=-=-=-=-=-=-=-=-=- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#90698): https://edk2.groups.io/g/devel/message/90698 Mute This Topic: https://groups.io/mt/91651322/21656 Group Owner: devel+ow...@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [arch...@mail-archive.com] -=-=-=-=-=-=-=-=-=-=-=-