#include "DxeMain.h"\r
#include "Imem.h"\r
#include "HeapGuard.h"\r
+#include <Pi/PrePiDxeCis.h>\r
\r
//\r
// Entry for tracking the memory regions for each memory type to coalesce similar memory types\r
{ 0, MAX_ALLOC_ADDRESS, 0, 0, EfiMaxMemoryType, FALSE, FALSE }, // EfiMemoryMappedIOPortSpace\r
{ 0, MAX_ALLOC_ADDRESS, 0, 0, EfiMaxMemoryType, TRUE, TRUE }, // EfiPalCode\r
{ 0, MAX_ALLOC_ADDRESS, 0, 0, EfiMaxMemoryType, FALSE, FALSE }, // EfiPersistentMemory\r
+ { 0, MAX_ALLOC_ADDRESS, 0, 0, EfiMaxMemoryType, TRUE, FALSE }, // EfiUnacceptedMemoryType\r
{ 0, MAX_ALLOC_ADDRESS, 0, 0, EfiMaxMemoryType, FALSE, FALSE } // EfiMaxMemoryType\r
};\r
\r
EFI_PHYSICAL_ADDRESS mDefaultBaseAddress = MAX_ALLOC_ADDRESS;\r
\r
EFI_MEMORY_TYPE_INFORMATION gMemoryTypeInformation[EfiMaxMemoryType + 1] = {\r
- { EfiReservedMemoryType, 0 },\r
- { EfiLoaderCode, 0 },\r
- { EfiLoaderData, 0 },\r
- { EfiBootServicesCode, 0 },\r
- { EfiBootServicesData, 0 },\r
- { EfiRuntimeServicesCode, 0 },\r
- { EfiRuntimeServicesData, 0 },\r
- { EfiConventionalMemory, 0 },\r
- { EfiUnusableMemory, 0 },\r
- { EfiACPIReclaimMemory, 0 },\r
- { EfiACPIMemoryNVS, 0 },\r
- { EfiMemoryMappedIO, 0 },\r
- { EfiMemoryMappedIOPortSpace, 0 },\r
- { EfiPalCode, 0 },\r
- { EfiPersistentMemory, 0 },\r
- { EfiMaxMemoryType, 0 }\r
+ { EfiReservedMemoryType, 0 },\r
+ { EfiLoaderCode, 0 },\r
+ { EfiLoaderData, 0 },\r
+ { EfiBootServicesCode, 0 },\r
+ { EfiBootServicesData, 0 },\r
+ { EfiRuntimeServicesCode, 0 },\r
+ { EfiRuntimeServicesData, 0 },\r
+ { EfiConventionalMemory, 0 },\r
+ { EfiUnusableMemory, 0 },\r
+ { EfiACPIReclaimMemory, 0 },\r
+ { EfiACPIMemoryNVS, 0 },\r
+ { EfiMemoryMappedIO, 0 },\r
+ { EfiMemoryMappedIOPortSpace, 0 },\r
+ { EfiPalCode, 0 },\r
+ { EfiPersistentMemory, 0 },\r
+ { EFI_GCD_MEMORY_TYPE_UNACCEPTED, 0 },\r
+ { EfiMaxMemoryType, 0 }\r
};\r
//\r
// Only used when load module at fixed address feature is enabled. True means the memory is alreay successfully allocated\r
}\r
\r
if (((MemoryType >= EfiMaxMemoryType) && (MemoryType < MEMORY_TYPE_OEM_RESERVED_MIN)) ||\r
- (MemoryType == EfiConventionalMemory) || (MemoryType == EfiPersistentMemory))\r
+ (MemoryType == EfiConventionalMemory) || (MemoryType == EfiPersistentMemory) || (MemoryType == EfiUnacceptedMemoryType))\r
{\r
return EFI_INVALID_PARAMETER;\r
}\r
MemoryMap = MergeMemoryMapDescriptor (MemoryMapStart, MemoryMap, Size);\r
}\r
\r
+ if (MergeGcdMapEntry.GcdMemoryType == EFI_GCD_MEMORY_TYPE_UNACCEPTED) {\r
+ //\r
+ // Page Align GCD range is required. When it is converted to EFI_MEMORY_DESCRIPTOR,\r
+ // it will be recorded as page PhysicalStart and NumberOfPages.\r
+ //\r
+ ASSERT ((MergeGcdMapEntry.BaseAddress & EFI_PAGE_MASK) == 0);\r
+ ASSERT (((MergeGcdMapEntry.EndAddress - MergeGcdMapEntry.BaseAddress + 1) & EFI_PAGE_MASK) == 0);\r
+\r
+ //\r
+ // Create EFI_MEMORY_DESCRIPTOR for every Unaccepted GCD entries\r
+ //\r
+ MemoryMap->PhysicalStart = MergeGcdMapEntry.BaseAddress;\r
+ MemoryMap->VirtualStart = 0;\r
+ MemoryMap->NumberOfPages = RShiftU64 ((MergeGcdMapEntry.EndAddress - MergeGcdMapEntry.BaseAddress + 1), EFI_PAGE_SHIFT);\r
+ MemoryMap->Attribute = MergeGcdMapEntry.Attributes |\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
+ MemoryMap->Type = EfiUnacceptedMemoryType;\r
+\r
+ //\r
+ // Check to see if the new Memory Map Descriptor can be merged with an\r
+ // existing descriptor if they are adjacent and have the same attributes\r
+ //\r
+ MemoryMap = MergeMemoryMapDescriptor (MemoryMapStart, MemoryMap, Size);\r
+ }\r
+\r
if (Link == &mGcdMemorySpaceMap) {\r
//\r
// break loop when arrive at head.\r