]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Core/Pei/Image/Image.c
1. Replace PeCoffLoader library by PeCoff lib for PeiCore, DxeIpl and DxeMain.
[mirror_edk2.git] / MdeModulePkg / Core / Pei / Image / Image.c
index ebe79a6c50a05fd7ee013f4eacd6720bd910945a..a430d3ea7a78617f95b2047f019e9e7db6004139 100644 (file)
@@ -195,7 +195,6 @@ Returns:
 STATIC\r
 EFI_STATUS\r
 LoadAndRelocatePeCoffImage (\r
-  IN  EFI_PEI_PE_COFF_LOADER_PROTOCOL           *PeiEfiPeiPeCoffLoader,\r
   IN  VOID                                      *Pe32Data,\r
   OUT EFI_PHYSICAL_ADDRESS                      *ImageAddress,\r
   OUT UINT64                                    *ImageSize,\r
@@ -209,8 +208,6 @@ Routine Description:
 \r
 Arguments:\r
 \r
-  PeiEfiPeiPeCoffLoader - Pointer to a PE COFF loader protocol\r
-\r
   Pe32Data         - The base address of the PE/COFF file that is to be loaded and relocated\r
 \r
   ImageAddress     - The base address of the relocated PE/COFF image\r
@@ -230,15 +227,13 @@ Returns:
   EFI_STATUS                            Status;\r
   PE_COFF_LOADER_IMAGE_CONTEXT          ImageContext;\r
 \r
-  ASSERT (PeiEfiPeiPeCoffLoader != NULL);\r
-\r
   ZeroMem (&ImageContext, sizeof (ImageContext));\r
   ImageContext.Handle = Pe32Data;\r
   Status              = GetImageReadFunction (&ImageContext);\r
 \r
   ASSERT_EFI_ERROR (Status);\r
 \r
-  Status = PeiEfiPeiPeCoffLoader->GetImageInfo (PeiEfiPeiPeCoffLoader, &ImageContext);\r
+  Status = PeCoffLoaderGetImageInfo (&ImageContext);\r
   if (EFI_ERROR (Status)) {\r
     return Status;\r
   }\r
@@ -251,14 +246,14 @@ Returns:
   //\r
   // Load the image to our new buffer\r
   //\r
-  Status = PeiEfiPeiPeCoffLoader->LoadImage (PeiEfiPeiPeCoffLoader, &ImageContext);\r
+  Status = PeCoffLoaderLoadImage (&ImageContext);\r
   if (EFI_ERROR (Status)) {\r
     return Status;\r
   }\r
   //\r
   // Relocate the image in our new buffer\r
   //\r
-  Status = PeiEfiPeiPeCoffLoader->RelocateImage (PeiEfiPeiPeCoffLoader, &ImageContext);\r
+  Status = PeCoffLoaderRelocateImage (&ImageContext);\r
   if (EFI_ERROR (Status)) {\r
     return Status;\r
   }\r
@@ -312,14 +307,12 @@ Returns:
   EFI_PHYSICAL_ADDRESS        ImageAddress;\r
   UINT64                      ImageSize;\r
   EFI_PHYSICAL_ADDRESS        ImageEntryPoint;\r
-  EFI_TE_IMAGE_HEADER         *TEImageHeader;\r
   UINT16                      Machine;\r
   PEI_CORE_INSTANCE           *Private;\r
   VOID                        *EntryPointArg;\r
 \r
-  *EntryPoint   = 0;\r
-  TEImageHeader = NULL;\r
-  ImageSize = 0;\r
+  *EntryPoint          = 0;\r
+  ImageSize            = 0;\r
   *AuthenticationState = 0;\r
 \r
   //\r
@@ -330,11 +323,8 @@ Returns:
              FileHandle,\r
              &Pe32Data\r
              );\r
-  if (!EFI_ERROR (Status)) {\r
-     TEImageHeader = (EFI_TE_IMAGE_HEADER *)Pe32Data;\r
-  }\r
   //\r
