]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Core/Pei/Image/Image.c
Make ASSERT statement more meaningful.
[mirror_edk2.git] / MdeModulePkg / Core / Pei / Image / Image.c
index 555ebe3fb30904a423eb8fa5979322ed3e18bdc3..1a6ba313c2c3d2dac0dc34e01a87006157c7c0f3 100644 (file)
@@ -1,7 +1,7 @@
 /** @file\r
   Pei Core Load Image Support\r
   \r
-Copyright (c) 2006 - 2008, Intel Corporation                                                         \r
+Copyright (c) 2006 - 2009, 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
 which accompanies this distribution.  The full text of the license may be found at        \r
@@ -12,39 +12,15 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
 \r
 **/\r
 \r
-#include <PeiMain.h>\r
+#include "PeiMain.h"\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
-  IN     CONST EFI_PEI_LOAD_FILE_PPI  *This,\r
-  IN     EFI_PEI_FILE_HANDLE          FileHandle,\r
-  OUT    EFI_PHYSICAL_ADDRESS         *ImageAddressArg,  OPTIONAL\r
-  OUT    UINT64                       *ImageSizeArg,     OPTIONAL\r
-  OUT    EFI_PHYSICAL_ADDRESS         *EntryPoint,\r
-  OUT    UINT32                       *AuthenticationState\r
-  )\r
-;\r
-\r
-STATIC EFI_PEI_LOAD_FILE_PPI   mPeiLoadImagePpi = {\r
+EFI_PEI_LOAD_FILE_PPI   mPeiLoadImagePpi = {\r
   PeiLoadImageLoadImageWrapper\r
 };\r
 \r
 \r
-STATIC EFI_PEI_PPI_DESCRIPTOR     gPpiLoadFilePpiList = {\r
+EFI_PEI_PPI_DESCRIPTOR     gPpiLoadFilePpiList = {\r
   (EFI_PEI_PPI_DESCRIPTOR_PPI | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST),\r
   &gEfiPeiLoadFilePpiGuid,\r
   &mPeiLoadImagePpi\r
@@ -79,7 +55,7 @@ PeiImageRead (
   Destination8  = Buffer;\r
   Source8       = (CHAR8 *) ((UINTN) FileHandle + FileOffset);\r
   Length        = *ReadSize;\r
-  while (Length--) {\r
+  while ((Length--) > 0) {\r
     *(Destination8++) = *(Source8++);\r
   }\r
 \r
@@ -216,7 +192,7 @@ LoadAndRelocatePeCoffImage (
 **/\r
 EFI_STATUS\r
 PeiLoadImageLoadImage (\r
-  IN     EFI_PEI_SERVICES             **PeiServices,\r
+  IN     CONST EFI_PEI_SERVICES       **PeiServices,\r
   IN     EFI_PEI_FILE_HANDLE          FileHandle,\r
   OUT    EFI_PHYSICAL_ADDRESS         *ImageAddressArg,  OPTIONAL\r
   OUT    UINT64                       *ImageSizeArg,     OPTIONAL\r
@@ -311,7 +287,9 @@ PeiLoadImageLoadImage (
   Machine = PeCoffLoaderGetMachineType (Pe32Data);\r
   \r
   if (!EFI_IMAGE_MACHINE_TYPE_SUPPORTED (Machine)) {\r
-    return EFI_UNSUPPORTED;  \r
+    if (!EFI_IMAGE_MACHINE_CROSS_TYPE_SUPPORTED (Machine)) {\r
+      return EFI_UNSUPPORTED;\r
+    }\r
   }\r
 \r
   if (ImageAddressArg != NULL) {\r
@@ -331,7 +309,7 @@ PeiLoadImageLoadImage (
     //\r
     // Print debug message: Loading PEIM at 0x12345678 EntryPoint=0x12345688 Driver.efi\r
     //\r
-    if (Machine != IMAGE_FILE_MACHINE_IA64) {\r
+    if (Machine != EFI_IMAGE_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
@@ -421,7 +399,7 @@ PeiLoadImageLoadImageWrapper (
 **/\r
 EFI_STATUS\r
 PeiLoadImage (\r
-  IN     EFI_PEI_SERVICES             **PeiServices,\r
+  IN     CONST EFI_PEI_SERVICES       **PeiServices,\r
   IN     EFI_PEI_FILE_HANDLE          FileHandle,\r
   OUT    EFI_PHYSICAL_ADDRESS         *EntryPoint,\r
   OUT    UINT32                       *AuthenticationState\r
@@ -456,25 +434,20 @@ PeiLoadImage (
                           AuthenticationState\r
                           );\r
       if (!EFI_ERROR (Status)) {\r
+        //\r
+        // The image to be started must have the machine type supported by PeiCore.\r
+        //\r
+        ASSERT (EFI_IMAGE_MACHINE_TYPE_SUPPORTED (PeCoffLoaderGetMachineType ((VOID *) (UINTN) ImageAddress)));\r
+        if (!EFI_IMAGE_MACHINE_TYPE_SUPPORTED (PeCoffLoaderGetMachineType ((VOID *) (UINTN) ImageAddress))) {\r
+          return EFI_UNSUPPORTED;\r
+        }\r
         return Status;\r
       }\r
     }\r
     Index++;\r
   } while (!EFI_ERROR (PpiStatus));\r
 \r
-  //\r
-  // If no instances reports EFI_SUCCESS, then build-in support for\r
-  // the PE32+/TE XIP image format is used.\r
-  //\r
-  Status = PeiLoadImageLoadImage (\r
-            PeiServices, \r
-            FileHandle, \r
-            NULL, \r
-            NULL, \r
-            EntryPoint, \r
-            AuthenticationState\r
-            );\r
-  return Status;\r
+  return PpiStatus;\r
 }\r
 \r
 \r