]> git.proxmox.com Git - mirror_edk2.git/blobdiff - EdkModulePkg/Core/Pei/Image/Image.c
Add temporary fix for PeLoader
[mirror_edk2.git] / EdkModulePkg / Core / Pei / Image / Image.c
index 8fd71976366866da68bab0ca0490f6313dc326cc..32f0fe652300822d1f1e58d7d5a5da673d9baa19 100644 (file)
@@ -21,6 +21,8 @@ Abstract:
 \r
 #include <PeiMain.h>\r
 \r
+\r
+\r
 EFI_STATUS\r
 PeiLoadImage (\r
   IN EFI_PEI_SERVICES         **PeiServices,\r
@@ -50,10 +52,6 @@ Returns:
   EFI_STATUS                  Status;\r
   VOID                        *Pe32Data;\r
   EFI_PEI_FV_FILE_LOADER_PPI  *FvLoadFilePpi;\r
-//#ifdef EFI_NT_EMULATOR\r
-//  EFI_PEI_PPI_DESCRIPTOR      *PpiDescriptor;\r
-//  NT_PEI_LOAD_FILE_PPI        *PeiNtService;\r
-//#endif\r
   EFI_PHYSICAL_ADDRESS        ImageAddress;\r
   UINT64                      ImageSize;\r
   EFI_PHYSICAL_ADDRESS        ImageEntryPoint;\r
@@ -107,12 +105,10 @@ Returns:
       }\r
 \r
       //\r
-      // Retrieve the entry point from the PE/COFF image header\r
+      // Got the entry point from ImageEntryPoint\r
       //\r
