28 IN EFI_MEMORY_TYPE MemoryType,
30 IN OUT EFI_PHYSICAL_ADDRESS *Memory,
31 IN EFI_GET_MEMORY_MAP GetMemoryMap OPTIONAL,
32 IN EFI_ALLOCATE_PAGES AllocatePages OPTIONAL,
38 EFI_MEMORY_DESCRIPTOR *MemoryMap;
41 UINT32 DescriptorVersion;
42 EFI_MEMORY_DESCRIPTOR *MemoryMapEnd;
43 EFI_MEMORY_DESCRIPTOR *Desc;
55 if (EFI_ERROR (Status)) {
59 Status = EFI_NOT_FOUND;
61 MemoryMapEnd = NEXT_MEMORY_DESCRIPTOR (MemoryMap, MemoryMapSize);
69 if ((Desc->Type == EfiConventionalMemory) && (Pages <= Desc->NumberOfPages) &&
70 (Desc->PhysicalStart + EFI_PAGES_TO_SIZE (Pages) <= *Memory))
75 if (Desc->PhysicalStart + EFI_PAGES_TO_SIZE (Desc->NumberOfPages) <= *Memory) {
79 *Memory = Desc->PhysicalStart + EFI_PAGES_TO_SIZE (Desc->NumberOfPages - Pages);
84 *Memory = *Memory - EFI_PAGES_TO_SIZE (Pages);
90 if ((CheckRange != NULL) && CheckRange (*Memory, EFI_PAGES_TO_SIZE (Pages))) {
94 Status = (AllocatePages != NULL ? AllocatePages :
gBS->AllocatePages)(
105 FreePool (MemoryMap);
112 IN UINTN MemoryMapSize,
113 IN EFI_MEMORY_DESCRIPTOR *MemoryMap,
114 IN UINTN DescriptorSize,
115 OUT UINTN *DescriptorCount OPTIONAL
122 EFI_MEMORY_DESCRIPTOR *Desc;
126 NumEntries = MemoryMapSize / DescriptorSize;
129 for (Index = 0; Index < NumEntries; ++Index) {
130 if ( (Desc->Type != EfiReservedMemoryType)
131 && ((Desc->Attribute & EFI_MEMORY_RUNTIME) != 0))
134 PageNum += Desc->NumberOfPages;
137 Desc = NEXT_MEMORY_DESCRIPTOR (Desc, DescriptorSize);
140 if (DescriptorCount != NULL) {
141 *DescriptorCount = DescNum;
149 OUT UINTN *LowerMemory OPTIONAL
153 UINTN DescriptorSize;
154 EFI_MEMORY_DESCRIPTOR *MemoryMap;
155 EFI_MEMORY_DESCRIPTOR *EntryWalker;
159 if (LowerMemory != NULL) {
164 if (MemoryMap == NULL) {
169 EntryWalker = MemoryMap;
170 (UINT8 *)EntryWalker < ((UINT8 *)MemoryMap + MemoryMapSize);
171 EntryWalker = NEXT_MEMORY_DESCRIPTOR (EntryWalker, DescriptorSize))
173 if (EntryWalker->Type != EfiConventionalMemory) {
181 ASSERT (EntryWalker->NumberOfPages <= MAX_UINTN);
182 ASSERT (MAX_UINTN - EntryWalker->NumberOfPages >= FreePages);
183 FreePages += (UINTN)EntryWalker->NumberOfPages;
185 if ((LowerMemory == NULL) || (EntryWalker->PhysicalStart >= BASE_4GB)) {
189 if (EntryWalker->PhysicalStart + EFI_PAGES_TO_SIZE (EntryWalker->NumberOfPages) > BASE_4GB) {
190 *LowerMemory += (UINTN)EFI_SIZE_TO_PAGES (BASE_4GB - EntryWalker->PhysicalStart);
192 *LowerMemory += (UINTN)EntryWalker->NumberOfPages;
196 FreePool (MemoryMap);
EFI_STATUS OcAllocatePagesFromTop(IN EFI_MEMORY_TYPE MemoryType, IN UINTN Pages, IN OUT EFI_PHYSICAL_ADDRESS *Memory, IN EFI_GET_MEMORY_MAP GetMemoryMap OPTIONAL, IN EFI_ALLOCATE_PAGES AllocatePages OPTIONAL, IN CHECK_ALLOCATION_RANGE CheckRange OPTIONAL)
EFI_MEMORY_DESCRIPTOR * OcGetCurrentMemoryMap(OUT UINTN *MemoryMapSize, OUT UINTN *DescriptorSize, OUT UINTN *MapKey OPTIONAL, OUT UINT32 *DescriptorVersion OPTIONAL, OUT UINTN *OriginalMemoryMapSize OPTIONAL, IN BOOLEAN IncludeSplitSpace)
EFI_STATUS OcGetCurrentMemoryMapAlloc(OUT UINTN *MemoryMapSize, OUT EFI_MEMORY_DESCRIPTOR **MemoryMap, OUT UINTN *MapKey, OUT UINTN *DescriptorSize, OUT UINT32 *DescriptorVersion, IN EFI_GET_MEMORY_MAP GetMemoryMap OPTIONAL, IN OUT EFI_PHYSICAL_ADDRESS *TopMemory OPTIONAL)