]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Core/PiSmmCore/MemoryAttributesTable.c
MdeModulePkg: remove PE/COFF header workaround for ELILO on IPF
[mirror_edk2.git] / MdeModulePkg / Core / PiSmmCore / MemoryAttributesTable.c
index 3a5a2c8743738f2fa711e88561ae3bdbe3c63b19..157beb1e67ff3f994e20f87923b2dcc2dca119bc 100644 (file)
@@ -114,42 +114,14 @@ EfiSizeToPages (
   return RShiftU64 (Size, EFI_PAGE_SHIFT) + ((((UINTN)Size) & EFI_PAGE_MASK) ? 1 : 0);\r
 }\r
 \r
-/**\r
-  Check the consistency of Smm memory attributes table.\r
-\r
-  @param[in] MemoryAttributesTable  PI SMM memory attributes table\r
-**/\r
-VOID\r
-SmmMemoryAttributesTableConsistencyCheck (\r
-  IN EDKII_PI_SMM_MEMORY_ATTRIBUTES_TABLE *MemoryAttributesTable\r
-  )\r
-{\r
-  EFI_MEMORY_DESCRIPTOR                     *MemoryMap;\r
-  UINTN                                     MemoryMapEntryCount;\r
-  UINTN                                     DescriptorSize;\r
-  UINTN                                     Index;\r
-  UINT64                                    Address;\r
-\r
-  Address = 0;\r
-  MemoryMapEntryCount = MemoryAttributesTable->NumberOfEntries;\r
-  DescriptorSize = MemoryAttributesTable->DescriptorSize;\r
-  MemoryMap = (EFI_MEMORY_DESCRIPTOR *)(MemoryAttributesTable + 1);\r
-  for (Index = 0; Index < MemoryMapEntryCount; Index++) {\r
-    if (Address != 0) {\r
-      ASSERT (Address == MemoryMap->PhysicalStart);\r
-    }\r
-    Address = MemoryMap->PhysicalStart + EFI_PAGES_TO_SIZE(MemoryMap->NumberOfPages);\r
-    MemoryMap = NEXT_MEMORY_DESCRIPTOR(MemoryMap, DescriptorSize);\r
-  }\r
-}\r
 \r
 /**\r
   Sort memory map entries based upon PhysicalStart, from low to high.\r
 \r
-  @param[in]  MemoryMap              A pointer to the buffer in which firmware places\r
-                                 the current memory map.\r
-  @param[in]  MemoryMapSize          Size, in bytes, of the MemoryMap buffer.\r
-  @param[in]  DescriptorSize         Size, in bytes, of an individual EFI_MEMORY_DESCRIPTOR.\r
+  @param[in,out]  MemoryMap         A pointer to the buffer in which firmware places\r
+                                    the current memory map.\r
+  @param[in]      MemoryMapSize     Size, in bytes, of the MemoryMap buffer.\r
+  @param[in]      DescriptorSize    Size, in bytes, of an individual EFI_MEMORY_DESCRIPTOR.\r
 **/\r
 STATIC\r
 VOID\r
