/** @file\r
UEFI PropertiesTable support\r
\r
-Copyright (c) 2015, Intel Corporation. All rights reserved.<BR>\r
+Copyright (c) 2015 - 2016, Intel Corporation. All rights reserved.<BR>\r
This program and the accompanying materials\r
are licensed and made available under the terms and conditions of the BSD License\r
which accompanies this distribution. The full text of the license may be found at\r
\r
EFI_LOCK mPropertiesTableLock = EFI_INITIALIZE_LOCK_VARIABLE (TPL_NOTIFY);\r
\r
+BOOLEAN mPropertiesTableEnable;\r
+\r
//\r
// Below functions are for MemoryMap\r
//\r
CopyMem (NewMemoryMapEntry, MemoryMapEntry, sizeof(EFI_MEMORY_DESCRIPTOR));\r
NextMemoryMapEntry = NEXT_MEMORY_DESCRIPTOR (MemoryMapEntry, DescriptorSize);\r
\r
- MemoryBlockLength = (UINT64) (EfiPagesToSize (MemoryMapEntry->NumberOfPages));\r
- if (((UINTN)NextMemoryMapEntry < (UINTN)MemoryMapEnd) &&\r
- (MemoryMapEntry->Type == NextMemoryMapEntry->Type) &&\r
- (MemoryMapEntry->Attribute == NextMemoryMapEntry->Attribute) &&\r
- ((MemoryMapEntry->PhysicalStart + MemoryBlockLength) == NextMemoryMapEntry->PhysicalStart)) {\r
- NewMemoryMapEntry->NumberOfPages += NextMemoryMapEntry->NumberOfPages;\r
- MemoryMapEntry = NextMemoryMapEntry;\r
- }\r
+ do {\r
+ MemoryBlockLength = (UINT64) (EfiPagesToSize (MemoryMapEntry->NumberOfPages));\r
+ if (((UINTN)NextMemoryMapEntry < (UINTN)MemoryMapEnd) &&\r
+ (MemoryMapEntry->Type == NextMemoryMapEntry->Type) &&\r
+ (MemoryMapEntry->Attribute == NextMemoryMapEntry->Attribute) &&\r
+ ((MemoryMapEntry->PhysicalStart + MemoryBlockLength) == NextMemoryMapEntry->PhysicalStart)) {\r
+ MemoryMapEntry->NumberOfPages += NextMemoryMapEntry->NumberOfPages;\r
+ if (NewMemoryMapEntry != MemoryMapEntry) {\r
+ NewMemoryMapEntry->NumberOfPages += NextMemoryMapEntry->NumberOfPages;\r
+ }\r
+\r
+ NextMemoryMapEntry = NEXT_MEMORY_DESCRIPTOR (NextMemoryMapEntry, DescriptorSize);\r
+ continue;\r
+ } else {\r
+ MemoryMapEntry = PREVIOUS_MEMORY_DESCRIPTOR (NextMemoryMapEntry, DescriptorSize);\r
+ break;\r
+ }\r
+ } while (TRUE);\r
\r
MemoryMapEntry = NEXT_MEMORY_DESCRIPTOR (MemoryMapEntry, DescriptorSize);\r
NewMemoryMapEntry = NEXT_MEMORY_DESCRIPTOR (NewMemoryMapEntry, DescriptorSize);\r
//\r
// DATA\r
//\r
- NewRecord->Type = EfiRuntimeServicesData;\r
+ if (!mPropertiesTableEnable) {\r
+ NewRecord->Type = TempRecord.Type;\r
+ } else {\r
+ NewRecord->Type = EfiRuntimeServicesData;\r
+ }\r
NewRecord->PhysicalStart = TempRecord.PhysicalStart;\r
NewRecord->VirtualStart = 0;\r
NewRecord->NumberOfPages = EfiSizeToPages(ImageRecordCodeSection->CodeSegmentBase - NewRecord->PhysicalStart);\r
//\r
// CODE\r
//\r
- NewRecord->Type = EfiRuntimeServicesCode;\r
+ if (!mPropertiesTableEnable) {\r
+ NewRecord->Type = TempRecord.Type;\r
+ } else {\r
+ NewRecord->Type = EfiRuntimeServicesCode;\r
+ }\r
NewRecord->PhysicalStart = ImageRecordCodeSection->CodeSegmentBase;\r
NewRecord->VirtualStart = 0;\r
NewRecord->NumberOfPages = EfiSizeToPages(ImageRecordCodeSection->CodeSegmentSize);\r
// Final DATA\r
//\r
if (TempRecord.PhysicalStart < ImageEnd) {\r
- NewRecord->Type = EfiRuntimeServicesData;\r
+ if (!mPropertiesTableEnable) {\r
+ NewRecord->Type = TempRecord.Type;\r
+ } else {\r
+ NewRecord->Type = EfiRuntimeServicesData;\r
+ }\r
NewRecord->PhysicalStart = TempRecord.PhysicalStart;\r
NewRecord->VirtualStart = 0;\r
NewRecord->NumberOfPages = EfiSizeToPages (ImageEnd - TempRecord.PhysicalStart);\r
UINT64 PhysicalEnd;\r
UINTN NewRecordCount;\r
UINTN TotalNewRecordCount;\r
+ BOOLEAN IsLastRecordData;\r
\r
if (MaxSplitRecordCount == 0) {\r
CopyMem (NewRecord, OldRecord, DescriptorSize);\r
// If this is still address in this record, need record.\r
//\r
NewRecord = PREVIOUS_MEMORY_DESCRIPTOR (NewRecord, DescriptorSize);\r
- if (NewRecord->Type == EfiRuntimeServicesData) {\r
+ IsLastRecordData = FALSE;\r
+ if (!mPropertiesTableEnable) {\r
+ if ((NewRecord->Attribute & EFI_MEMORY_XP) != 0) {\r
+ IsLastRecordData = TRUE;\r
+ }\r
+ } else {\r
+ if (NewRecord->Type == EfiRuntimeServicesData) {\r
+ IsLastRecordData = TRUE;\r
+ }\r
+ }\r
+ if (IsLastRecordData) {\r
//\r
// Last record is DATA, just merge it.\r
//\r
// Last record is CODE, create a new DATA entry.\r
//\r
NewRecord = NEXT_MEMORY_DESCRIPTOR (NewRecord, DescriptorSize);\r
- NewRecord->Type = EfiRuntimeServicesData;\r
+ if (!mPropertiesTableEnable) {\r
+ NewRecord->Type = TempRecord.Type;\r
+ } else {\r
+ NewRecord->Type = EfiRuntimeServicesData;\r
+ }\r
NewRecord->PhysicalStart = TempRecord.PhysicalStart;\r
NewRecord->VirtualStart = 0;\r
NewRecord->NumberOfPages = TempRecord.NumberOfPages;\r
}\r
\r
/**\r
- This function for GetMemoryMap() with properties table.\r
+ This function for GetMemoryMap() with properties table capability.\r
\r
It calls original GetMemoryMap() to get the original memory map information. Then\r
plus the additional memory map entries for PE Code/Data seperation.\r
@retval EFI_INVALID_PARAMETER One of the parameters has an invalid value.\r
\r
**/\r
-STATIC\r
EFI_STATUS\r
EFIAPI\r
-CoreGetMemoryMapPropertiesTable (\r
+CoreGetMemoryMapWithSeparatedImageSection (\r
IN OUT UINTN *MemoryMapSize,\r
IN OUT EFI_MEMORY_DESCRIPTOR *MemoryMap,\r
OUT UINTN *MapKey,\r
if (Status == EFI_BUFFER_TOO_SMALL) {\r
*MemoryMapSize = *MemoryMapSize + (*DescriptorSize) * AdditionalRecordCount;\r
} else if (Status == EFI_SUCCESS) {\r
+ ASSERT (MemoryMap != NULL);\r
if (OldMemoryMapSize - *MemoryMapSize < (*DescriptorSize) * AdditionalRecordCount) {\r
*MemoryMapSize = *MemoryMapSize + (*DescriptorSize) * AdditionalRecordCount;\r
//\r
return ;\r
}\r
\r
- gBS->GetMemoryMap = CoreGetMemoryMapPropertiesTable;\r
+ gBS->GetMemoryMap = CoreGetMemoryMapWithSeparatedImageSection;\r
gBS->Hdr.CRC32 = 0;\r
gBS->CalculateCrc32 ((UINT8 *)gBS, gBS->Hdr.HeaderSize, &gBS->Hdr.CRC32);\r
\r
DEBUG ((EFI_D_VERBOSE, "Total Image Count - 0x%x\n", mImagePropertiesPrivateData.ImageRecordCount));\r
DEBUG ((EFI_D_VERBOSE, "Dump ImageRecord:\n"));\r
DumpImageRecord ();\r
+\r
+ mPropertiesTableEnable = TRUE;\r
}\r
}\r
\r