-      Status = PeCoffLoaderGetEntryPoint ((VOID *)(UINTN)ImageAddress, EntryPoint);\r
-      if (EFI_ERROR (Status)) {\r
-        return EFI_NOT_FOUND;\r
-      }\r
+      *EntryPoint = (VOID *) ((UINTN) ImageEntryPoint);\r
+      return EFI_SUCCESS;\r
     } else {\r
       //\r
       // Retrieve the entry point from the TE image header\r
@@ -136,36 +132,34 @@ Returns:
   // Print debug message: Loading PEIM at 0x12345678 EntryPoint=0x12345688 Driver.efi\r
   //\r
   DEBUG ((EFI_D_INFO | EFI_D_LOAD, "Loading PEIM at 0x%08x EntryPoint=0x%08x ", Pe32Data, *EntryPoint));\r
-  DEBUG_CODE (\r
-    EFI_IMAGE_DATA_DIRECTORY * DirectoryEntry;\r
-    EFI_IMAGE_DEBUG_DIRECTORY_ENTRY * DebugEntry;\r
-    UINTN DirCount;\r
-    UINTN Index;\r
-    UINTN Index1;\r
-    BOOLEAN FileNameFound;\r
-    CHAR8 *AsciiString;\r
-    CHAR8 AsciiBuffer[512];\r
-    VOID *CodeViewEntryPointer;\r
-    INTN TEImageAdjust;\r
-    EFI_IMAGE_DOS_HEADER  *DosHeader;\r
-    EFI_IMAGE_NT_HEADERS  *PeHeader;\r
-\r
-    //\r
-    // Pe32Data is NULL when load TE image \r
-    //    \r
-    PeHeader = NULL;\r
+  DEBUG_CODE_BEGIN ();\r
+    EFI_IMAGE_DATA_DIRECTORY            *DirectoryEntry;\r
+    EFI_IMAGE_DEBUG_DIRECTORY_ENTRY     *DebugEntry;\r
+    UINTN                               DirCount;\r
+    UINTN                               Index;\r
+    UINTN                               Index1;\r
+    BOOLEAN                             FileNameFound;\r
+    CHAR8                               *AsciiString;\r
+    CHAR8                               AsciiBuffer[512];\r
+    VOID                                *CodeViewEntryPointer;\r
+    INTN                                TEImageAdjust;\r
+    EFI_IMAGE_DOS_HEADER                *DosHeader;\r
+    EFI_IMAGE_OPTIONAL_HEADER_PTR_UNION Hdr;\r
+    UINT32                              NumberOfRvaAndSizes;\r
+\r
+    Hdr.Pe32 = NULL;\r
     if (TEImageHeader == NULL) {\r
       DosHeader = (EFI_IMAGE_DOS_HEADER *)Pe32Data;\r
       if (DosHeader->e_magic == EFI_IMAGE_DOS_SIGNATURE) {\r
         //\r
         // DOS image header is present, so read the PE header after the DOS image header\r
         //\r
-        PeHeader = (EFI_IMAGE_NT_HEADERS *) ((UINTN) Pe32Data + (UINTN) ((DosHeader->e_lfanew) & 0x0ffff));\r
+        Hdr.Pe32 = (EFI_IMAGE_NT_HEADERS32 *)((UINTN)Pe32Data + (UINTN)((DosHeader->e_lfanew) & 0x0ffff));\r
       } else {\r
         //\r
         // DOS image header is not present, so PE header is at the image base\r
         //\r
-        PeHeader = (EFI_IMAGE_NT_HEADERS *) Pe32Data;\r
+        Hdr.Pe32 = (EFI_IMAGE_NT_HEADERS32 *)Pe32Data;\r
       }\r
     }\r
 \r
@@ -181,9 +175,23 @@ Returns:
     DirectoryEntry  = NULL;\r
     TEImageAdjust   = 0;\r
     if (TEImageHeader == NULL) {\r
-      if (PeHeader->OptionalHeader.NumberOfRvaAndSizes > EFI_IMAGE_DIRECTORY_ENTRY_DEBUG) {\r
-        DirectoryEntry = (EFI_IMAGE_DATA_DIRECTORY *) &(PeHeader->OptionalHeader.DataDirectory[EFI_IMAGE_DIRECTORY_ENTRY_DEBUG]);\r
-        DebugEntry = (EFI_IMAGE_DEBUG_DIRECTORY_ENTRY *) ((UINTN) ImageAddress + DirectoryEntry->VirtualAddress);\r
+      if (Hdr.Pe32->OptionalHeader.Magic == EFI_IMAGE_NT_OPTIONAL_HDR32_MAGIC) {\r
+        //     \r
+        // Use PE32 offset\r
+        //\r
+        NumberOfRvaAndSizes = Hdr.Pe32->OptionalHeader.NumberOfRvaAndSizes;\r
+        DirectoryEntry = (EFI_IMAGE_DATA_DIRECTORY *)&(Hdr.Pe32->OptionalHeader.DataDirectory[EFI_IMAGE_DIRECTORY_ENTRY_DEBUG]);\r
+      } else {\r
+        //     \r
+        // Use PE32+ offset\r
+        //\r
+        NumberOfRvaAndSizes = Hdr.Pe32Plus->OptionalHeader.NumberOfRvaAndSizes;\r
+        DirectoryEntry = (EFI_IMAGE_DATA_DIRECTORY *)&(Hdr.Pe32Plus->OptionalHeader.DataDirectory[EFI_IMAGE_DIRECTORY_ENTRY_DEBUG]);\r
+      }    \r
+\r
+      if (NumberOfRvaAndSizes <= EFI_IMAGE_DIRECTORY_ENTRY_DEBUG) {\r
+        DirectoryEntry = NULL;\r
+        DebugEntry = NULL;\r
       }\r
     } else {\r
       if (TEImageHeader->DataDirectory[EFI_TE_IMAGE_DIRECTORY_ENTRY_DEBUG].VirtualAddress != 0) {\r
@@ -202,11 +210,11 @@ Returns:
             CodeViewEntryPointer = (VOID *) ((UINTN) DebugEntry->RVA + (UINTN) ImageAddress + (UINTN)TEImageAdjust);\r
             switch (* (UINT32 *) CodeViewEntryPointer) {\r
               case CODEVIEW_SIGNATURE_NB10:\r
-                AsciiString = (CHAR8 *) CodeViewEntryPointer + sizeof (EFI_IMAGE_DEBUG_CODEVIEW_NB10_ENTRY);\r
+                AsciiString = (CHAR8 *)CodeViewEntryPointer + sizeof (EFI_IMAGE_DEBUG_CODEVIEW_NB10_ENTRY);\r
                 break;\r
 \r
               case CODEVIEW_SIGNATURE_RSDS:\r
-                AsciiString = (CHAR8 *) CodeViewEntryPointer + sizeof (EFI_IMAGE_DEBUG_CODEVIEW_RSDS_ENTRY);\r
+                AsciiString = (CHAR8 *)CodeViewEntryPointer + sizeof (EFI_IMAGE_DEBUG_CODEVIEW_RSDS_ENTRY);\r
                 break;\r
 \r
               default:\r
@@ -215,7 +223,7 @@ Returns:
             }\r
             if (AsciiString != NULL) {\r
               FileNameFound = FALSE;\r
-              for (Index = 0, Index1 = 0; AsciiString[Index] != 0; Index++) {\r
+              for (Index = 0, Index1 = 0; (AsciiString[Index] != 0) && (Index < sizeof (AsciiString)); Index++) {\r
                 if (AsciiString[Index] == '\\') {\r
                   Index1 = Index;\r
                   FileNameFound = TRUE;\r
@@ -235,7 +243,7 @@ Returns:
         }\r
       }\r
     }\r
-  );\r
+  DEBUG_CODE_END ();\r
 \r
   DEBUG ((EFI_D_INFO | EFI_D_LOAD, "\n"));\r
 \r