On 02/16/16 09:29, Laszlo Ersek wrote: > On 02/16/16 07:26, Bhupesh Sharma wrote: >> Hi Experts, >> >> I have a doubt regarding memory sharing between PEI and DXE phases. >> >> Let's say I have a PEI library 'NorLib.c' and a DXE driver 'NorDxeDriver.c', >> where >> the DXE driver uses some APIs of the PEI Library to obtain information and >> provide >> functionalities to the upper layers. >> >> Now, if I allocate some memory chunk (let's say for a pointer) in the PEI >> phase, >> how can I use the same in the DXE phase (as normally the PEI pointer >> contents become >> INVALID in the DXE phase). >> >> Are there standard HOB mechanisms available for the same? >> >> Thanks for the help. > > In the PEI phase, use the MemoryAllocationLib API's to allocate memory. > The library class header is: > > MdePkg/Include/Library/MemoryAllocationLib.h > > and the library instance you should resolve the class to is > > MdePkg/Library/PeiMemoryAllocationLib/PeiMemoryAllocationLib.inf > > The memory release functions will not ASSERT(), but they are no-ops. You > can't free memory you allocate during PEI. > > For each pool (i.e., non-pages) allocation, there is a size limit of a > bit less than 64KB. The reason is that such allocations are internally > handled with HOBs. If you need more memory, call AllocatePages(). > > The memory you allocate with AllocatePages() during PEI will survive > in-place into DXE, and it will be correctly reflected in the UEFI memmap > as well. HOBs will be migrated though, so you can't reference them from > DXE *by address*. > > So, you have two options: > - If the data is small, create a vendor GUID HOB with the data in it, in > PEI. In DXE, look up the HOB by GUID. > - If the data is large, use AllocatePages() -- or one of its friends -- > in PEI, then stash the address in a small vendor GUID HOB.
I forgot to add: if you decide to call AllocatePages(), you should make sure that the PEIM that issues this call has a DepEx on gEfiPeiMemoryDiscoveredPpiGuid. I also forgot to add: the field in the HOB that stores the base address of the pages allocated should have type UINT64 (or, equivalently, EFI_PHYSICAL_ADDRESS). (VOID*) has size identical to UINTN, and that could change between PEI and DXE. Thanks Laszlo > For the second option, a dynamic PCD could be considered as well, for > storing the base address of the allocated pages. However, storing the > address in a dynamic PCD is in a sense a bit more restricted than > storing the address in a vendor GUID HOB. For example, if you'd like to > access the allocated area in a library instance that gets linked into > the DXE core, then the dynamic PCD is a no-go. _______________________________________________ edk2-devel mailing list edk2-devel@lists.01.org https://lists.01.org/mailman/listinfo/edk2-devel