]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Core/Pei/Image/Image.c
Correct comments.
[mirror_edk2.git] / MdeModulePkg / Core / Pei / Image / Image.c
index c9805f53113f25b198dc5afd7b5d3646b91e5a34..c4fcea65569c4cce0e0adca954d22c36b62682ff 100644 (file)
@@ -1,5 +1,6 @@
-/*++\r
-\r
+/** @file\r
+  Pei Core Load Image Support\r
+  \r
 Copyright (c) 2006 - 2007, Intel Corporation                                                         \r
 All rights reserved. This program and the accompanying materials                          \r
 are licensed and made available under the terms and conditions of the BSD License         \r
@@ -9,37 +10,25 @@ http://opensource.org/licenses/bsd-license.php
 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,                     \r
 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.             \r
 \r
-Module Name:\r
-\r
-  Image.c\r
-\r
-Abstract:\r
-\r
-  Pei Core Load Image Support\r
-\r
---*/\r
+**/\r
 \r
 #include <PeiMain.h>\r
 \r
-/*++\r
-\r
-Routine Description:\r
-\r
-  Support routine for the PE/COFF Loader that reads a buffer from a PE/COFF file\r
-\r
-Arguments:\r
-\r
-  FileHandle - The handle to the PE/COFF file\r
-  FileOffset - The offset, in bytes, into the file to read\r
-  ReadSize   - The number of bytes to read from the file starting at FileOffset\r
-  Buffer     - A pointer to the buffer to read the data into.\r
-\r
-Returns:\r
+/**\r
+  Routine for loading file image.\r
 \r
-  EFI_SUCCESS - ReadSize bytes of data were read into Buffer from the PE/COFF file starting at FileOffset\r
+  @param PeiServices      The PEI core services table.\r
+  @param FileHandle       Pointer to the FFS file header of the image.\r
+  @param ImageAddressArg  Pointer to PE/TE image.\r
+  @param ImageSizeArg     Size of PE/TE image.\r
+  @param EntryPoint       Pointer to entry point of specified image file for output.\r
+  @param AuthenticationState - Pointer to attestation authentication state of image.\r
 \r
---*/  \r
+  @retval EFI_SUCCESS    - Image is successfully loaded.\r
+  @retval EFI_NOT_FOUND  - Fail to locate necessary PPI\r
+  @retval Others         - Fail to load file.\r
 \r