-  // If we didn't find a PE32 section, try to find a TE section.\r
+  // If we didn't find a TE section, try to find a PE32 section.\r
   //\r
   if (EFI_ERROR (Status)) {\r
     Status = PeiServicesFfsFindSectionData (\r
@@ -355,57 +345,38 @@ Returns:
 \r
   if (Private->PeiMemoryInstalled && \r
       (Private->HobList.HandoffInformationTable->BootMode != BOOT_ON_S3_RESUME)) {\r
-    {\r
-      //\r
-      // If memory is installed, perform the shadow operations\r
-      //\r
-      Status = LoadAndRelocatePeCoffImage (\r
-        Private->PeCoffLoader,\r
-        Pe32Data,\r
-        &ImageAddress,\r
-        &ImageSize,\r
-        &ImageEntryPoint\r
-      );\r
-\r
-      if (EFI_ERROR (Status)) {\r
-        return EFI_NOT_FOUND;\r
-      }\r
+    //\r
+    // If memory is installed, perform the shadow operations\r
+    //\r
+    Status = LoadAndRelocatePeCoffImage (\r
+      Pe32Data,\r
+      &ImageAddress,\r
+      &ImageSize,\r
+      &ImageEntryPoint\r
+    );\r
 \r
-      //\r
-      // Got the entry point from ImageEntryPoint and ImageStartAddress\r
-      //\r
-      Pe32Data    = (VOID *) ((UINTN) ImageAddress);\r
-      *EntryPoint = ImageEntryPoint;\r
+    if (EFI_ERROR (Status)) {\r
+      return Status;\r
     }\r
+\r
+    //\r
+    // Got the entry point from the loaded Pe32Data\r
+    //\r
+    Pe32Data    = (VOID *) ((UINTN) ImageAddress);\r
+    *EntryPoint = ImageEntryPoint;\r
   } else {\r
-   if (TEImageHeader != NULL) {\r
-      //\r
-      // Retrieve the entry point from the TE image header\r
-      //\r
-      ImageAddress = (EFI_PHYSICAL_ADDRESS) (UINTN) TEImageHeader;\r
-      ImageSize = 0;\r
-      *EntryPoint  = (EFI_PHYSICAL_ADDRESS)((UINTN) TEImageHeader + sizeof (EFI_TE_IMAGE_HEADER) +\r
-                    TEImageHeader->AddressOfEntryPoint - TEImageHeader->StrippedSize);\r
-    } else {\r
-      //\r
-      // Retrieve the entry point from the PE/COFF image header\r
-      //\r
-      ImageAddress = (EFI_PHYSICAL_ADDRESS) (UINTN) Pe32Data;\r
-      ImageSize = 0;\r
-      Status = PeCoffLoaderGetEntryPoint (Pe32Data, &EntryPointArg);\r
-      *EntryPoint = (EFI_PHYSICAL_ADDRESS) (UINTN) EntryPointArg;\r
-      if (EFI_ERROR (Status)) {\r
-        return EFI_NOT_FOUND;\r
-      }\r
+    //\r
+    // Retrieve the entry point from the PE/COFF or TE image header\r
+    //\r
+    ImageAddress = (EFI_PHYSICAL_ADDRESS) (UINTN) Pe32Data;\r
+    Status = PeCoffLoaderGetEntryPoint (Pe32Data, &EntryPointArg);\r
+    if (EFI_ERROR (Status)) {\r
+      return Status;\r
     }\r
+    *EntryPoint = (EFI_PHYSICAL_ADDRESS) (UINTN) EntryPointArg;\r
   }\r
-\r
-  if (((EFI_TE_IMAGE_HEADER *) (UINTN) ImageAddress)->Signature == EFI_TE_IMAGE_HEADER_SIGNATURE) {\r
-    TEImageHeader = (EFI_TE_IMAGE_HEADER *) (UINTN) ImageAddress;\r
-    Machine = TEImageHeader->Machine;\r
-  } else {\r
-    Machine = PeCoffLoaderGetMachineType (Pe32Data);\r
-  } \r
+  \r
+  Machine = PeCoffLoaderGetMachineType (Pe32Data);\r
   \r
   if (!EFI_IMAGE_MACHINE_TYPE_SUPPORTED (Machine)) {\r
     return EFI_UNSUPPORTED;  \r
@@ -424,120 +395,29 @@ Returns:
   //\r
   DEBUG ((EFI_D_INFO | EFI_D_LOAD, "Loading PEIM at 0x%08x EntryPoint=0x%08x ", (UINTN) ImageAddress, *EntryPoint));\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
-        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
-        Hdr.Pe32 = (EFI_IMAGE_NT_HEADERS32 *)Pe32Data;\r
-      }\r
-    }\r
-\r
-    //\r
-    // Find the codeview info in the image and display the file name\r
-    // being loaded.\r
-    //\r
-    // Per the PE/COFF spec, you can't assume that a given data directory\r
-    // is present in the image. You have to check the NumberOfRvaAndSizes in\r
-    // the optional header to verify a desired directory entry is there.\r
-    //\r
-    DebugEntry          = NULL;\r
-    DirectoryEntry      = NULL;\r
-    NumberOfRvaAndSizes = 0;\r
-    TEImageAdjust       = 0;\r
+    CHAR8                              *AsciiString;\r
+    CHAR8                              AsciiBuffer[512];\r
+    INT32                              Index;\r
+    INT32                              Index1;\r
     \r
-    if (TEImageHeader == NULL) {\r
-      if (Hdr.Pe32->OptionalHeader.Magic == EFI_IMAGE_NT_OPTIONAL_HDR32_MAGIC) {\r
-        //     \r
-        // Use PE32 offset get Debug Directory Entry\r
-        //\r
-        NumberOfRvaAndSizes = Hdr.Pe32->OptionalHeader.NumberOfRvaAndSizes;\r
-        DirectoryEntry = (EFI_IMAGE_DATA_DIRECTORY *)&(Hdr.Pe32->OptionalHeader.DataDirectory[EFI_IMAGE_DIRECTORY_ENTRY_DEBUG]);\r
-        DebugEntry     = (EFI_IMAGE_DEBUG_DIRECTORY_ENTRY *) ((UINTN) Pe32Data + DirectoryEntry->VirtualAddress);\r
-      } else if (Hdr.Pe32->OptionalHeader.Magic == EFI_IMAGE_NT_OPTIONAL_HDR64_MAGIC) {\r
-        //     \r
-        // Use PE32+ offset get Debug Directory Entry\r
-        //\r
-        NumberOfRvaAndSizes = Hdr.Pe32Plus->OptionalHeader.NumberOfRvaAndSizes;\r
-        DirectoryEntry = (EFI_IMAGE_DATA_DIRECTORY *)&(Hdr.Pe32Plus->OptionalHeader.DataDirectory[EFI_IMAGE_DIRECTORY_ENTRY_DEBUG]);\r
-        DebugEntry     = (EFI_IMAGE_DEBUG_DIRECTORY_ENTRY *) ((UINTN) Pe32Data + DirectoryEntry->VirtualAddress);\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
-        DirectoryEntry  = &TEImageHeader->DataDirectory[EFI_TE_IMAGE_DIRECTORY_ENTRY_DEBUG];\r
-        TEImageAdjust   = sizeof (EFI_TE_IMAGE_HEADER) - TEImageHeader->StrippedSize;\r
-        DebugEntry = (EFI_IMAGE_DEBUG_DIRECTORY_ENTRY *)((UINTN) TEImageHeader +\r
-                      TEImageHeader->DataDirectory[EFI_TE_IMAGE_DIRECTORY_ENTRY_DEBUG].VirtualAddress +\r
-                      TEImageAdjust);\r
+    AsciiString = PeCoffLoaderGetPdbPointer (Pe32Data);\r
+    \r
+    if (AsciiString != NULL) {\r
+      for (Index = AsciiStrLen (AsciiString) - 1; Index >= 0; Index --) {\r
+        if (AsciiString[Index] == '\\') {\r
+          break;\r
+        }\r
       }\r
-    }\r
 \r
-    if (DebugEntry != NULL && DirectoryEntry != NULL) {\r
-      for (DirCount = 0; DirCount < DirectoryEntry->Size; DirCount += sizeof(EFI_IMAGE_DEBUG_DIRECTORY_ENTRY), DebugEntry++) {\r
-        if (DebugEntry->Type == EFI_IMAGE_DEBUG_TYPE_CODEVIEW) {\r
-          if (DebugEntry->SizeOfData > 0) {\r
-            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
-                break;\r
-\r
-              case CODEVIEW_SIGNATURE_RSDS:\r
-                AsciiString = (CHAR8 *)CodeViewEntryPointer + sizeof (EFI_IMAGE_DEBUG_CODEVIEW_RSDS_ENTRY);\r
-                break;\r
-\r
-              default:\r
-                AsciiString = NULL;\r
-                break;\r
-            }\r
-            if (AsciiString != NULL) {\r
-              FileNameFound = FALSE;\r
-              for (Index = 0, Index1 = 0; AsciiString[Index] != '\0'; Index++) {\r
-                if (AsciiString[Index] == '\\') {\r
-                  Index1 = Index;\r
-                  FileNameFound = TRUE;\r
-                }\r
-              }\r
-\r
-              if (FileNameFound) {\r
-                for (Index = Index1 + 1; AsciiString[Index] != '.'; Index++) {\r
-                  AsciiBuffer[Index - (Index1 + 1)] = AsciiString[Index];\r
-                }\r
-                AsciiBuffer[Index - (Index1 + 1)] = 0;\r
-                DEBUG ((EFI_D_INFO | EFI_D_LOAD, "%a.efi", AsciiBuffer));\r
-                break;\r
-              }\r
-            }\r
-          }\r
+      if (Index != 0) {\r
+        for (Index1 = 0; AsciiString[Index + 1 + Index1] != '.'; Index1 ++) {\r
+          AsciiBuffer [Index1] = AsciiString[Index + 1 + Index1];\r
         }\r
+        AsciiBuffer [Index1] = '\0';\r
+        DEBUG ((EFI_D_INFO | EFI_D_LOAD, "%a.efi", AsciiBuffer));\r
       }\r
     }\r
+\r
   DEBUG_CODE_END ();\r
 \r
   DEBUG ((EFI_D_INFO | EFI_D_LOAD, "\n"));\r
@@ -691,12 +571,6 @@ Returns:
   \r
 --*/      \r
 {\r
-  //\r
-  // Always update PeCoffLoader pointer as PEI core itself may get \r
-  // shadowed into memory\r
-  //\r
-  PrivateData->PeCoffLoader = GetPeCoffLoaderProtocol ();\r
-  \r
   if (OldCoreData == NULL) {\r
     //\r
     // The first time we are XIP (running from FLASH). We need to remember the\r