]> git.proxmox.com Git - mirror_edk2.git/blobdiff - Tools/CCode/Source/PeiRebase/PeiRebaseExe.c
Change supporting section alignment from 4k to 64k. Add check whether section-alignme...
[mirror_edk2.git] / Tools / CCode / Source / PeiRebase / PeiRebaseExe.c
index d27083aceb5acbc0072705cc79539f82bb5f959c..8537d69f68fd9b0d13a6003ca40f5a426f291658 100644 (file)
@@ -680,13 +680,13 @@ Returns:
     // Allocate a buffer for the image to be loaded into.\r
     //\r
     Pe32ImageSize       = GetLength (CurrentPe32Section.Pe32Section->CommonHeader.Size) - sizeof (EFI_PE32_SECTION);\r
-    MemoryImagePointer  = (UINTN) (malloc (Pe32ImageSize + 0x1000));\r
+    MemoryImagePointer  = (UINTN) (malloc (Pe32ImageSize + 0x10000));\r
     if (MemoryImagePointer == 0) {\r
       Error (NULL, 0, 0, "memory allocation failure", NULL);\r
       return EFI_OUT_OF_RESOURCES;\r
     }\r
-    memset ((void *) MemoryImagePointer, 0, Pe32ImageSize + 0x1000);\r
-    MemoryImagePointerAligned = (MemoryImagePointer + 0x0FFF) & (-1 << 12);\r
+    memset ((void *) MemoryImagePointer, 0, Pe32ImageSize + 0x10000);\r
+    MemoryImagePointerAligned = (MemoryImagePointer + 0x0FFFF) & (-1 << 16);\r
     \r
 \r
     ImageContext.ImageAddress = MemoryImagePointerAligned;\r
@@ -697,6 +697,25 @@ Returns:
       free ((VOID *) MemoryImagePointer);\r
       return Status;\r
     }\r
+    \r
+    //\r
+    // Check if section-alignment and file-alignment match or not\r
+    //\r
+    if (!(ImageContext.IsTeImage)) {\r
+      PeHdr = (EFI_IMAGE_NT_HEADERS *)((UINTN)ImageContext.ImageAddress + \r
+                                              ImageContext.PeCoffHeaderOffset);\r
+      if (PeHdr->OptionalHeader.SectionAlignment != PeHdr->OptionalHeader.FileAlignment) {\r
+        Error (NULL, 0, 0, "Section-Alignment and File-Alignment does not match", FileGuidString);\r
+               _asm int 3;\r
+        free ((VOID *) MemoryImagePointer);\r
+        return EFI_ABORTED;\r
+      }\r
+    }\r
+    else {\r
+      //\r
+      // BUGBUG: TE Image Header lack section-alignment and file-alignment info\r
+      //\r
+    }\r
 \r
     ImageContext.DestinationAddress = NewPe32BaseAddress;\r
     Status                          = PeCoffLoaderRelocateImage (&ImageContext);\r
@@ -932,14 +951,14 @@ Returns:
     //\r
     // Allocate a buffer for the image to be loaded into.\r
     //\r
-    MemoryImagePointer = (UINTN) (malloc (Pe32ImageSize + 0x1000));\r
+    MemoryImagePointer = (UINTN) (malloc (Pe32ImageSize + 0x10000));\r
     if (MemoryImagePointer == 0) {\r
       Error (NULL, 0, 0, "memory allocation error on rebase of TE image", FileGuidString);\r
       free (TEBuffer);\r
       return EFI_OUT_OF_RESOURCES;\r
     }\r
-    memset ((void *) MemoryImagePointer, 0, Pe32ImageSize + 0x1000);\r
-    MemoryImagePointerAligned = (MemoryImagePointer + 0x0FFF) & (-1 << 12);\r
+    memset ((void *) MemoryImagePointer, 0, Pe32ImageSize + 0x10000);\r
+    MemoryImagePointerAligned = (MemoryImagePointer + 0x0FFFF) & (-1 << 16);\r
     \r
 \r
     ImageContext.ImageAddress = MemoryImagePointerAligned;\r
@@ -950,6 +969,11 @@ Returns:
       free ((VOID *) MemoryImagePointer);\r
       return Status;\r
     }\r
+    \r
+    //\r
+    // Check if section-alignment and file-alignment match or not\r
+       // BUGBUG: TE Image Header lack section-alignment and file-alignment info\r
+    //\r
 \r
     ImageContext.DestinationAddress = NewPe32BaseAddress;\r
     Status                          = PeCoffLoaderRelocateImage (&ImageContext);\r