+**/\r
 EFI_STATUS\r
 PeiLoadImageLoadImage (\r
   IN     EFI_PEI_SERVICES             **PeiServices,\r
@@ -49,30 +38,21 @@ PeiLoadImageLoadImage (
   OUT    EFI_PHYSICAL_ADDRESS         *EntryPoint,\r
   OUT    UINT32                       *AuthenticationState\r
   )\r
-/*++\r
-\r
-Routine Description:\r
-\r
-  Routine for loading file image.\r
-\r
-Arguments:\r
-\r
-  PeiServices          - The PEI core services table.\r
-  FileHandle           - Pointer to the FFS file header of the image.\r
-  ImageAddressArg      - Pointer to PE/TE image.\r
-  ImageSizeArg         - Size of PE/TE image.\r
-  EntryPoint           - Pointer to entry point of specified image file for output.\r
-  AuthenticationState  - Pointer to attestation authentication state of image.\r
+;\r
 \r
-Returns:\r
+/**\r
+  The wrapper function of PeiLoadImageLoadImage().\r
 \r
-  Status - EFI_SUCCESS    - Image is successfully loaded.\r
-           EFI_NOT_FOUND  - Fail to locate necessary PPI\r
-           Others         - Fail to load file.\r
+  @param This            - Pointer to EFI_PEI_LOAD_FILE_PPI.\r
+  @param FileHandle      - Pointer to the FFS file header of the image.\r
+  @param ImageAddressArg - Pointer to PE/TE image.\r
+  @param ImageSizeArg    - Size of PE/TE image.\r
+  @param EntryPoint      - Pointer to entry point of specified image file for output.\r
+  @param AuthenticationState - Pointer to attestation authentication state of image.\r
 \r
---*/\r
-;\r
+  @return Status of PeiLoadImageLoadImage().\r
 \r
+**/\r
 EFI_STATUS\r
 EFIAPI\r
 PeiLoadImageLoadImageWrapper (\r
@@ -83,27 +63,6 @@ PeiLoadImageLoadImageWrapper (
   OUT    EFI_PHYSICAL_ADDRESS         *EntryPoint,\r
   OUT    UINT32                       *AuthenticationState\r
   )\r
-/*++\r
-\r
-Routine Description:\r
-\r
-  The wrapper function of PeiLoadImageLoadImage().\r
-\r
-Arguments:\r
-\r
-  This                 - Pointer to EFI_PEI_LOAD_FILE_PPI.\r
-  PeiServices          - The PEI core services table.\r
-  FileHandle           - Pointer to the FFS file header of the image.\r
-  ImageAddressArg      - Pointer to PE/TE image.\r
-  ImageSizeArg         - Size of PE/TE image.\r
-  EntryPoint           - Pointer to entry point of specified image file for output.\r
-  AuthenticationState  - Pointer to attestation authentication state of image.\r
-\r
-Returns:\r
-\r
-  EFI_STATUS.\r
-  \r
---*/ \r
 ;\r
 \r
 STATIC EFI_PEI_LOAD_FILE_PPI   mPeiLoadImagePpi = {\r
@@ -117,6 +76,19 @@ STATIC EFI_PEI_PPI_DESCRIPTOR     gPpiLoadFilePpiList = {
   &mPeiLoadImagePpi\r
 };\r
 \r
+/**\r
+\r
+  Support routine for the PE/COFF Loader that reads a buffer from a PE/COFF file\r
+\r
+\r
+  @param FileHandle      - The handle to the PE/COFF file\r
+  @param FileOffset      - The offset, in bytes, into the file to read\r
+  @param ReadSize        - The number of bytes to read from the file starting at FileOffset\r
+  @param Buffer          - A pointer to the buffer to read the data into.\r
+\r
+  @return EFI_SUCCESS - ReadSize bytes of data were read into Buffer from the PE/COFF file starting at FileOffset\r
+\r
+**/\r
 EFI_STATUS\r
 EFIAPI\r
 PeiImageRead (\r
@@ -125,24 +97,6 @@ PeiImageRead (
   IN OUT UINTN   *ReadSize,\r
   OUT    VOID    *Buffer\r
   )\r
-/*++\r
-\r
-Routine Description:\r
-\r
-  Support routine for the PE/COFF Loader that reads a buffer from a PE/COFF file\r
-\r
-Arguments:\r
-\r
-  FileHandle - The handle to the PE/COFF file\r
-  FileOffset - The offset, in bytes, into the file to read\r
-  ReadSize   - The number of bytes to read from the file starting at FileOffset\r
-  Buffer     - A pointer to the buffer to read the data into.\r
-\r
-Returns:\r
-\r
-  EFI_SUCCESS - ReadSize bytes of data were read into Buffer from the PE/COFF file starting at FileOffset\r
-\r
---*/\r
 {\r
   CHAR8 *Destination8;\r
   CHAR8 *Source8;\r
@@ -158,27 +112,19 @@ Returns:
   return EFI_SUCCESS;\r
 }\r
 \r
-EFI_STATUS\r
-GetImageReadFunction (\r
-  IN      PE_COFF_LOADER_IMAGE_CONTEXT  *ImageContext\r
-  )\r
-/*++\r
-\r
-Routine Description:\r
-\r
-  Support routine to return the Image Read\r
-\r
-Arguments:\r
+/**\r
 \r
-  PeiServices   - PEI Services Table\r
+  Support routine to return the Image Read.\r
 \r
-  ImageContext  - The context of the image being loaded\r
+  @param ImageContext    - The context of the image being loaded\r
 \r
-Returns:\r
+  @retval EFI_SUCCESS - If Image function location is found\r
 \r
-  EFI_SUCCESS - If Image function location is found\r
-\r
---*/\r
+**/\r
+EFI_STATUS\r
+GetImageReadFunction (\r
+  IN      PE_COFF_LOADER_IMAGE_CONTEXT  *ImageContext\r
+  )\r
 {\r
   VOID*  MemoryBuffer;\r
 \r
@@ -192,7 +138,20 @@ Returns:
   return EFI_SUCCESS;\r
 }\r
 \r
-STATIC\r
+/**\r
+\r
+  Loads and relocates a PE/COFF image into memory.\r
+\r
+\r
+  @param Pe32Data        - The base address of the PE/COFF file that is to be loaded and relocated\r
+  @param ImageAddress    - The base address of the relocated PE/COFF image\r
+  @param ImageSize       - The size of the relocated PE/COFF image\r
+  @param EntryPoint      - The entry point of the relocated PE/COFF image\r
+\r
+  @retval EFI_SUCCESS           The file was loaded and relocated\r
+  @retval EFI_OUT_OF_RESOURCES  There was not enough memory to load and relocate the PE/COFF file\r
+\r
+**/\r
 EFI_STATUS\r
 LoadAndRelocatePeCoffImage (\r
   IN  VOID                                      *Pe32Data,\r
@@ -200,29 +159,6 @@ LoadAndRelocatePeCoffImage (
   OUT UINT64                                    *ImageSize,\r
   OUT EFI_PHYSICAL_ADDRESS                      *EntryPoint\r
   )\r
-/*++\r
-\r
-Routine Description:\r
-\r
-  Loads and relocates a PE/COFF image into memory.\r
-\r
-Arguments:\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
-\r
-  ImageSize        - The size of the relocated PE/COFF image\r
-\r
-  EntryPoint       - The entry point of the relocated PE/COFF image\r
-\r
-Returns:\r
-\r
-  EFI_SUCCESS   - The file was loaded and relocated\r
-\r
-  EFI_OUT_OF_RESOURCES - There was not enough memory to load and relocate the PE/COFF file\r
-\r
---*/\r
 {\r
   EFI_STATUS                            Status;\r
   PE_COFF_LOADER_IMAGE_CONTEXT          ImageContext;\r
@@ -238,6 +174,13 @@ Returns:
     return Status;\r
   }\r
   //\r
+  // When Image has no reloc section, it can't be relocated into memory.\r
+  //\r
+  if (ImageContext.RelocationsStripped) {\r
+    DEBUG ((EFI_D_ERROR, "The image at 0x%08x without reloc section can't be loaded into memory\n", (UINTN) Pe32Data));\r
+    return EFI_INVALID_PARAMETER;\r
+  }\r
+  //\r
   // Allocate Memory for the image\r
   //\r
   ImageContext.ImageAddress = (EFI_PHYSICAL_ADDRESS)(UINTN) AllocatePages (EFI_SIZE_TO_PAGES ((UINT32) ImageContext.ImageSize));\r
@@ -279,6 +222,21 @@ Returns:
   return EFI_SUCCESS;\r
 }\r
 \r
+/**\r
+  Routine for loading file image.\r
+\r
+  @param PeiServices      The PEI core services table.\r
+  @param FileHandle       Pointer to the FFS file header of the image.\r
+  @param ImageAddressArg  Pointer to PE/TE image.\r
+  @param ImageSizeArg     Size of PE/TE image.\r
+  @param EntryPoint       Pointer to entry point of specified image file for output.\r
+  @param AuthenticationState - Pointer to attestation authentication state of image.\r
+\r
+  @retval EFI_SUCCESS    - Image is successfully loaded.\r
+  @retval EFI_NOT_FOUND  - Fail to locate necessary PPI\r
+  @retval Others         - Fail to load file.\r
+\r
+**/\r
 EFI_STATUS\r
 PeiLoadImageLoadImage (\r
   IN     EFI_PEI_SERVICES             **PeiServices,\r
@@ -288,28 +246,6 @@ PeiLoadImageLoadImage (
   OUT    EFI_PHYSICAL_ADDRESS         *EntryPoint,\r
   OUT    UINT32                       *AuthenticationState\r
   )\r
-/*++\r
-\r
-Routine Description:\r
-\r
-  Routine for loading file image.\r
-\r
-Arguments:\r
-\r
-  PeiServices          - The PEI core services table.\r
-  FileHandle           - Pointer to the FFS file header of the image.\r
-  ImageAddressArg      - Pointer to PE/TE image.\r
-  ImageSizeArg         - Size of PE/TE image.\r
-  EntryPoint           - Pointer to entry point of specified image file for output.\r
-  AuthenticationState  - Pointer to attestation authentication state of image.\r
-\r
-Returns:\r
-\r
-  Status - EFI_SUCCESS    - Image is successfully loaded.\r
-           EFI_NOT_FOUND  - Fail to locate necessary PPI\r
-           Others         - Fail to load file.\r
-\r
---*/\r
 {\r
   EFI_STATUS                  Status;\r
   VOID                        *Pe32Data;\r
@@ -319,25 +255,35 @@ Returns:
   UINT16                      Machine;\r
   PEI_CORE_INSTANCE           *Private;\r
   VOID                        *EntryPointArg;\r
+  EFI_SECTION_TYPE            SearchType1;\r
+  EFI_SECTION_TYPE            SearchType2;\r
 \r
   *EntryPoint          = 0;\r
   ImageSize            = 0;\r
   *AuthenticationState = 0;\r
 \r
+  if (FeaturePcdGet (PcdPeiCoreImageLoaderSearchTeSectionFirst)) {\r
+    SearchType1 = EFI_SECTION_TE;\r
+    SearchType2 = EFI_SECTION_PE32;\r
+  } else {\r
+    SearchType1 = EFI_SECTION_PE32;\r
+    SearchType2 = EFI_SECTION_TE;\r
+  }\r
   //\r
-  // Try to find a TE section.\r
+  // Try to find a first exe section (if PcdPeiCoreImageLoaderSearchTeSectionFirst \r
+  // is true, TE will be searched first).\r
   //\r
   Status = PeiServicesFfsFindSectionData (\r
-             EFI_SECTION_TE,\r
+             SearchType1,\r
              FileHandle,\r
              &Pe32Data\r
              );\r
   //\r
-  // If we didn't find a TE section, try to find a PE32 section.\r
+  // If we didn't find a first exe section, try to find the second exe section.\r
   //\r
   if (EFI_ERROR (Status)) {\r
     Status = PeiServicesFfsFindSectionData (\r
-               EFI_SECTION_PE32,\r
+               SearchType2,\r
                FileHandle,\r
                &Pe32Data\r
                );\r
@@ -399,16 +345,27 @@ Returns:
     *ImageSizeArg = ImageSize;\r
   }\r
   \r
-  //\r
-  // 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 ", (UINTN) ImageAddress, *EntryPoint));\r
   DEBUG_CODE_BEGIN ();\r
     CHAR8                              *AsciiString;\r
     CHAR8                              AsciiBuffer[512];\r
     INT32                              Index;\r
     INT32                              Index1;\r
+\r
+    //\r
+    // Print debug message: Loading PEIM at 0x12345678 EntryPoint=0x12345688 Driver.efi\r
+    //\r
+    if (Machine != IMAGE_FILE_MACHINE_IA64) {\r
+      DEBUG ((EFI_D_INFO | EFI_D_LOAD, "Loading PEIM at 0x%11p EntryPoint=0x%11p ", (VOID *)(UINTN)ImageAddress, (VOID *)(UINTN)*EntryPoint));\r
+    } else {\r
+      //\r
+      // For IPF Image, the real entry point should be print.\r
+      //\r
+      DEBUG ((EFI_D_INFO | EFI_D_LOAD, "Loading PEIM at 0x%11p EntryPoint=0x%11p ", (VOID *)(UINTN)ImageAddress, (VOID *)(UINTN)(*(UINT64 *)(UINTN)*EntryPoint)));\r
+    }\r
     \r
+    //\r
+    // Print Module Name by PeImage PDB file name.\r
+    //\r
     AsciiString = PeCoffLoaderGetPdbPointer (Pe32Data);\r
     \r
     if (AsciiString != NULL) {\r
@@ -436,6 +393,19 @@ Returns:
 }\r
 \r
 \r
+/**\r
+  The wrapper function of PeiLoadImageLoadImage().\r
+\r
+  @param This            - Pointer to EFI_PEI_LOAD_FILE_PPI.\r
+  @param FileHandle      - Pointer to the FFS file header of the image.\r
+  @param ImageAddressArg - Pointer to PE/TE image.\r
+  @param ImageSizeArg    - Size of PE/TE image.\r
+  @param EntryPoint      - Pointer to entry point of specified image file for output.\r
+  @param AuthenticationState - Pointer to attestation authentication state of image.\r
+\r
+  @return Status of PeiLoadImageLoadImage().\r
+\r
+**/\r
 EFI_STATUS\r
 EFIAPI\r
 PeiLoadImageLoadImageWrapper (\r
@@ -446,27 +416,6 @@ PeiLoadImageLoadImageWrapper (
   OUT    EFI_PHYSICAL_ADDRESS         *EntryPoint,\r
   OUT    UINT32                       *AuthenticationState\r
   )\r
-/*++\r
-\r
-Routine Description:\r
-\r
-  The wrapper function of PeiLoadImageLoadImage().\r
-\r
-Arguments:\r
-\r
-  This                 - Pointer to EFI_PEI_LOAD_FILE_PPI.\r
-  PeiServices          - The PEI core services table.\r
-  FileHandle           - Pointer to the FFS file header of the image.\r
-  ImageAddressArg      - Pointer to PE/TE image.\r
-  ImageSizeArg         - Size of PE/TE image.\r
-  EntryPoint           - Pointer to entry point of specified image file for output.\r
-  AuthenticationState  - Pointer to attestation authentication state of image.\r
-\r
-Returns:\r
-\r
-  EFI_STATUS.\r
-  \r
---*/      \r
 {\r
   return PeiLoadImageLoadImage (\r
            GetPeiServicesTablePointer (),\r
@@ -478,6 +427,21 @@ Returns:
            );\r
 }\r
 \r
+/**\r
+\r
+  Routine for load image file.\r
+\r
+\r
+  @param PeiServices     - The PEI core services table.\r
+  @param FileHandle      - Pointer to the FFS file header of the image.\r
+  @param EntryPoint      - Pointer to entry point of specified image file for output.\r
+  @param AuthenticationState - Pointer to attestation authentication state of image.\r
+\r
+  @retval EFI_SUCCESS    - Image is successfully loaded.\r
+  @retval EFI_NOT_FOUND  - Fail to locate necessary PPI\r
+  @retval Others         - Fail to load file.\r
+\r
+**/\r
 EFI_STATUS\r
 PeiLoadImage (\r
   IN     EFI_PEI_SERVICES             **PeiServices,\r
@@ -485,26 +449,6 @@ PeiLoadImage (
   OUT    EFI_PHYSICAL_ADDRESS         *EntryPoint,\r
   OUT    UINT32                       *AuthenticationState\r
   )\r
-/*++\r
-\r
-Routine Description:\r
-\r
-  Routine for load image file.\r
-\r
-Arguments:\r
-\r
-  PeiServices          - The PEI core services table.\r
-  FileHandle           - Pointer to the FFS file header of the image.\r
-  EntryPoint           - Pointer to entry point of specified image file for output.\r
-  AuthenticationState  - Pointer to attestation authentication state of image.\r
-\r
-Returns:\r
-\r
-  Status - EFI_SUCCESS    - Image is successfully loaded.\r
-           EFI_NOT_FOUND  - Fail to locate necessary PPI\r
-           Others         - Fail to load file.\r
-  \r
---*/    \r
 {\r
   EFI_STATUS              PpiStatus;\r
   EFI_STATUS              Status;\r
@@ -557,27 +501,21 @@ Returns:
 }\r
 \r
 \r
+/**\r
+  Initialize image service that install PeiLoadFilePpi.\r
+\r
+  @param PrivateData     Pointer to PeiCore's private data structure PEI_CORE_INSTANCE.\r
+  @param OldCoreData     Pointer to Old PeiCore's private data.\r
+                         If NULL, PeiCore is entered at first time, stack/heap in temporary memory.\r
+                         If not NULL, PeiCore is entered at second time, stack/heap has been moved\r
+                         to permenent memory.\r
+\r
+**/\r
 VOID\r
 InitializeImageServices (\r
   IN  PEI_CORE_INSTANCE   *PrivateData,\r
   IN  PEI_CORE_INSTANCE   *OldCoreData\r
   )\r
-/*++\r
-\r
-Routine Description:\r
-\r
-  Install Pei Load File PPI.\r
-\r
-Arguments:\r
-\r
-  PrivateData    - Pointer to PEI_CORE_INSTANCE.\r
-  OldCoreData    - Pointer to PEI_CORE_INSTANCE.\r
-\r
-Returns:\r
-\r
-  NONE.\r
-  \r
---*/      \r
 {\r
   if (OldCoreData == NULL) {\r
     //\r