@@ -268,15 +240,19 @@ EnforceMemoryMapAttribute (
   MemoryMapEntry = MemoryMap;\r
   MemoryMapEnd   = (EFI_MEMORY_DESCRIPTOR *) ((UINT8 *) MemoryMap + MemoryMapSize);\r
   while ((UINTN)MemoryMapEntry < (UINTN)MemoryMapEnd) {\r
-    switch (MemoryMapEntry->Type) {\r
-    case EfiRuntimeServicesCode:\r
-      MemoryMapEntry->Attribute |= EFI_MEMORY_RO;\r
-      break;\r
-    case EfiRuntimeServicesData:\r
-      MemoryMapEntry->Attribute |= EFI_MEMORY_XP;\r
-      break;\r
+    if (MemoryMapEntry->Attribute != 0) {\r
+      // It is PE image, the attribute is already set.\r
+    } else {\r
+      switch (MemoryMapEntry->Type) {\r
+      case EfiRuntimeServicesCode:\r
+        MemoryMapEntry->Attribute = EFI_MEMORY_RO;\r
+        break;\r
+      case EfiRuntimeServicesData:\r
+      default:\r
+        MemoryMapEntry->Attribute |= EFI_MEMORY_XP;\r
+        break;\r
+      }\r
     }\r
-\r
     MemoryMapEntry = NEXT_MEMORY_DESCRIPTOR (MemoryMapEntry, DescriptorSize);\r
   }\r
 \r
@@ -358,6 +334,21 @@ SetNewRecord (
   PhysicalEnd = TempRecord.PhysicalStart + EfiPagesToSize(TempRecord.NumberOfPages);\r
   NewRecordCount = 0;\r
 \r
+  //\r
+  // Always create a new entry for non-PE image record\r
+  //\r
+  if (ImageRecord->ImageBase > TempRecord.PhysicalStart) {\r
+    NewRecord->Type = TempRecord.Type;\r
+    NewRecord->PhysicalStart = TempRecord.PhysicalStart;\r
+    NewRecord->VirtualStart  = 0;\r
+    NewRecord->NumberOfPages = EfiSizeToPages(ImageRecord->ImageBase - TempRecord.PhysicalStart);\r
+    NewRecord->Attribute     = TempRecord.Attribute;\r
+    NewRecord = NEXT_MEMORY_DESCRIPTOR (NewRecord, DescriptorSize);\r
+    NewRecordCount ++;\r
+    TempRecord.PhysicalStart = ImageRecord->ImageBase;\r
+    TempRecord.NumberOfPages = EfiSizeToPages(PhysicalEnd - TempRecord.PhysicalStart);\r
+  }\r
+\r
   ImageRecordCodeSectionList = &ImageRecord->CodeSegmentList;\r
 \r
   ImageRecordCodeSectionLink = ImageRecordCodeSectionList->ForwardLink;\r
@@ -452,14 +443,10 @@ GetMaxSplitRecordCount (
     if (ImageRecord == NULL) {\r
       break;\r
     }\r
-    SplitRecordCount += (2 * ImageRecord->CodeSegmentCount + 1);\r
+    SplitRecordCount += (2 * ImageRecord->CodeSegmentCount + 2);\r
     PhysicalStart = ImageRecord->ImageBase + ImageRecord->ImageSize;\r
   } while ((ImageRecord != NULL) && (PhysicalStart < PhysicalEnd));\r
 \r
-  if (SplitRecordCount != 0) {\r
-    SplitRecordCount--;\r
-  }\r
-\r
   return SplitRecordCount;\r
 }\r
 \r
@@ -516,28 +503,16 @@ SplitRecord (
       //\r
       // No more image covered by this range, stop\r
       //\r
-      if ((PhysicalEnd > PhysicalStart) && (ImageRecord != NULL)) {\r
+      if (PhysicalEnd > PhysicalStart) {\r
         //\r
-        // If this is still address in this record, need record.\r
+        // Always create a new entry for non-PE image record\r
         //\r
-        NewRecord = PREVIOUS_MEMORY_DESCRIPTOR (NewRecord, DescriptorSize);\r
-        if (NewRecord->Type == EfiRuntimeServicesData) {\r
-          //\r
-          // Last record is DATA, just merge it.\r
-          //\r
-          NewRecord->NumberOfPages = EfiSizeToPages(PhysicalEnd - NewRecord->PhysicalStart);\r
-        } else {\r
-          //\r
-          // Last record is CODE, create a new DATA entry.\r
-          //\r
-          NewRecord = NEXT_MEMORY_DESCRIPTOR (NewRecord, DescriptorSize);\r
-          NewRecord->Type = EfiRuntimeServicesData;\r
-          NewRecord->PhysicalStart = TempRecord.PhysicalStart;\r
-          NewRecord->VirtualStart  = 0;\r
-          NewRecord->NumberOfPages = TempRecord.NumberOfPages;\r
-          NewRecord->Attribute     = TempRecord.Attribute | EFI_MEMORY_XP;\r
-          TotalNewRecordCount ++;\r
-        }\r
+        NewRecord->Type = TempRecord.Type;\r
+        NewRecord->PhysicalStart = TempRecord.PhysicalStart;\r
+        NewRecord->VirtualStart  = 0;\r
+        NewRecord->NumberOfPages = TempRecord.NumberOfPages;\r
+        NewRecord->Attribute     = TempRecord.Attribute;\r
+        TotalNewRecordCount ++;\r
       }\r
       break;\r
     }\r
@@ -580,6 +555,8 @@ SplitRecord (
    ==>\r
    +---------------+\r
    | Record X      |\r
+   +---------------+\r
+   | Record RtCode |\r
    +---------------+ ----\r
    | Record RtData |     |\r
    +---------------+     |\r
@@ -587,12 +564,16 @@ SplitRecord (
    +---------------+     |\r
    | Record RtData |     |\r
    +---------------+ ----\r
+   | Record RtCode |\r
+   +---------------+ ----\r
    | Record RtData |     |\r
    +---------------+     |\r
    | Record RtCode |     |-> PE/COFF2\r
    +---------------+     |\r
    | Record RtData |     |\r
    +---------------+ ----\r
+   | Record RtCode |\r
+   +---------------+\r
    | Record Y      |\r
    +---------------+\r
 \r
@@ -622,7 +603,7 @@ SplitTable (
   UINTN       TotalSplitRecordCount;\r
   UINTN       AdditionalRecordCount;\r
 \r
-  AdditionalRecordCount = (2 * mImagePropertiesPrivateData.CodeSegmentCountMax + 1) * mImagePropertiesPrivateData.ImageRecordCount;\r
+  AdditionalRecordCount = (2 * mImagePropertiesPrivateData.CodeSegmentCountMax + 2) * mImagePropertiesPrivateData.ImageRecordCount;\r
 \r
   TotalSplitRecordCount = 0;\r
   //\r
@@ -648,11 +629,13 @@ SplitTable (
     //\r
     // Adjust IndexNew according to real split.\r
     //\r
-    CopyMem (\r
-      ((UINT8 *)MemoryMap + (IndexNew + MaxSplitRecordCount - RealSplitRecordCount) * DescriptorSize),\r
-      ((UINT8 *)MemoryMap + IndexNew * DescriptorSize),\r
-      RealSplitRecordCount * DescriptorSize\r
-      );\r
+    if (MaxSplitRecordCount != RealSplitRecordCount) {\r
+      CopyMem (\r
+        ((UINT8 *)MemoryMap + (IndexNew + MaxSplitRecordCount - RealSplitRecordCount) * DescriptorSize),\r
+        ((UINT8 *)MemoryMap + IndexNew * DescriptorSize),\r
+        (RealSplitRecordCount + 1) * DescriptorSize\r
+        );\r
+    }\r
     IndexNew = IndexNew + MaxSplitRecordCount - RealSplitRecordCount;\r
     TotalSplitRecordCount += RealSplitRecordCount;\r
     IndexNew --;\r
@@ -744,7 +727,7 @@ SmmCoreGetMemoryMapMemoryAttributesTable (
     return EFI_INVALID_PARAMETER;\r
   }\r
 \r
-  AdditionalRecordCount = (2 * mImagePropertiesPrivateData.CodeSegmentCountMax + 1) * mImagePropertiesPrivateData.ImageRecordCount;\r
+  AdditionalRecordCount = (2 * mImagePropertiesPrivateData.CodeSegmentCountMax + 2) * mImagePropertiesPrivateData.ImageRecordCount;\r
 \r
   OldMemoryMapSize = *MemoryMapSize;\r
   Status = SmmCoreGetMemoryMap (MemoryMapSize, MemoryMap, MapKey, DescriptorSize, DescriptorVersion);\r
@@ -774,7 +757,7 @@ SmmCoreGetMemoryMapMemoryAttributesTable (
 //\r
 \r
 /**\r
-  Set MemoryProtectionAttribute accroding to PE/COFF image section alignment.\r
+  Set MemoryProtectionAttribute according to PE/COFF image section alignment.\r
 \r
   @param[in]  SectionAlignment    PE/COFF section alignment\r
 **/\r
@@ -784,7 +767,7 @@ SetMemoryAttributesTableSectionAlignment (
   IN UINT32  SectionAlignment\r
   )\r
 {\r
-  if (((SectionAlignment & (EFI_ACPI_RUNTIME_PAGE_ALLOCATION_ALIGNMENT - 1)) != 0) &&\r
+  if (((SectionAlignment & (RUNTIME_PAGE_ALLOCATION_GRANULARITY - 1)) != 0) &&\r
       ((mMemoryProtectionAttribute & EFI_MEMORY_ATTRIBUTES_RUNTIME_MEMORY_PROTECTION_NON_EXECUTABLE_PE_DATA) != 0)) {\r
     DEBUG ((DEBUG_VERBOSE, "SMM SetMemoryAttributesTableSectionAlignment - Clear\n"));\r
     mMemoryProtectionAttribute &= ~((UINT64)EFI_MEMORY_ATTRIBUTES_RUNTIME_MEMORY_PROTECTION_NON_EXECUTABLE_PE_DATA);\r
@@ -1049,7 +1032,6 @@ SmmInsertImageRecord (
   IMAGE_PROPERTIES_RECORD              *ImageRecord;\r
   CHAR8                                *PdbPointer;\r
   IMAGE_PROPERTIES_RECORD_CODE_SECTION *ImageRecordCodeSection;\r
-  UINT16                               Magic;\r
 \r
   DEBUG ((DEBUG_VERBOSE, "SMM InsertImageRecord - 0x%x\n", DriverEntry));\r
   DEBUG ((DEBUG_VERBOSE, "SMM InsertImageRecord - 0x%016lx - 0x%08x\n", DriverEntry->ImageBuffer, DriverEntry->NumberOfPage));\r
@@ -1066,7 +1048,7 @@ SmmInsertImageRecord (
   // Step 1: record whole region\r
   //\r
   ImageRecord->ImageBase = DriverEntry->ImageBuffer;\r
-  ImageRecord->ImageSize = EFI_PAGES_TO_SIZE(DriverEntry->NumberOfPage);\r
+  ImageRecord->ImageSize = EfiPagesToSize(DriverEntry->NumberOfPage);\r
 \r
   ImageAddress = (VOID *)(UINTN)DriverEntry->ImageBuffer;\r
 \r
@@ -1093,33 +1075,19 @@ SmmInsertImageRecord (
   //\r
   // Get SectionAlignment\r
   //\r
-  if (Hdr.Pe32->FileHeader.Machine == IMAGE_FILE_MACHINE_IA64 && Hdr.Pe32->OptionalHeader.Magic == EFI_IMAGE_NT_OPTIONAL_HDR32_MAGIC) {\r
-    //\r
-    // NOTE: Some versions of Linux ELILO for Itanium have an incorrect magic value\r
-    //       in the PE/COFF Header. If the MachineType is Itanium(IA64) and the\r
-    //       Magic value in the OptionalHeader is EFI_IMAGE_NT_OPTIONAL_HDR32_MAGIC\r
-    //       then override the magic value to EFI_IMAGE_NT_OPTIONAL_HDR64_MAGIC\r
-    //\r
-    Magic = EFI_IMAGE_NT_OPTIONAL_HDR64_MAGIC;\r
-  } else {\r
-    //\r
-    // Get the magic value from the PE/COFF Optional Header\r
-    //\r
-    Magic = Hdr.Pe32->OptionalHeader.Magic;\r
-  }\r
-  if (Magic == EFI_IMAGE_NT_OPTIONAL_HDR32_MAGIC) {\r
+  if (Hdr.Pe32->OptionalHeader.Magic == EFI_IMAGE_NT_OPTIONAL_HDR32_MAGIC) {\r
     SectionAlignment  = Hdr.Pe32->OptionalHeader.SectionAlignment;\r
   } else {\r
     SectionAlignment  = Hdr.Pe32Plus->OptionalHeader.SectionAlignment;\r
   }\r
 \r
   SetMemoryAttributesTableSectionAlignment (SectionAlignment);\r
-  if ((SectionAlignment & (EFI_ACPI_RUNTIME_PAGE_ALLOCATION_ALIGNMENT - 1)) != 0) {\r
-    DEBUG ((DEBUG_ERROR, "SMM !!!!!!!!  InsertImageRecord - Section Alignment(0x%x) is not %dK  !!!!!!!!\n",\r
-      SectionAlignment, EFI_ACPI_RUNTIME_PAGE_ALLOCATION_ALIGNMENT >> 10));\r
+  if ((SectionAlignment & (RUNTIME_PAGE_ALLOCATION_GRANULARITY - 1)) != 0) {\r
+    DEBUG ((DEBUG_WARN, "SMM !!!!!!!!  InsertImageRecord - Section Alignment(0x%x) is not %dK  !!!!!!!!\n",\r
+      SectionAlignment, RUNTIME_PAGE_ALLOCATION_GRANULARITY >> 10));\r
     PdbPointer = PeCoffLoaderGetPdbPointer ((VOID*) (UINTN) ImageAddress);\r
     if (PdbPointer != NULL) {\r
-      DEBUG ((DEBUG_ERROR, "SMM !!!!!!!!  Image - %a  !!!!!!!!\n", PdbPointer));\r
+      DEBUG ((DEBUG_WARN, "SMM !!!!!!!!  Image - %a  !!!!!!!!\n", PdbPointer));\r
     }\r
     goto Finish;\r
   }\r
@@ -1203,95 +1171,16 @@ SmmInsertImageRecord (
   InsertTailList (&mImagePropertiesPrivateData.ImageRecordList, &ImageRecord->Link);\r
   mImagePropertiesPrivateData.ImageRecordCount++;\r
 \r
-  SortImageRecord ();\r
-\r
   if (mImagePropertiesPrivateData.CodeSegmentCountMax < ImageRecord->CodeSegmentCount) {\r
     mImagePropertiesPrivateData.CodeSegmentCountMax = ImageRecord->CodeSegmentCount;\r
   }\r
 \r
+  SortImageRecord ();\r
+\r
 Finish:\r
   return ;\r
 }\r
 \r
-/**\r
-  Find image record accroding to image base and size.\r
-\r
-  @param[in]  ImageBase    Base of PE image\r
-  @param[in]  ImageSize    Size of PE image\r
-\r
-  @return image record\r
-**/\r
-STATIC\r
-IMAGE_PROPERTIES_RECORD *\r
-FindImageRecord (\r
-  IN EFI_PHYSICAL_ADDRESS  ImageBase,\r
-  IN UINT64                ImageSize\r
-  )\r
-{\r
-  IMAGE_PROPERTIES_RECORD    *ImageRecord;\r
-  LIST_ENTRY                 *ImageRecordLink;\r
-  LIST_ENTRY                 *ImageRecordList;\r
-\r
-  ImageRecordList = &mImagePropertiesPrivateData.ImageRecordList;\r
-\r
-  for (ImageRecordLink = ImageRecordList->ForwardLink;\r
-       ImageRecordLink != ImageRecordList;\r
-       ImageRecordLink = ImageRecordLink->ForwardLink) {\r
-    ImageRecord = CR (\r
-                    ImageRecordLink,\r
-                    IMAGE_PROPERTIES_RECORD,\r
-                    Link,\r
-                    IMAGE_PROPERTIES_RECORD_SIGNATURE\r
-                    );\r
-\r
-    if ((ImageBase == ImageRecord->ImageBase) &&\r
-        (ImageSize == ImageRecord->ImageSize)) {\r
-      return ImageRecord;\r
-    }\r
-  }\r
-\r
-  return NULL;\r
-}\r
-\r
-/**\r
-  Remove Image record.\r
-\r
-  @param[in]  DriverEntry    Driver information\r
-**/\r
-VOID\r
-SmmRemoveImageRecord (\r
-  IN EFI_SMM_DRIVER_ENTRY  *DriverEntry\r
-  )\r
-{\r
-  IMAGE_PROPERTIES_RECORD              *ImageRecord;\r
-  LIST_ENTRY                           *CodeSegmentListHead;\r
-  IMAGE_PROPERTIES_RECORD_CODE_SECTION *ImageRecordCodeSection;\r
-\r
-  DEBUG ((DEBUG_VERBOSE, "SMM RemoveImageRecord - 0x%x\n", DriverEntry));\r
-  DEBUG ((DEBUG_VERBOSE, "SMM RemoveImageRecord - 0x%016lx - 0x%016lx\n", DriverEntry->ImageBuffer, DriverEntry->NumberOfPage));\r
-\r
-  ImageRecord = FindImageRecord (DriverEntry->ImageBuffer, EFI_PAGES_TO_SIZE(DriverEntry->NumberOfPage));\r
-  if (ImageRecord == NULL) {\r
-    DEBUG ((DEBUG_ERROR, "SMM !!!!!!!! ImageRecord not found !!!!!!!!\n"));\r
-    return ;\r
-  }\r
-\r
-  CodeSegmentListHead = &ImageRecord->CodeSegmentList;\r
-  while (!IsListEmpty (CodeSegmentListHead)) {\r
-    ImageRecordCodeSection = CR (\r
-                               CodeSegmentListHead->ForwardLink,\r
-                               IMAGE_PROPERTIES_RECORD_CODE_SECTION,\r
-                               Link,\r
-                               IMAGE_PROPERTIES_RECORD_CODE_SECTION_SIGNATURE\r
-                               );\r
-    RemoveEntryList (&ImageRecordCodeSection->Link);\r
-    FreePool (ImageRecordCodeSection);\r
-  }\r
-\r
-  RemoveEntryList (&ImageRecord->Link);\r
-  FreePool (ImageRecord);\r
-  mImagePropertiesPrivateData.ImageRecordCount--;\r
-}\r
 \r
 /**\r
   Publish MemoryAttributesTable to SMM configuration table.\r
@@ -1375,30 +1264,6 @@ PublishMemoryAttributesTable (
   ASSERT_EFI_ERROR (Status);\r
 }\r
 \r
-/**\r
-  This function returns if image is inside SMRAM.\r
-\r
-  @param[in] LoadedImage LoadedImage protocol instance for an image.\r
-\r
-  @retval TRUE  the image is inside SMRAM.\r
-  @retval FALSE the image is outside SMRAM.\r
-**/\r
-BOOLEAN\r
-IsImageInsideSmram (\r
-  IN EFI_LOADED_IMAGE_PROTOCOL   *LoadedImage\r
-  )\r
-{\r
-  UINTN  Index;\r
-\r
-  for (Index = 0; Index < mFullSmramRangeCount; Index++) {\r
-    if ((mFullSmramRanges[Index].PhysicalStart <= (UINTN)LoadedImage->ImageBase)&&\r
-        (mFullSmramRanges[Index].PhysicalStart + mFullSmramRanges[Index].PhysicalSize >= (UINTN)LoadedImage->ImageBase + LoadedImage->ImageSize)) {\r
-      return TRUE;\r
-    }\r
-  }\r
-\r
-  return FALSE;\r
-}\r
 \r
 /**\r
   This function installs all SMM image record information.\r