X-Git-Url: https://git.proxmox.com/?p=mirror_edk2.git;a=blobdiff_plain;f=MdeModulePkg%2FCore%2FDxe%2FMisc%2FPropertiesTable.c;h=7ecad89c22991f6f48eec74b8e5a8adf982946fc;hp=5e409eba6f76d806a7c98447780629686e24cd68;hb=0ab90add0f525eb9c91ce4bc2357298c4f357d09;hpb=03d486b2a019a7acb165e57ffd02982e2002820d diff --git a/MdeModulePkg/Core/Dxe/Misc/PropertiesTable.c b/MdeModulePkg/Core/Dxe/Misc/PropertiesTable.c index 5e409eba6f..7ecad89c22 100644 --- a/MdeModulePkg/Core/Dxe/Misc/PropertiesTable.c +++ b/MdeModulePkg/Core/Dxe/Misc/PropertiesTable.c @@ -1,7 +1,7 @@ /** @file UEFI PropertiesTable support -Copyright (c) 2015, Intel Corporation. All rights reserved.
+Copyright (c) 2015 - 2016, Intel Corporation. All rights reserved.
This program and the accompanying materials are licensed and made available under the terms and conditions of the BSD License which accompanies this distribution. The full text of the license may be found at @@ -80,6 +80,8 @@ EFI_PROPERTIES_TABLE mPropertiesTable = { EFI_LOCK mPropertiesTableLock = EFI_INITIALIZE_LOCK_VARIABLE (TPL_NOTIFY); +BOOLEAN mPropertiesTableEnable; + // // Below functions are for MemoryMap // @@ -94,6 +96,7 @@ EFI_LOCK mPropertiesTableLock = EFI_INITIALIZE_LOCK_VARIABLE (TPL_NOTI @return The number of bytes associated with the number of EFI_PAGEs specified by Pages. **/ +STATIC UINT64 EfiPagesToSize ( IN UINT64 Pages @@ -113,6 +116,7 @@ EfiPagesToSize ( by Size. **/ +STATIC UINT64 EfiSizeToPages ( IN UINT64 Size @@ -124,6 +128,7 @@ EfiSizeToPages ( /** Acquire memory lock on mPropertiesTableLock. **/ +STATIC VOID CoreAcquirePropertiesTableLock ( VOID @@ -135,6 +140,7 @@ CoreAcquirePropertiesTableLock ( /** Release memory lock on mPropertiesTableLock. **/ +STATIC VOID CoreReleasePropertiesTableLock ( VOID @@ -143,35 +149,6 @@ CoreReleasePropertiesTableLock ( CoreReleaseLock (&mPropertiesTableLock); } -/** - Dump memory map. - - @param MemoryMap A pointer to the buffer in which firmware places - the current memory map. - @param MemoryMapSize Size, in bytes, of the MemoryMap buffer. - @param DescriptorSize Size, in bytes, of an individual EFI_MEMORY_DESCRIPTOR. -**/ -VOID -DumpMemoryMap ( - IN EFI_MEMORY_DESCRIPTOR *MemoryMap, - IN UINTN MemoryMapSize, - IN UINTN DescriptorSize - ) -{ - EFI_MEMORY_DESCRIPTOR *MemoryMapEntry; - EFI_MEMORY_DESCRIPTOR *MemoryMapEnd; - UINT64 MemoryBlockLength; - - DEBUG ((EFI_D_VERBOSE, " MemoryMap:\n")); - MemoryMapEntry = MemoryMap; - MemoryMapEnd = (EFI_MEMORY_DESCRIPTOR *) ((UINT8 *) MemoryMap + MemoryMapSize); - while (MemoryMapEntry < MemoryMapEnd) { - MemoryBlockLength = (UINT64) (EfiPagesToSize (MemoryMapEntry->NumberOfPages)); - DEBUG ((EFI_D_VERBOSE, " Entry(0x%02x) 0x%016lx - 0x%016lx (0x%016lx)\n", MemoryMapEntry->Type, MemoryMapEntry->PhysicalStart, MemoryMapEntry->PhysicalStart + MemoryBlockLength, MemoryMapEntry->Attribute)); - MemoryMapEntry = NEXT_MEMORY_DESCRIPTOR (MemoryMapEntry, DescriptorSize); - } -} - /** Sort memory map entries based upon PhysicalStart, from low to high. @@ -180,6 +157,7 @@ DumpMemoryMap ( @param MemoryMapSize Size, in bytes, of the MemoryMap buffer. @param DescriptorSize Size, in bytes, of an individual EFI_MEMORY_DESCRIPTOR. **/ +STATIC VOID SortMemoryMap ( IN OUT EFI_MEMORY_DESCRIPTOR *MemoryMap, @@ -224,6 +202,7 @@ SortMemoryMap ( it is the size of new memory map after merge. @param DescriptorSize Size, in bytes, of an individual EFI_MEMORY_DESCRIPTOR. **/ +STATIC VOID MergeMemoryMap ( IN OUT EFI_MEMORY_DESCRIPTOR *MemoryMap, @@ -244,14 +223,24 @@ MergeMemoryMap ( CopyMem (NewMemoryMapEntry, MemoryMapEntry, sizeof(EFI_MEMORY_DESCRIPTOR)); NextMemoryMapEntry = NEXT_MEMORY_DESCRIPTOR (MemoryMapEntry, DescriptorSize); - MemoryBlockLength = (UINT64) (EfiPagesToSize (MemoryMapEntry->NumberOfPages)); - if (((UINTN)NextMemoryMapEntry < (UINTN)MemoryMapEnd) && - (MemoryMapEntry->Type == NextMemoryMapEntry->Type) && - (MemoryMapEntry->Attribute == NextMemoryMapEntry->Attribute) && - ((MemoryMapEntry->PhysicalStart + MemoryBlockLength) == NextMemoryMapEntry->PhysicalStart)) { - NewMemoryMapEntry->NumberOfPages += NextMemoryMapEntry->NumberOfPages; - MemoryMapEntry = NextMemoryMapEntry; - } + do { + MemoryBlockLength = (UINT64) (EfiPagesToSize (MemoryMapEntry->NumberOfPages)); + if (((UINTN)NextMemoryMapEntry < (UINTN)MemoryMapEnd) && + (MemoryMapEntry->Type == NextMemoryMapEntry->Type) && + (MemoryMapEntry->Attribute == NextMemoryMapEntry->Attribute) && + ((MemoryMapEntry->PhysicalStart + MemoryBlockLength) == NextMemoryMapEntry->PhysicalStart)) { + MemoryMapEntry->NumberOfPages += NextMemoryMapEntry->NumberOfPages; + if (NewMemoryMapEntry != MemoryMapEntry) { + NewMemoryMapEntry->NumberOfPages += NextMemoryMapEntry->NumberOfPages; + } + + NextMemoryMapEntry = NEXT_MEMORY_DESCRIPTOR (NextMemoryMapEntry, DescriptorSize); + continue; + } else { + MemoryMapEntry = PREVIOUS_MEMORY_DESCRIPTOR (NextMemoryMapEntry, DescriptorSize); + break; + } + } while (TRUE); MemoryMapEntry = NEXT_MEMORY_DESCRIPTOR (MemoryMapEntry, DescriptorSize); NewMemoryMapEntry = NEXT_MEMORY_DESCRIPTOR (NewMemoryMapEntry, DescriptorSize); @@ -271,6 +260,7 @@ MergeMemoryMap ( @param MemoryMapSize Size, in bytes, of the MemoryMap buffer. @param DescriptorSize Size, in bytes, of an individual EFI_MEMORY_DESCRIPTOR. **/ +STATIC VOID EnforceMemoryMapAttribute ( IN OUT EFI_MEMORY_DESCRIPTOR *MemoryMap, @@ -304,59 +294,6 @@ EnforceMemoryMapAttribute ( return ; } -/** - Sort memory map entries whose type is EfiRuntimeServicesCode/EfiRuntimeServicesData, - from high to low. - This function assumes memory map is already from low to high, so it just reverts them. - - @param MemoryMap A pointer to the buffer in which firmware places - the current memory map. - @param MemoryMapSize Size, in bytes, of the MemoryMap buffer. - @param DescriptorSize Size, in bytes, of an individual EFI_MEMORY_DESCRIPTOR. -**/ -VOID -RevertRuntimeMemoryMap ( - IN OUT EFI_MEMORY_DESCRIPTOR *MemoryMap, - IN UINTN MemoryMapSize, - IN UINTN DescriptorSize - ) -{ - EFI_MEMORY_DESCRIPTOR *MemoryMapEntry; - EFI_MEMORY_DESCRIPTOR *MemoryMapEnd; - EFI_MEMORY_DESCRIPTOR TempMemoryMap; - - EFI_MEMORY_DESCRIPTOR *RuntimeMapEntryBegin; - EFI_MEMORY_DESCRIPTOR *RuntimeMapEntryEnd; - - MemoryMapEntry = MemoryMap; - RuntimeMapEntryBegin = NULL; - RuntimeMapEntryEnd = NULL; - MemoryMapEnd = (EFI_MEMORY_DESCRIPTOR *) ((UINT8 *) MemoryMap + MemoryMapSize); - while ((UINTN)MemoryMapEntry < (UINTN)MemoryMapEnd) { - if ((MemoryMapEntry->Type == EfiRuntimeServicesCode) || - (MemoryMapEntry->Type == EfiRuntimeServicesData)) { - if (RuntimeMapEntryBegin == NULL) { - RuntimeMapEntryBegin = MemoryMapEntry; - } - RuntimeMapEntryEnd = MemoryMapEntry; - } - MemoryMapEntry = NEXT_MEMORY_DESCRIPTOR (MemoryMapEntry, DescriptorSize); - } - - MemoryMapEntry = RuntimeMapEntryBegin; - MemoryMapEnd = RuntimeMapEntryEnd; - while (MemoryMapEntry < MemoryMapEnd) { - CopyMem (&TempMemoryMap, MemoryMapEntry, sizeof(EFI_MEMORY_DESCRIPTOR)); - CopyMem (MemoryMapEntry, MemoryMapEnd, sizeof(EFI_MEMORY_DESCRIPTOR)); - CopyMem (MemoryMapEnd, &TempMemoryMap, sizeof(EFI_MEMORY_DESCRIPTOR)); - - MemoryMapEntry = NEXT_MEMORY_DESCRIPTOR (MemoryMapEntry, DescriptorSize); - MemoryMapEnd = PREVIOUS_MEMORY_DESCRIPTOR (MemoryMapEnd, DescriptorSize); - } - - return ; -} - /** Return the first image record, whose [ImageBase, ImageSize] covered by [Buffer, Length]. @@ -365,6 +302,7 @@ RevertRuntimeMemoryMap ( @return first image record covered by [buffer, length] **/ +STATIC IMAGE_PROPERTIES_RECORD * GetImageRecordByAddress ( IN EFI_PHYSICAL_ADDRESS Buffer, @@ -409,6 +347,7 @@ GetImageRecordByAddress ( @param OldRecord A pointer to one old memory map entry. @param DescriptorSize Size, in bytes, of an individual EFI_MEMORY_DESCRIPTOR. **/ +STATIC UINTN SetNewRecord ( IN IMAGE_PROPERTIES_RECORD *ImageRecord, @@ -447,7 +386,11 @@ SetNewRecord ( // // DATA // - NewRecord->Type = EfiRuntimeServicesData; + if (!mPropertiesTableEnable) { + NewRecord->Type = TempRecord.Type; + } else { + NewRecord->Type = EfiRuntimeServicesData; + } NewRecord->PhysicalStart = TempRecord.PhysicalStart; NewRecord->VirtualStart = 0; NewRecord->NumberOfPages = EfiSizeToPages(ImageRecordCodeSection->CodeSegmentBase - NewRecord->PhysicalStart); @@ -460,7 +403,11 @@ SetNewRecord ( // // CODE // - NewRecord->Type = EfiRuntimeServicesCode; + if (!mPropertiesTableEnable) { + NewRecord->Type = TempRecord.Type; + } else { + NewRecord->Type = EfiRuntimeServicesCode; + } NewRecord->PhysicalStart = ImageRecordCodeSection->CodeSegmentBase; NewRecord->VirtualStart = 0; NewRecord->NumberOfPages = EfiSizeToPages(ImageRecordCodeSection->CodeSegmentSize); @@ -484,7 +431,11 @@ SetNewRecord ( // Final DATA // if (TempRecord.PhysicalStart < ImageEnd) { - NewRecord->Type = EfiRuntimeServicesData; + if (!mPropertiesTableEnable) { + NewRecord->Type = TempRecord.Type; + } else { + NewRecord->Type = EfiRuntimeServicesData; + } NewRecord->PhysicalStart = TempRecord.PhysicalStart; NewRecord->VirtualStart = 0; NewRecord->NumberOfPages = EfiSizeToPages (ImageEnd - TempRecord.PhysicalStart); @@ -504,6 +455,7 @@ SetNewRecord ( @retval 0 no entry need to be splitted. @return the max number of new splitted entries **/ +STATIC UINTN GetMaxSplitRecordCount ( IN EFI_MEMORY_DESCRIPTOR *OldRecord @@ -543,11 +495,13 @@ GetMaxSplitRecordCount ( The caller gurantee the buffer size be 1 + (SplitRecordCount * DescriptorSize) calculated below. + @param MaxSplitRecordCount The max number of splitted entries @param DescriptorSize Size, in bytes, of an individual EFI_MEMORY_DESCRIPTOR. @retval 0 no entry is splitted. @return the real number of splitted record. **/ +STATIC UINTN SplitRecord ( IN EFI_MEMORY_DESCRIPTOR *OldRecord, @@ -563,6 +517,7 @@ SplitRecord ( UINT64 PhysicalEnd; UINTN NewRecordCount; UINTN TotalNewRecordCount; + BOOLEAN IsLastRecordData; if (MaxSplitRecordCount == 0) { CopyMem (NewRecord, OldRecord, DescriptorSize); @@ -590,7 +545,17 @@ SplitRecord ( // If this is still address in this record, need record. // NewRecord = PREVIOUS_MEMORY_DESCRIPTOR (NewRecord, DescriptorSize); - if (NewRecord->Type == EfiRuntimeServicesData) { + IsLastRecordData = FALSE; + if (!mPropertiesTableEnable) { + if ((NewRecord->Attribute & EFI_MEMORY_XP) != 0) { + IsLastRecordData = TRUE; + } + } else { + if (NewRecord->Type == EfiRuntimeServicesData) { + IsLastRecordData = TRUE; + } + } + if (IsLastRecordData) { // // Last record is DATA, just merge it. // @@ -600,7 +565,11 @@ SplitRecord ( // Last record is CODE, create a new DATA entry. // NewRecord = NEXT_MEMORY_DESCRIPTOR (NewRecord, DescriptorSize); - NewRecord->Type = EfiRuntimeServicesData; + if (!mPropertiesTableEnable) { + NewRecord->Type = TempRecord.Type; + } else { + NewRecord->Type = EfiRuntimeServicesData; + } NewRecord->PhysicalStart = TempRecord.PhysicalStart; NewRecord->VirtualStart = 0; NewRecord->NumberOfPages = TempRecord.NumberOfPages; @@ -676,6 +645,7 @@ SplitRecord ( the current memory map. @param DescriptorSize Size, in bytes, of an individual EFI_MEMORY_DESCRIPTOR. **/ +STATIC VOID SplitTable ( IN OUT UINTN *MemoryMapSize, @@ -755,7 +725,7 @@ SplitTable ( } /** - This function for GetMemoryMap() with properties table. + This function for GetMemoryMap() with properties table capability. It calls original GetMemoryMap() to get the original memory map information. Then plus the additional memory map entries for PE Code/Data seperation. @@ -788,7 +758,7 @@ SplitTable ( **/ EFI_STATUS EFIAPI -CoreGetMemoryMapPropertiesTable ( +CoreGetMemoryMapWithSeparatedImageSection ( IN OUT UINTN *MemoryMapSize, IN OUT EFI_MEMORY_DESCRIPTOR *MemoryMap, OUT UINTN *MapKey, @@ -820,6 +790,7 @@ CoreGetMemoryMapPropertiesTable ( if (Status == EFI_BUFFER_TOO_SMALL) { *MemoryMapSize = *MemoryMapSize + (*DescriptorSize) * AdditionalRecordCount; } else if (Status == EFI_SUCCESS) { + ASSERT (MemoryMap != NULL); if (OldMemoryMapSize - *MemoryMapSize < (*DescriptorSize) * AdditionalRecordCount) { *MemoryMapSize = *MemoryMapSize + (*DescriptorSize) * AdditionalRecordCount; // @@ -843,19 +814,20 @@ CoreGetMemoryMapPropertiesTable ( // /** - Set PropertiesTable accroding to PE/COFF image section alignment. + Set PropertiesTable according to PE/COFF image section alignment. @param SectionAlignment PE/COFF section alignment **/ +STATIC VOID SetPropertiesTableSectionAlignment ( IN UINT32 SectionAlignment ) { - if (((SectionAlignment & (SIZE_4KB - 1)) != 0) && + if (((SectionAlignment & (EFI_ACPI_RUNTIME_PAGE_ALLOCATION_ALIGNMENT - 1)) != 0) && ((mPropertiesTable.MemoryProtectionAttribute & EFI_PROPERTIES_RUNTIME_MEMORY_PROTECTION_NON_EXECUTABLE_PE_DATA) != 0)) { DEBUG ((EFI_D_VERBOSE, "SetPropertiesTableSectionAlignment - Clear\n")); - mPropertiesTable.MemoryProtectionAttribute &= ~EFI_PROPERTIES_RUNTIME_MEMORY_PROTECTION_NON_EXECUTABLE_PE_DATA; + mPropertiesTable.MemoryProtectionAttribute &= ~((UINT64)EFI_PROPERTIES_RUNTIME_MEMORY_PROTECTION_NON_EXECUTABLE_PE_DATA); gBS->GetMemoryMap = CoreGetMemoryMap; gBS->Hdr.CRC32 = 0; gBS->CalculateCrc32 ((UINT8 *)gBS, gBS->Hdr.HeaderSize, &gBS->Hdr.CRC32); @@ -868,6 +840,7 @@ SetPropertiesTableSectionAlignment ( @param FirstImageRecordCodeSection first code section in image record @param SecondImageRecordCodeSection second code section in image record **/ +STATIC VOID SwapImageRecordCodeSection ( IN IMAGE_PROPERTIES_RECORD_CODE_SECTION *FirstImageRecordCodeSection, @@ -891,6 +864,7 @@ SwapImageRecordCodeSection ( @param ImageRecord image record to be sorted **/ +STATIC VOID SortImageRecordCodeSection ( IN IMAGE_PROPERTIES_RECORD *ImageRecord @@ -934,13 +908,14 @@ SortImageRecordCodeSection ( } /** - Check if code section in image record is valid + Check if code section in image record is valid. @param ImageRecord image record to be checked @retval TRUE image record is valid @retval FALSE image record is invalid **/ +STATIC BOOLEAN IsImageRecordCodeSectionValid ( IN IMAGE_PROPERTIES_RECORD *ImageRecord @@ -997,6 +972,7 @@ IsImageRecordCodeSectionValid ( @param FirstImageRecord first image record. @param SecondImageRecord second image record. **/ +STATIC VOID SwapImageRecord ( IN IMAGE_PROPERTIES_RECORD *FirstImageRecord, @@ -1023,6 +999,7 @@ SwapImageRecord ( /** Sort image record based upon the ImageBase from low to high. **/ +STATIC VOID SortImageRecord ( VOID @@ -1066,8 +1043,9 @@ SortImageRecord ( } /** - Dump image record + Dump image record. **/ +STATIC VOID DumpImageRecord ( VOID @@ -1107,15 +1085,14 @@ InsertImageRecord ( EFI_IMAGE_DOS_HEADER *DosHdr; UINT32 PeCoffHeaderOffset; UINT32 SectionAlignment; - UINT16 ImageType; EFI_IMAGE_SECTION_HEADER *Section; EFI_IMAGE_OPTIONAL_HEADER_PTR_UNION Hdr; - UINT16 Magic; UINT8 *Name; UINTN Index; IMAGE_PROPERTIES_RECORD *ImageRecord; CHAR8 *PdbPointer; IMAGE_PROPERTIES_RECORD_CODE_SECTION *ImageRecordCodeSection; + UINT16 Magic; DEBUG ((EFI_D_VERBOSE, "InsertImageRecord - 0x%x\n", RuntimeImage)); DEBUG ((EFI_D_VERBOSE, "InsertImageRecord - 0x%016lx - 0x%016lx\n", (EFI_PHYSICAL_ADDRESS)(UINTN)RuntimeImage->ImageBase, RuntimeImage->ImageSize)); @@ -1153,13 +1130,12 @@ InsertImageRecord ( Hdr.Pe32 = (EFI_IMAGE_NT_HEADERS32 *)((UINT8 *) (UINTN) ImageAddress + PeCoffHeaderOffset); if (Hdr.Pe32->Signature != EFI_IMAGE_NT_SIGNATURE) { DEBUG ((EFI_D_VERBOSE, "Hdr.Pe32->Signature invalid - 0x%x\n", Hdr.Pe32->Signature)); - // It might be image in SMM. + // It might be image in SMM. goto Finish; } // - // Measuring PE/COFF Image Header; - // But CheckSum field and SECURITY data directory (certificate) are excluded + // Get SectionAlignment // if (Hdr.Pe32->FileHeader.Machine == IMAGE_FILE_MACHINE_IA64 && Hdr.Pe32->OptionalHeader.Magic == EFI_IMAGE_NT_OPTIONAL_HDR32_MAGIC) { // @@ -1169,23 +1145,25 @@ InsertImageRecord ( // then override the magic value to EFI_IMAGE_NT_OPTIONAL_HDR64_MAGIC // Magic = EFI_IMAGE_NT_OPTIONAL_HDR64_MAGIC; - ImageType = Hdr.Pe32->OptionalHeader.Subsystem; - SectionAlignment = Hdr.Pe32->OptionalHeader.SectionAlignment; } else { // // Get the magic value from the PE/COFF Optional Header // Magic = Hdr.Pe32->OptionalHeader.Magic; - ImageType = Hdr.Pe32Plus->OptionalHeader.Subsystem; + } + if (Magic == EFI_IMAGE_NT_OPTIONAL_HDR32_MAGIC) { + SectionAlignment = Hdr.Pe32->OptionalHeader.SectionAlignment; + } else { SectionAlignment = Hdr.Pe32Plus->OptionalHeader.SectionAlignment; } SetPropertiesTableSectionAlignment (SectionAlignment); - if ((SectionAlignment & (SIZE_4KB - 1)) != 0) { - DEBUG ((EFI_D_ERROR, "!!!!!!!! InsertImageRecord - Section Alignment(0x%x) is not 4K !!!!!!!!\n", SectionAlignment)); + if ((SectionAlignment & (EFI_ACPI_RUNTIME_PAGE_ALLOCATION_ALIGNMENT - 1)) != 0) { + DEBUG ((EFI_D_WARN, "!!!!!!!! InsertImageRecord - Section Alignment(0x%x) is not %dK !!!!!!!!\n", + SectionAlignment, EFI_ACPI_RUNTIME_PAGE_ALLOCATION_ALIGNMENT >> 10)); PdbPointer = PeCoffLoaderGetPdbPointer ((VOID*) (UINTN) ImageAddress); if (PdbPointer != NULL) { - DEBUG ((EFI_D_ERROR, "!!!!!!!! Image - %a !!!!!!!!\n", PdbPointer)); + DEBUG ((EFI_D_WARN, "!!!!!!!! Image - %a !!!!!!!!\n", PdbPointer)); } goto Finish; } @@ -1280,13 +1258,14 @@ Finish: } /** - Find image record accroding to image base and size. + Find image record according to image base and size. @param ImageBase Base of PE image @param ImageSize Size of PE image @return image record **/ +STATIC IMAGE_PROPERTIES_RECORD * FindImageRecord ( IN EFI_PHYSICAL_ADDRESS ImageBase, @@ -1372,7 +1351,7 @@ InstallPropertiesTable ( VOID *Context ) { - if (PcdGetBool (PropertiesTableEnable)) { + if (PcdGetBool (PcdPropertiesTableEnable)) { EFI_STATUS Status; Status = gBS->InstallConfigurationTable (&gEfiPropertiesTableGuid, &mPropertiesTable); @@ -1380,16 +1359,20 @@ InstallPropertiesTable ( DEBUG ((EFI_D_INFO, "MemoryProtectionAttribute - 0x%016lx\n", mPropertiesTable.MemoryProtectionAttribute)); if ((mPropertiesTable.MemoryProtectionAttribute & EFI_PROPERTIES_RUNTIME_MEMORY_PROTECTION_NON_EXECUTABLE_PE_DATA) == 0) { + DEBUG ((EFI_D_ERROR, "MemoryProtectionAttribute NON_EXECUTABLE_PE_DATA is not set, ")); + DEBUG ((EFI_D_ERROR, "because Runtime Driver Section Alignment is not %dK.\n", EFI_ACPI_RUNTIME_PAGE_ALLOCATION_ALIGNMENT >> 10)); return ; } - gBS->GetMemoryMap = CoreGetMemoryMapPropertiesTable; + gBS->GetMemoryMap = CoreGetMemoryMapWithSeparatedImageSection; gBS->Hdr.CRC32 = 0; gBS->CalculateCrc32 ((UINT8 *)gBS, gBS->Hdr.HeaderSize, &gBS->Hdr.CRC32); DEBUG ((EFI_D_VERBOSE, "Total Image Count - 0x%x\n", mImagePropertiesPrivateData.ImageRecordCount)); DEBUG ((EFI_D_VERBOSE, "Dump ImageRecord:\n")); DumpImageRecord (); + + mPropertiesTableEnable = TRUE; } }