117 OUT UINTN *MemoryMapSize,
118 OUT UINTN *DescriptorSize,
119 OUT UINTN *MapKey OPTIONAL,
120 OUT UINT32 *DescriptorVersion OPTIONAL,
121 OUT UINTN *OriginalMemoryMapSize OPTIONAL,
122 IN BOOLEAN IncludeSplitSpace
125 EFI_MEMORY_DESCRIPTOR *MemoryMap;
130 UINT32 DescriptorVersionValue;
134 Status =
gBS->GetMemoryMap (
139 &DescriptorVersionValue
142 if (Status != EFI_BUFFER_TOO_SMALL) {
146 if (IncludeSplitSpace) {
156 Result = BaseOverflowAddUN (
158 MAX (*DescriptorSize + ExtraSize, 1024 + ExtraSize),
166 OriginalSize = *MemoryMapSize;
167 MemoryMap = AllocatePool (OriginalSize);
168 if (MemoryMap == NULL) {
172 Status =
gBS->GetMemoryMap (
177 &DescriptorVersionValue
180 if (EFI_ERROR (Status)) {
181 FreePool (MemoryMap);
185 if (MapKey != NULL) {
186 *MapKey = MapKeyValue;
189 if (DescriptorVersion != NULL) {
190 *DescriptorVersion = DescriptorVersionValue;
193 if (OriginalMemoryMapSize != NULL) {
194 *OriginalMemoryMapSize = OriginalSize;
202 OUT UINTN *MemoryMapSize,
203 OUT EFI_MEMORY_DESCRIPTOR **MemoryMap,
205 OUT UINTN *DescriptorSize,
206 OUT UINT32 *DescriptorVersion,
207 IN EFI_GET_MEMORY_MAP GetMemoryMap OPTIONAL,
208 IN OUT EFI_PHYSICAL_ADDRESS *TopMemory OPTIONAL
212 EFI_PHYSICAL_ADDRESS MemoryMapAlloc;
217 if (GetMemoryMap == NULL) {
218 GetMemoryMap =
gBS->GetMemoryMap;
221 Status = GetMemoryMap (
229 if (Status != EFI_BUFFER_TOO_SMALL) {
230 DEBUG ((DEBUG_INFO,
"OCMM: Insane GetMemoryMap %r\n", Status));
238 *MemoryMapSize += 512;
244 if (TopMemory != NULL) {
245 MemoryMapAlloc = *TopMemory;
246 *TopMemory = EFI_SIZE_TO_PAGES (*MemoryMapSize);
257 if (EFI_ERROR (Status)) {
258 DEBUG ((DEBUG_INFO,
"OCMM: Temp memory map allocation from top failure - %r\n", Status));
263 *MemoryMap = (EFI_MEMORY_DESCRIPTOR *)(UINTN)MemoryMapAlloc;
265 *MemoryMap = AllocatePool (*MemoryMapSize);
266 if (*MemoryMap == NULL) {
267 DEBUG ((DEBUG_INFO,
"OCMM: Temp memory map direct allocation failure\n"));
268 return EFI_OUT_OF_RESOURCES;
272 Status = GetMemoryMap (
280 if (EFI_ERROR (Status)) {
281 if (TopMemory != NULL) {
283 (EFI_PHYSICAL_ADDRESS)((UINTN)*MemoryMap),
287 FreePool (*MemoryMap);
292 }
while (Status == EFI_BUFFER_TOO_SMALL);
294 if (Status != EFI_SUCCESS) {
295 DEBUG ((DEBUG_INFO,
"OCMM: Failed to obtain memory map - %r\n", Status));
303 IN UINTN MemoryMapSize,
304 IN OUT EFI_MEMORY_DESCRIPTOR *MemoryMap,
305 IN UINTN DescriptorSize
308 EFI_MEMORY_DESCRIPTOR *MemoryMapEntry;
309 EFI_MEMORY_DESCRIPTOR *NextMemoryMapEntry;
310 EFI_MEMORY_DESCRIPTOR *MemoryMapEnd;
311 EFI_MEMORY_DESCRIPTOR TempMemoryMap;
313 MemoryMapEntry = MemoryMap;
314 NextMemoryMapEntry = NEXT_MEMORY_DESCRIPTOR (MemoryMapEntry, DescriptorSize);
315 MemoryMapEnd = (EFI_MEMORY_DESCRIPTOR *)((UINT8 *)MemoryMap + MemoryMapSize);
316 while (MemoryMapEntry < MemoryMapEnd) {
317 while (NextMemoryMapEntry < MemoryMapEnd) {
318 if (MemoryMapEntry->PhysicalStart > NextMemoryMapEntry->PhysicalStart) {
319 CopyMem (&TempMemoryMap, MemoryMapEntry,
sizeof (EFI_MEMORY_DESCRIPTOR));
320 CopyMem (MemoryMapEntry, NextMemoryMapEntry,
sizeof (EFI_MEMORY_DESCRIPTOR));
321 CopyMem (NextMemoryMapEntry, &TempMemoryMap,
sizeof (EFI_MEMORY_DESCRIPTOR));
324 NextMemoryMapEntry = NEXT_MEMORY_DESCRIPTOR (NextMemoryMapEntry, DescriptorSize);
327 MemoryMapEntry = NEXT_MEMORY_DESCRIPTOR (MemoryMapEntry, DescriptorSize);
328 NextMemoryMapEntry = NEXT_MEMORY_DESCRIPTOR (MemoryMapEntry, DescriptorSize);
334 IN OUT UINTN *MemoryMapSize,
335 IN OUT EFI_MEMORY_DESCRIPTOR *MemoryMap,
336 IN UINTN DescriptorSize
340 UINTN SizeFromDescToEnd;
342 EFI_MEMORY_DESCRIPTOR *PrevDesc;
343 EFI_MEMORY_DESCRIPTOR *Desc;
344 BOOLEAN CanBeJoinedFree;
345 BOOLEAN CanBeJoinedRt;
346 BOOLEAN HasEntriesToRemove;
348 Status = EFI_NOT_FOUND;
350 if (*MemoryMapSize <= DescriptorSize) {
354 PrevDesc = MemoryMap;
355 Desc = NEXT_MEMORY_DESCRIPTOR (PrevDesc, DescriptorSize);
356 SizeFromDescToEnd = *MemoryMapSize - DescriptorSize;
357 *MemoryMapSize = DescriptorSize;
358 HasEntriesToRemove = FALSE;
360 while (SizeFromDescToEnd > 0) {
361 Bytes = EFI_PAGES_TO_SIZE (PrevDesc->NumberOfPages);
362 CanBeJoinedFree = FALSE;
363 CanBeJoinedRt = FALSE;
364 if ( (Desc->Attribute == PrevDesc->Attribute)
365 && (PrevDesc->PhysicalStart + Bytes == Desc->PhysicalStart))
372 Desc->Type == EfiBootServicesCode
373 || Desc->Type == EfiBootServicesData
374 || Desc->Type == EfiConventionalMemory
375 || Desc->Type == EfiLoaderCode
376 || Desc->Type == EfiLoaderData
378 PrevDesc->Type == EfiBootServicesCode
379 || PrevDesc->Type == EfiBootServicesData
380 || PrevDesc->Type == EfiConventionalMemory
381 || PrevDesc->Type == EfiLoaderCode
382 || PrevDesc->Type == EfiLoaderData
386 Desc->Type == EfiRuntimeServicesCode
387 && PrevDesc->Type == EfiRuntimeServicesCode
389 Desc->Type == EfiRuntimeServicesData
390 && PrevDesc->Type == EfiRuntimeServicesData
394 if (CanBeJoinedFree) {
398 PrevDesc->Type = EfiConventionalMemory;
399 PrevDesc->NumberOfPages += Desc->NumberOfPages;
400 HasEntriesToRemove = TRUE;
401 Status = EFI_SUCCESS;
402 }
else if (CanBeJoinedRt) {
403 PrevDesc->NumberOfPages += Desc->NumberOfPages;
404 HasEntriesToRemove = TRUE;
405 Status = EFI_SUCCESS;
410 *MemoryMapSize += DescriptorSize;
411 PrevDesc = NEXT_MEMORY_DESCRIPTOR (PrevDesc, DescriptorSize);
412 if (HasEntriesToRemove) {
417 CopyMem (PrevDesc, Desc, SizeFromDescToEnd);
419 HasEntriesToRemove = FALSE;
423 Desc = NEXT_MEMORY_DESCRIPTOR (Desc, DescriptorSize);
424 SizeFromDescToEnd -= DescriptorSize;
430 if (HasEntriesToRemove) {
431 *MemoryMapSize += DescriptorSize;
439 IN OUT UINT32 *EntryCount,
440 IN OUT EFI_MEMORY_DESCRIPTOR *MemoryMap,
441 IN UINTN DescriptorSize
446 EFI_MEMORY_DESCRIPTOR *PrevDesc;
447 EFI_MEMORY_DESCRIPTOR *Desc;
449 BOOLEAN HasEntriesToRemove;
451 Status = EFI_NOT_FOUND;
453 if (*EntryCount <= 1) {
457 PrevDesc = MemoryMap;
458 Desc = NEXT_MEMORY_DESCRIPTOR (PrevDesc, DescriptorSize);
459 EntriesToGo = *EntryCount - 1;
461 HasEntriesToRemove = FALSE;
463 while (EntriesToGo > 0) {
464 IsDuplicate = Desc->PhysicalStart == PrevDesc->PhysicalStart
465 && Desc->NumberOfPages == PrevDesc->NumberOfPages;
471 Status = EFI_SUCCESS;
472 HasEntriesToRemove = TRUE;
478 PrevDesc = NEXT_MEMORY_DESCRIPTOR (PrevDesc, DescriptorSize);
479 if (HasEntriesToRemove) {
484 CopyMem (PrevDesc, Desc, EntriesToGo * DescriptorSize);
486 HasEntriesToRemove = FALSE;
490 Desc = NEXT_MEMORY_DESCRIPTOR (Desc, DescriptorSize);
497 if (HasEntriesToRemove) {
506 IN UINTN MemoryMapSize,
507 IN EFI_MEMORY_DESCRIPTOR *MemoryMap,
508 IN UINTN DescriptorSize,
509 IN EFI_PHYSICAL_ADDRESS Address,
510 IN EFI_MEMORY_TYPE Type,
511 IN UINT64 SetAttributes,
512 IN UINT64 DropAttributes
518 EntryCount = MemoryMapSize / DescriptorSize;
520 for (Index = 0; Index < EntryCount; ++Index) {
522 MemoryMap->Type = Type;
523 MemoryMap->Attribute |= SetAttributes;
524 MemoryMap->Attribute &= ~DropAttributes;
528 MemoryMap = NEXT_MEMORY_DESCRIPTOR (
534 return EFI_NOT_FOUND;
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)
EFI_STATUS OcUpdateDescriptors(IN UINTN MemoryMapSize, IN EFI_MEMORY_DESCRIPTOR *MemoryMap, IN UINTN DescriptorSize, IN EFI_PHYSICAL_ADDRESS Address, IN EFI_MEMORY_TYPE Type, IN UINT64 SetAttributes, IN UINT64 DropAttributes)
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)