};\r
\r
GCD_ATTRIBUTE_CONVERSION_ENTRY mAttributeConversionTable[] = {\r
- { EFI_RESOURCE_ATTRIBUTE_UNCACHEABLE, EFI_MEMORY_UC, TRUE },\r
- { EFI_RESOURCE_ATTRIBUTE_UNCACHED_EXPORTED, EFI_MEMORY_UCE, TRUE },\r
- { EFI_RESOURCE_ATTRIBUTE_WRITE_COMBINEABLE, EFI_MEMORY_WC, TRUE },\r
- { EFI_RESOURCE_ATTRIBUTE_WRITE_THROUGH_CACHEABLE, EFI_MEMORY_WT, TRUE },\r
- { EFI_RESOURCE_ATTRIBUTE_WRITE_BACK_CACHEABLE, EFI_MEMORY_WB, TRUE },\r
- { EFI_RESOURCE_ATTRIBUTE_READ_PROTECTABLE, EFI_MEMORY_RP, TRUE },\r
- { EFI_RESOURCE_ATTRIBUTE_WRITE_PROTECTABLE, EFI_MEMORY_WP, TRUE },\r
- { EFI_RESOURCE_ATTRIBUTE_EXECUTION_PROTECTABLE, EFI_MEMORY_XP, TRUE },\r
- { EFI_RESOURCE_ATTRIBUTE_READ_ONLY_PROTECTABLE, EFI_MEMORY_RO, TRUE },\r
- { EFI_RESOURCE_ATTRIBUTE_PRESENT, EFI_MEMORY_PRESENT, FALSE },\r
- { EFI_RESOURCE_ATTRIBUTE_INITIALIZED, EFI_MEMORY_INITIALIZED, FALSE },\r
- { EFI_RESOURCE_ATTRIBUTE_TESTED, EFI_MEMORY_TESTED, FALSE },\r
- { EFI_RESOURCE_ATTRIBUTE_PERSISTABLE, EFI_MEMORY_NV, TRUE },\r
- { 0, 0, FALSE }\r
+ { EFI_RESOURCE_ATTRIBUTE_UNCACHEABLE, EFI_MEMORY_UC, TRUE },\r
+ { EFI_RESOURCE_ATTRIBUTE_UNCACHED_EXPORTED, EFI_MEMORY_UCE, TRUE },\r
+ { EFI_RESOURCE_ATTRIBUTE_WRITE_COMBINEABLE, EFI_MEMORY_WC, TRUE },\r
+ { EFI_RESOURCE_ATTRIBUTE_WRITE_THROUGH_CACHEABLE, EFI_MEMORY_WT, TRUE },\r
+ { EFI_RESOURCE_ATTRIBUTE_WRITE_BACK_CACHEABLE, EFI_MEMORY_WB, TRUE },\r
+ { EFI_RESOURCE_ATTRIBUTE_READ_PROTECTABLE, EFI_MEMORY_RP, TRUE },\r
+ { EFI_RESOURCE_ATTRIBUTE_WRITE_PROTECTABLE, EFI_MEMORY_WP, TRUE },\r
+ { EFI_RESOURCE_ATTRIBUTE_EXECUTION_PROTECTABLE, EFI_MEMORY_XP, TRUE },\r
+ { EFI_RESOURCE_ATTRIBUTE_READ_ONLY_PROTECTABLE, EFI_MEMORY_RO, TRUE },\r
+ { EFI_RESOURCE_ATTRIBUTE_PRESENT, EFI_MEMORY_PRESENT, FALSE },\r
+ { EFI_RESOURCE_ATTRIBUTE_INITIALIZED, EFI_MEMORY_INITIALIZED, FALSE },\r
+ { EFI_RESOURCE_ATTRIBUTE_TESTED, EFI_MEMORY_TESTED, FALSE },\r
+ { EFI_RESOURCE_ATTRIBUTE_PERSISTABLE, EFI_MEMORY_NV, TRUE },\r
+ { EFI_RESOURCE_ATTRIBUTE_MORE_RELIABLE, EFI_MEMORY_MORE_RELIABLE, TRUE },\r
+ { 0, 0, FALSE }\r
};\r
\r
///\r
"SystemMem", // EfiGcdMemoryTypeSystemMemory\r
"MMIO ", // EfiGcdMemoryTypeMemoryMappedIo\r
"PersistentMem",// EfiGcdMemoryTypePersistentMemory\r
+ "MoreRelia", // EfiGcdMemoryTypeMoreReliable\r
"Unknown " // EfiGcdMemoryTypeMaximum\r
};\r
\r
\r
Status = CoreInternalAddMemorySpace (GcdMemoryType, BaseAddress, Length, Capabilities);\r
\r
- if (!EFI_ERROR (Status) && GcdMemoryType == EfiGcdMemoryTypeSystemMemory) {\r
+ if (!EFI_ERROR (Status) && ((GcdMemoryType == EfiGcdMemoryTypeSystemMemory) || (GcdMemoryType == EfiGcdMemoryTypeMoreReliable))) {\r
\r
- PageBaseAddress = PageAlignLength (BaseAddress);\r
+ PageBaseAddress = PageAlignAddress (BaseAddress);\r
PageLength = PageAlignLength (BaseAddress + Length - PageBaseAddress);\r
\r
Status = CoreAllocateMemorySpace (\r
// Convert the Resource HOB Attributes to an EFI Memory Capabilities mask\r
//\r
for (Capabilities = 0, Conversion = mAttributeConversionTable; Conversion->Attribute != 0; Conversion++) {\r
- if (Conversion->Memory || (GcdMemoryType != EfiGcdMemoryTypeSystemMemory)) {\r
+ if (Conversion->Memory || ((GcdMemoryType != EfiGcdMemoryTypeSystemMemory) && (GcdMemoryType != EfiGcdMemoryTypeMoreReliable))) {\r
if (Attributes & Conversion->Attribute) {\r
Capabilities |= Conversion->Capability;\r
}\r
//\r
// Convert the Resource HOB Attributes to an EFI Memory Capabilities mask\r
//\r
- Capabilities = CoreConvertResourceDescriptorHobAttributesToCapabilities (EfiGcdMemoryTypeSystemMemory, Attributes);\r
+ if ((Attributes & EFI_RESOURCE_ATTRIBUTE_MORE_RELIABLE) == EFI_RESOURCE_ATTRIBUTE_MORE_RELIABLE) {\r
+ Capabilities = CoreConvertResourceDescriptorHobAttributesToCapabilities (EfiGcdMemoryTypeMoreReliable, Attributes);\r
+ } else {\r
+ Capabilities = CoreConvertResourceDescriptorHobAttributesToCapabilities (EfiGcdMemoryTypeSystemMemory, Attributes);\r
+ }\r
\r
//\r
// Declare the very first memory region, so the EFI Memory Services are available.\r
switch (ResourceHob->ResourceType) {\r
case EFI_RESOURCE_SYSTEM_MEMORY:\r
if ((ResourceHob->ResourceAttribute & MEMORY_ATTRIBUTE_MASK) == TESTED_MEMORY_ATTRIBUTES) {\r
- GcdMemoryType = EfiGcdMemoryTypeSystemMemory;\r
+ if ((ResourceHob->ResourceAttribute & EFI_RESOURCE_ATTRIBUTE_MORE_RELIABLE) == EFI_RESOURCE_ATTRIBUTE_MORE_RELIABLE) {\r
+ GcdMemoryType = EfiGcdMemoryTypeMoreReliable;\r
+ } else {\r
+ GcdMemoryType = EfiGcdMemoryTypeSystemMemory;\r
+ }\r
}\r
if ((ResourceHob->ResourceAttribute & MEMORY_ATTRIBUTE_MASK) == INITIALIZED_MEMORY_ATTRIBUTES) {\r
GcdMemoryType = EfiGcdMemoryTypeReserved;\r
//\r
// Allocate first memory region from the GCD by the DXE core\r
//\r
- Status = CoreAllocateMemorySpace (\r
- EfiGcdAllocateAddress,\r
- EfiGcdMemoryTypeSystemMemory,\r
- 0,\r
- MemoryLength,\r
- &MemoryBaseAddress,\r
- gDxeCoreImageHandle,\r
- NULL\r
- );\r
+ Status = CoreGetMemorySpaceDescriptor (MemoryBaseAddress, &Descriptor);\r
+ if (!EFI_ERROR (Status)) {\r
+ ASSERT ((Descriptor.GcdMemoryType == EfiGcdMemoryTypeSystemMemory) ||\r
+ (Descriptor.GcdMemoryType == EfiGcdMemoryTypeMoreReliable));\r
+ Status = CoreAllocateMemorySpace (\r
+ EfiGcdAllocateAddress,\r
+ Descriptor.GcdMemoryType,\r
+ 0,\r
+ MemoryLength,\r
+ &MemoryBaseAddress,\r
+ gDxeCoreImageHandle,\r
+ NULL\r
+ );\r
+ }\r
\r
//\r
// Walk the HOB list and allocate all memory space that is consumed by memory allocation HOBs,\r
gDxeCoreImageHandle,\r
NULL\r
);\r
- if (!EFI_ERROR (Status) && Descriptor.GcdMemoryType == EfiGcdMemoryTypeSystemMemory) {\r
+ if (!EFI_ERROR (Status) &&\r
+ ((Descriptor.GcdMemoryType == EfiGcdMemoryTypeSystemMemory) ||\r
+ (Descriptor.GcdMemoryType == EfiGcdMemoryTypeMoreReliable))) {\r
CoreAddMemoryDescriptor (\r
MemoryHob->AllocDescriptor.MemoryType,\r
MemoryHob->AllocDescriptor.MemoryBaseAddress,\r
ASSERT (Status == EFI_SUCCESS);\r
\r
for (Index = 0; Index < NumberOfDescriptors; Index++) {\r
- if (MemorySpaceMap[Index].GcdMemoryType == EfiGcdMemoryTypeSystemMemory) {\r
+ if ((MemorySpaceMap[Index].GcdMemoryType == EfiGcdMemoryTypeSystemMemory) ||\r
+ (MemorySpaceMap[Index].GcdMemoryType == EfiGcdMemoryTypeMoreReliable)) {\r
if (MemorySpaceMap[Index].ImageHandle == NULL) {\r
BaseAddress = PageAlignAddress (MemorySpaceMap[Index].BaseAddress);\r
Length = PageAlignLength (MemorySpaceMap[Index].BaseAddress + MemorySpaceMap[Index].Length - BaseAddress);\r
);\r
Status = CoreAllocateMemorySpace (\r
EfiGcdAllocateAddress,\r
- EfiGcdMemoryTypeSystemMemory,\r
+ MemorySpaceMap[Index].GcdMemoryType,\r
0,\r
Length,\r
&BaseAddress,\r