34 IN EFI_MEMORY_DESCRIPTOR *MemoryAttribte
38 MemoryAttribte->Type == EfiRuntimeServicesCode
39 || MemoryAttribte->Type == EfiRuntimeServicesData
45 if ((MemoryAttribte->Attribute & EFI_MEMORY_RO) != 0) {
46 return EfiRuntimeServicesCode;
52 if ((MemoryAttribte->Attribute & EFI_MEMORY_XP) != 0) {
53 return EfiRuntimeServicesData;
59 return MemoryAttribte->Type;
78 IN OUT EFI_MEMORY_DESCRIPTOR **RetMemoryMapEntry,
79 IN OUT UINTN *CurrentEntryIndex,
80 IN OUT UINTN *CurrentEntryCount,
81 IN UINTN TotalEntryCount,
82 IN EFI_MEMORY_DESCRIPTOR *MemoryAttribute,
83 IN UINTN DescriptorSize
87 EFI_MEMORY_DESCRIPTOR *MemoryMapEntry;
88 EFI_MEMORY_DESCRIPTOR *NewMemoryMapEntry;
91 MemoryMapEntry = *RetMemoryMapEntry;
98 if (MemoryAttribute->PhysicalStart > MemoryMapEntry->PhysicalStart) {
99 if (*CurrentEntryCount == TotalEntryCount) {
100 return EFI_OUT_OF_RESOURCES;
103 NewMemoryMapEntry = NEXT_MEMORY_DESCRIPTOR (MemoryMapEntry, DescriptorSize);
104 DiffPages = (UINTN)EFI_SIZE_TO_PAGES (MemoryAttribute->PhysicalStart - MemoryMapEntry->PhysicalStart);
108 DescriptorSize * (*CurrentEntryCount - *CurrentEntryIndex)
110 MemoryMapEntry->NumberOfPages = DiffPages;
111 NewMemoryMapEntry->PhysicalStart = MemoryAttribute->PhysicalStart;
112 NewMemoryMapEntry->NumberOfPages -= DiffPages;
114 MemoryMapEntry = NewMemoryMapEntry;
119 ++(*CurrentEntryIndex);
120 ++(*CurrentEntryCount);
123 ASSERT (MemoryAttribute->PhysicalStart == MemoryMapEntry->PhysicalStart);
130 if (MemoryMapEntry->NumberOfPages == MemoryAttribute->NumberOfPages) {
132 *RetMemoryMapEntry = MemoryMapEntry;
141 if (*CurrentEntryCount == TotalEntryCount) {
142 return EFI_OUT_OF_RESOURCES;
145 NewMemoryMapEntry = NEXT_MEMORY_DESCRIPTOR (MemoryMapEntry, DescriptorSize);
149 DescriptorSize * (*CurrentEntryCount - *CurrentEntryIndex)
152 MemoryMapEntry->NumberOfPages = MemoryAttribute->NumberOfPages;
153 NewMemoryMapEntry->PhysicalStart += EFI_PAGES_TO_SIZE (MemoryAttribute->NumberOfPages);
154 NewMemoryMapEntry->NumberOfPages -= MemoryAttribute->NumberOfPages;
159 ++(*CurrentEntryIndex);
160 ++(*CurrentEntryCount);
162 *RetMemoryMapEntry = NewMemoryMapEntry;
170 IN OUT EFI_MEMORY_ATTRIBUTES_TABLE *MemoryAttributesTable,
171 IN OUT EFI_MEMORY_DESCRIPTOR *MemoryAttributesEntry OPTIONAL,
172 IN UINTN MaxDescriptors,
173 IN EFI_MEMORY_DESCRIPTOR *MemoryMapEntry,
174 IN EFI_PHYSICAL_ADDRESS CurrentMapAddress
177 EFI_PHYSICAL_ADDRESS NextMatAddress;
182 if (MemoryAttributesTable->NumberOfEntries >= MaxDescriptors) {
183 return EFI_OUT_OF_RESOURCES;
186 if (MemoryAttributesEntry != NULL) {
191 ASSERT (MemoryAttributesEntry->PhysicalStart > CurrentMapAddress);
197 NEXT_MEMORY_DESCRIPTOR (MemoryAttributesEntry, MemoryAttributesTable->DescriptorSize),
198 MemoryAttributesEntry,
199 MemoryAttributesTable->NumberOfEntries * MemoryAttributesTable->DescriptorSize
200 - ((UINTN)MemoryAttributesEntry - (UINTN)MemoryAttributesTable - sizeof (*MemoryAttributesTable))
214 if (MemoryAttributesEntry->PhysicalStart < NextMatAddress) {
215 NextMatAddress = MemoryAttributesEntry->PhysicalStart;
221 MemoryAttributesEntry = (VOID *)((UINTN)MemoryAttributesTable +
sizeof (*MemoryAttributesTable)
222 + MemoryAttributesTable->NumberOfEntries * MemoryAttributesTable->DescriptorSize);
230 MemoryAttributesEntry->PhysicalStart = CurrentMapAddress;
231 MemoryAttributesEntry->VirtualStart = 0;
232 MemoryAttributesEntry->NumberOfPages = EFI_SIZE_TO_PAGES (NextMatAddress - CurrentMapAddress);
233 MemoryAttributesEntry->Attribute = EFI_MEMORY_RUNTIME;
234 if (MemoryAttributesEntry->Type == EfiRuntimeServicesCode) {
235 MemoryAttributesEntry->Attribute |= EFI_MEMORY_RO;
237 MemoryAttributesEntry->Attribute |= EFI_MEMORY_XP;
240 ++MemoryAttributesTable->NumberOfEntries;
262 IN OUT EFI_MEMORY_ATTRIBUTES_TABLE *MemoryAttributesTable,
263 IN OUT EFI_MEMORY_DESCRIPTOR *MemoryAttributesEntry,
264 IN UINTN MaxDescriptors,
265 IN UINTN MemoryMapDescriptors,
266 IN EFI_MEMORY_DESCRIPTOR *MemoryMap,
267 IN UINTN DescriptorSize
273 EFI_PHYSICAL_ADDRESS NextMapAddress;
274 EFI_PHYSICAL_ADDRESS LastMatAddress;
275 EFI_PHYSICAL_ADDRESS CurrentMapAddress;
278 Status = EFI_NOT_FOUND;
280 for (MapIndex = 0; MapIndex < MemoryMapDescriptors; ++MapIndex) {
284 if ( (MemoryMap->Type != EfiRuntimeServicesCode)
285 && (MemoryMap->Type != EfiRuntimeServicesData))
287 goto NEXT_MEMORY_MAP_DESCRIPTOR;
291 CurrentMapAddress = MemoryMap->PhysicalStart;
297 while ( MatIndex < MemoryAttributesTable->NumberOfEntries
298 && CurrentMapAddress < NextMapAddress)
303 if ( (MemoryAttributesEntry->Type != EfiRuntimeServicesCode)
304 && (MemoryAttributesEntry->Type != EfiRuntimeServicesData))
306 goto NEXT_MEMORY_ATTRIBUTE_DESCRIPTOR;
316 if (LastMatAddress < MemoryMap->PhysicalStart) {
317 goto NEXT_MEMORY_ATTRIBUTE_DESCRIPTOR;
324 if (CurrentMapAddress == MemoryAttributesEntry->PhysicalStart) {
330 ASSERT (MemoryAttributesEntry->NumberOfPages <= MemoryMap->NumberOfPages);
331 CurrentMapAddress = LastMatAddress + 1;
332 goto NEXT_MEMORY_ATTRIBUTE_DESCRIPTOR;
340 MemoryAttributesTable,
341 MemoryAttributesEntry,
346 if (EFI_ERROR (Status)) {
356NEXT_MEMORY_ATTRIBUTE_DESCRIPTOR:
357 MemoryAttributesEntry = NEXT_MEMORY_DESCRIPTOR (
358 MemoryAttributesEntry,
359 MemoryAttributesTable->DescriptorSize
367 if (CurrentMapAddress == NextMapAddress) {
368 goto NEXT_MEMORY_MAP_DESCRIPTOR;
377 ASSERT (CurrentMapAddress < NextMapAddress);
378 ASSERT (MatIndex == MemoryAttributesTable->NumberOfEntries);
380 MemoryAttributesTable,
386 if (EFI_ERROR (Status)) {
398NEXT_MEMORY_MAP_DESCRIPTOR:
399 MemoryMap = NEXT_MEMORY_DESCRIPTOR (
410 OUT EFI_MEMORY_DESCRIPTOR **MemoryAttributesEntry OPTIONAL
413 EFI_MEMORY_ATTRIBUTES_TABLE *MemoryAttributesTable;
416 for (Index = 0; Index <
gST->NumberOfTableEntries; ++Index) {
417 if (
CompareGuid (&
gST->ConfigurationTable[Index].VendorGuid, &gEfiMemoryAttributesTableGuid)) {
418 MemoryAttributesTable =
gST->ConfigurationTable[Index].VendorTable;
419 if (MemoryAttributesEntry != NULL) {
420 *MemoryAttributesEntry = (EFI_MEMORY_DESCRIPTOR *)(MemoryAttributesTable + 1);
423 return MemoryAttributesTable;
432 IN EFI_PHYSICAL_ADDRESS Address,
433 IN EFI_GET_MEMORY_MAP GetMemoryMap OPTIONAL
437 EFI_MEMORY_ATTRIBUTES_TABLE *MemoryAttributesTable;
438 EFI_MEMORY_DESCRIPTOR *MemoryAttributesEntry;
439 UINTN MaxDescriptors;
441 EFI_MEMORY_DESCRIPTOR *MemoryMap;
442 UINTN DescriptorSize;
444 UINT32 DescriptorVersion;
447 if ((MemoryAttributesTable == NULL) || (MemoryAttributesTable->NumberOfEntries == 0)) {
448 return EFI_UNSUPPORTED;
456 MemoryAttributesTable->NumberOfEntries * MemoryAttributesTable->DescriptorSize,
457 MemoryAttributesEntry,
458 MemoryAttributesTable->DescriptorSize
466 MaxDescriptors = MemoryAttributesTable->NumberOfEntries;
468 &MemoryAttributesTable->NumberOfEntries,
469 MemoryAttributesEntry,
470 MemoryAttributesTable->DescriptorSize
472 if (!EFI_ERROR (Status)) {
481 if (GetMemoryMap == NULL) {
482 GetMemoryMap =
gBS->GetMemoryMap;
485 MemoryMapSize =
sizeof (mMemoryMap);
486 MemoryMap = (EFI_MEMORY_DESCRIPTOR *)mMemoryMap;
488 Status = GetMemoryMap (
496 if (!EFI_ERROR (Status)) {
504 MemoryAttributesTable,
505 MemoryAttributesEntry,
507 MemoryMapSize / DescriptorSize,
527 MemoryAttributesTable->NumberOfEntries * MemoryAttributesTable->DescriptorSize,
528 MemoryAttributesEntry,
529 MemoryAttributesTable->DescriptorSize,
531 EfiRuntimeServicesCode,
546 UINTN DescriptorCount;
547 CONST EFI_MEMORY_ATTRIBUTES_TABLE *MemoryAttributesTable;
548 EFI_MEMORY_DESCRIPTOR *MemoryAttributesEntry;
551 if (MemoryAttributesTable == NULL) {
556 for (Index = 0; Index < MemoryAttributesTable->NumberOfEntries; ++Index) {
557 if ( (MemoryAttributesEntry->Type == EfiRuntimeServicesCode)
558 || (MemoryAttributesEntry->Type == EfiRuntimeServicesData))
563 MemoryAttributesEntry = NEXT_MEMORY_DESCRIPTOR (
564 MemoryAttributesEntry,
565 MemoryAttributesTable->DescriptorSize
569 return DescriptorCount;
574 IN UINTN MaxMemoryMapSize,
575 IN OUT UINTN *MemoryMapSize,
576 IN OUT EFI_MEMORY_DESCRIPTOR *MemoryMap,
577 IN UINTN DescriptorSize
581 CONST EFI_MEMORY_ATTRIBUTES_TABLE *MemoryAttributesTable;
582 EFI_MEMORY_DESCRIPTOR *MemoryAttributesEntry;
583 EFI_MEMORY_DESCRIPTOR *MemoryMapEntry;
584 EFI_MEMORY_DESCRIPTOR *LastAttributeEntry;
585 UINTN LastAttributeIndex;
588 UINTN CurrentEntryCount;
589 UINTN TotalEntryCount;
590 UINTN AttributeCount;
594 ASSERT (MaxMemoryMapSize >= *MemoryMapSize);
597 if (MemoryAttributesTable == NULL) {
598 return EFI_UNSUPPORTED;
601 LastAttributeEntry = MemoryAttributesEntry;
602 LastAttributeIndex = 0;
603 MemoryMapEntry = MemoryMap;
604 CurrentEntryCount = *MemoryMapSize / DescriptorSize;
605 TotalEntryCount = MaxMemoryMapSize / DescriptorSize;
606 AttributeCount = MemoryAttributesTable->NumberOfEntries;
612 while (Index < CurrentEntryCount) {
617 while (( MemoryMapEntry->Type == EfiRuntimeServicesCode
618 || MemoryMapEntry->Type == EfiRuntimeServicesData) && CanSplit)
624 MemoryAttributesEntry = LastAttributeEntry;
625 for (Index2 = LastAttributeIndex; Index2 < AttributeCount; ++Index2) {
626 if ( (MemoryAttributesEntry->Type == EfiRuntimeServicesCode)
627 || (MemoryAttributesEntry->Type == EfiRuntimeServicesData))
635 MemoryAttributesEntry->PhysicalStart,
636 EFI_PAGES_TO_SIZE (MemoryAttributesEntry->NumberOfPages)
650 LastAttributeEntry = NEXT_MEMORY_DESCRIPTOR (
651 MemoryAttributesEntry,
652 MemoryAttributesTable->DescriptorSize
654 LastAttributeIndex = Index2 + 1;
657 }
else if (InDescAttrs) {
666 MemoryAttributesEntry = NEXT_MEMORY_DESCRIPTOR (
667 MemoryAttributesEntry,
668 MemoryAttributesTable->DescriptorSize
672 if ((Index2 < AttributeCount) && InDescAttrs) {
681 MemoryAttributesEntry,
684 if (EFI_ERROR (Status)) {
685 *MemoryMapSize = CurrentEntryCount * DescriptorSize;
698 MemoryMapEntry = NEXT_MEMORY_DESCRIPTOR (
705 *MemoryMapSize = CurrentEntryCount * DescriptorSize;
STATIC EFI_STATUS OcSplitMemoryEntryByAttribute(IN OUT EFI_MEMORY_DESCRIPTOR **RetMemoryMapEntry, IN OUT UINTN *CurrentEntryIndex, IN OUT UINTN *CurrentEntryCount, IN UINTN TotalEntryCount, IN EFI_MEMORY_DESCRIPTOR *MemoryAttribute, IN UINTN DescriptorSize)
STATIC EFI_STATUS OcExpandAttributeWrite(IN OUT EFI_MEMORY_ATTRIBUTES_TABLE *MemoryAttributesTable, IN OUT EFI_MEMORY_DESCRIPTOR *MemoryAttributesEntry OPTIONAL, IN UINTN MaxDescriptors, IN EFI_MEMORY_DESCRIPTOR *MemoryMapEntry, IN EFI_PHYSICAL_ADDRESS CurrentMapAddress)
STATIC EFI_STATUS OcExpandAttributesByMap(IN OUT EFI_MEMORY_ATTRIBUTES_TABLE *MemoryAttributesTable, IN OUT EFI_MEMORY_DESCRIPTOR *MemoryAttributesEntry, IN UINTN MaxDescriptors, IN UINTN MemoryMapDescriptors, IN EFI_MEMORY_DESCRIPTOR *MemoryMap, IN UINTN DescriptorSize)
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)