EFI_RESOURCE_ATTRIBUTE_READ_PROTECTED | \\r
EFI_RESOURCE_ATTRIBUTE_WRITE_PROTECTED | \\r
EFI_RESOURCE_ATTRIBUTE_EXECUTION_PROTECTED | \\r
+ EFI_RESOURCE_ATTRIBUTE_READ_ONLY_PROTECTED | \\r
EFI_RESOURCE_ATTRIBUTE_16_BIT_IO | \\r
EFI_RESOURCE_ATTRIBUTE_32_BIT_IO | \\r
EFI_RESOURCE_ATTRIBUTE_64_BIT_IO | \\r
};\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_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
"Reserved ", // EfiGcdMemoryTypeReserved\r
"SystemMem", // EfiGcdMemoryTypeSystemMemory\r
"MMIO ", // EfiGcdMemoryTypeMemoryMappedIo\r
- "PersistentMem",// EfiGcdMemoryTypePersistentMemory\r
+ "PersisMem", // EfiGcdMemoryTypePersistentMemory\r
+ "MoreRelia", // EfiGcdMemoryTypeMoreReliable\r
"Unknown " // EfiGcdMemoryTypeMaximum\r
};\r
\r
((Attributes & EFI_RESOURCE_ATTRIBUTE_WRITE_PROTECTABLE) != 0));\r
ASSERT (((Attributes & EFI_RESOURCE_ATTRIBUTE_EXECUTION_PROTECTED) == 0) ||\r
((Attributes & EFI_RESOURCE_ATTRIBUTE_EXECUTION_PROTECTABLE) != 0));\r
+ ASSERT (((Attributes & EFI_RESOURCE_ATTRIBUTE_READ_ONLY_PROTECTED) == 0) ||\r
+ ((Attributes & EFI_RESOURCE_ATTRIBUTE_READ_ONLY_PROTECTABLE) != 0));\r
ASSERT (((Attributes & EFI_RESOURCE_ATTRIBUTE_PERSISTENT) == 0) ||\r
((Attributes & EFI_RESOURCE_ATTRIBUTE_PERSISTABLE) != 0));\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
UINTN Index;\r
UINT64 Capabilities;\r
EFI_HOB_CPU * CpuHob;\r
+ EFI_GCD_MEMORY_SPACE_DESCRIPTOR *MemorySpaceMapHobList;\r
\r
//\r
// Cache the PHIT HOB for later use\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
}\r
}\r
\r
- //\r
- // Relocate HOB List to an allocated pool buffer.\r
- //\r
- NewHobList = AllocateCopyPool (\r
- (UINTN)PhitHob->EfiFreeMemoryBottom - (UINTN)(*HobStart),\r
- *HobStart\r
- );\r
- ASSERT (NewHobList != NULL);\r
-\r
- *HobStart = NewHobList;\r
- gHobList = NewHobList;\r
-\r
//\r
// Add and allocate the remaining unallocated system memory to the memory services.\r
//\r
Status = CoreGetMemorySpaceMap (&NumberOfDescriptors, &MemorySpaceMap);\r
ASSERT (Status == EFI_SUCCESS);\r
\r
+ MemorySpaceMapHobList = NULL;\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
if (Length == 0 || MemorySpaceMap[Index].BaseAddress + MemorySpaceMap[Index].Length < BaseAddress) {\r
continue;\r
}\r
+ if (((UINTN) MemorySpaceMap[Index].BaseAddress <= (UINTN) (*HobStart)) &&\r
+ ((UINTN) (MemorySpaceMap[Index].BaseAddress + MemorySpaceMap[Index].Length) >= (UINTN) PhitHob->EfiFreeMemoryBottom)) {\r
+ //\r
+ // Skip the memory space that covers HOB List, it should be processed\r
+ // after HOB List relocation to avoid the resources allocated by others\r
+ // to corrupt HOB List before its relocation.\r
+ //\r
+ MemorySpaceMapHobList = &MemorySpaceMap[Index];\r
+ continue;\r
+ }\r
CoreAddMemoryDescriptor (\r
EfiConventionalMemory,\r
BaseAddress,\r
);\r
Status = CoreAllocateMemorySpace (\r
EfiGcdAllocateAddress,\r
- EfiGcdMemoryTypeSystemMemory,\r
+ MemorySpaceMap[Index].GcdMemoryType,\r
0,\r
Length,\r
&BaseAddress,\r
}\r
}\r
}\r
+\r
+ //\r
+ // Relocate HOB List to an allocated pool buffer.\r
+ // The relocation should be at after all the tested memory resources added\r
+ // (except the memory space that covers HOB List) to the memory services,\r
+ // because the memory resource found in CoreInitializeMemoryServices()\r
+ // may have not enough remaining resource for HOB List.\r
+ //\r
+ NewHobList = AllocateCopyPool (\r
+ (UINTN) PhitHob->EfiFreeMemoryBottom - (UINTN) (*HobStart),\r
+ *HobStart\r
+ );\r
+ ASSERT (NewHobList != NULL);\r
+\r
+ *HobStart = NewHobList;\r
+ gHobList = NewHobList;\r
+\r
+ if (MemorySpaceMapHobList != NULL) {\r
+ //\r
+ // Add and allocate the memory space that covers HOB List to the memory services\r
+ // after HOB List relocation.\r
+ //\r
+ BaseAddress = PageAlignAddress (MemorySpaceMapHobList->BaseAddress);\r
+ Length = PageAlignLength (MemorySpaceMapHobList->BaseAddress + MemorySpaceMapHobList->Length - BaseAddress);\r
+ CoreAddMemoryDescriptor (\r
+ EfiConventionalMemory,\r
+ BaseAddress,\r
+ RShiftU64 (Length, EFI_PAGE_SHIFT),\r
+ MemorySpaceMapHobList->Capabilities & (~EFI_MEMORY_RUNTIME)\r
+ );\r
+ Status = CoreAllocateMemorySpace (\r
+ EfiGcdAllocateAddress,\r
+ MemorySpaceMapHobList->GcdMemoryType,\r
+ 0,\r
+ Length,\r
+ &BaseAddress,\r
+ gDxeCoreImageHandle,\r
+ NULL\r
+ );\r
+ }\r
+\r
CoreFreePool (MemorySpaceMap);\r
\r
return EFI_SUCCESS;\r