IN BOOLEAN NeedGuard\r
)\r
{\r
- EFI_STATUS Status;\r
- UINT64 Start;\r
- UINT64 NumberOfBytes;\r
- UINT64 End;\r
- UINT64 MaxAddress;\r
- UINTN Alignment;\r
+ EFI_STATUS Status;\r
+ UINT64 Start;\r
+ UINT64 NumberOfBytes;\r
+ UINT64 End;\r
+ UINT64 MaxAddress;\r
+ UINTN Alignment;\r
+ EFI_MEMORY_TYPE CheckType;\r
\r
if ((UINT32)Type >= MaxAllocateType) {\r
return EFI_INVALID_PARAMETER;\r
// if (Start + NumberOfBytes) rolls over 0 or\r
// if Start is above MAX_ALLOC_ADDRESS or\r
// if End is above MAX_ALLOC_ADDRESS,\r
+ // if Start..End overlaps any tracked MemoryTypeStatistics range\r
// return EFI_NOT_FOUND.\r
//\r
if (Type == AllocateAddress) {\r
(End > MaxAddress)) {\r
return EFI_NOT_FOUND;\r
}\r
+\r
+ //\r
+ // A driver is allowed to call AllocatePages using an AllocateAddress type. This type of\r
+ // AllocatePage request the exact physical address if it is not used. The existing code\r
+ // will allow this request even in 'special' pages. The problem with this is that the\r
+ // reason to have 'special' pages for OS hibernate/resume is defeated as memory is\r
+ // fragmented.\r
+ //\r
+\r
+ for (CheckType = (EFI_MEMORY_TYPE) 0; CheckType < EfiMaxMemoryType; CheckType++) {\r
+ if (MemoryType != CheckType &&\r
+ mMemoryTypeStatistics[CheckType].Special &&\r
+ mMemoryTypeStatistics[CheckType].NumberOfPages > 0) {\r
+ if (Start >= mMemoryTypeStatistics[CheckType].BaseAddress &&\r
+ Start <= mMemoryTypeStatistics[CheckType].MaximumAddress) {\r
+ return EFI_NOT_FOUND;\r
+ }\r
+ if (End >= mMemoryTypeStatistics[CheckType].BaseAddress &&\r
+ End <= mMemoryTypeStatistics[CheckType].MaximumAddress) {\r
+ return EFI_NOT_FOUND;\r
+ }\r
+ if (Start < mMemoryTypeStatistics[CheckType].BaseAddress &&\r
+ End > mMemoryTypeStatistics[CheckType].MaximumAddress) {\r
+ return EFI_NOT_FOUND;\r
+ }\r
+ }\r
+ }\r
}\r
\r
if (Type == AllocateMaxAddress) {\r
MemoryMap->VirtualStart = 0;\r
MemoryMap->NumberOfPages = RShiftU64 ((MergeGcdMapEntry.EndAddress - MergeGcdMapEntry.BaseAddress + 1), EFI_PAGE_SHIFT);\r
MemoryMap->Attribute = (MergeGcdMapEntry.Attributes & ~EFI_MEMORY_PORT_IO) |\r
- (MergeGcdMapEntry.Capabilities & (EFI_MEMORY_RP | EFI_MEMORY_WP | EFI_MEMORY_XP | EFI_MEMORY_RO |\r
- EFI_MEMORY_UC | EFI_MEMORY_UCE | EFI_MEMORY_WC | EFI_MEMORY_WT | EFI_MEMORY_WB));\r
+ (MergeGcdMapEntry.Capabilities & (EFI_CACHE_ATTRIBUTE_MASK | EFI_MEMORY_ATTRIBUTE_MASK));\r
\r
if (MergeGcdMapEntry.GcdMemoryType == EfiGcdMemoryTypeReserved) {\r
MemoryMap->Type = EfiReservedMemoryType;\r
MemoryMap->VirtualStart = 0;\r
MemoryMap->NumberOfPages = RShiftU64 ((MergeGcdMapEntry.EndAddress - MergeGcdMapEntry.BaseAddress + 1), EFI_PAGE_SHIFT);\r
MemoryMap->Attribute = MergeGcdMapEntry.Attributes | EFI_MEMORY_NV |\r
- (MergeGcdMapEntry.Capabilities & (EFI_MEMORY_RP | EFI_MEMORY_WP | EFI_MEMORY_XP | EFI_MEMORY_RO |\r
- EFI_MEMORY_UC | EFI_MEMORY_UCE | EFI_MEMORY_WC | EFI_MEMORY_WT | EFI_MEMORY_WB));\r
+ (MergeGcdMapEntry.Capabilities & (EFI_CACHE_ATTRIBUTE_MASK | EFI_MEMORY_ATTRIBUTE_MASK));\r
MemoryMap->Type = EfiPersistentMemory;\r
\r
//\r
MemoryMapEnd = MemoryMap;\r
MemoryMap = MemoryMapStart;\r
while (MemoryMap < MemoryMapEnd) {\r
- MemoryMap->Attribute &= ~(UINT64)(EFI_MEMORY_RP | EFI_MEMORY_RO |\r
- EFI_MEMORY_XP);\r
+ MemoryMap->Attribute &= ~(UINT64)EFI_MEMORY_ATTRIBUTE_MASK;\r
MemoryMap = NEXT_MEMORY_DESCRIPTOR (MemoryMap, Size);\r
}\r
MergeMemoryMap (MemoryMapStart, &BufferSize, Size);\r