]> git.proxmox.com Git - mirror_edk2.git/commitdiff
Update PEI Core LoadImage() service to always call LoadAndRelocatePeCoffImage() even...
authormdkinney <mdkinney@6f19259b-4bc3-4df7-8a09-765794883524>
Thu, 1 Oct 2009 23:49:36 +0000 (23:49 +0000)
committermdkinney <mdkinney@6f19259b-4bc3-4df7-8a09-765794883524>
Thu, 1 Oct 2009 23:49:36 +0000 (23:49 +0000)
git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@9327 6f19259b-4bc3-4df7-8a09-765794883524

MdeModulePkg/Core/Pei/Image/Image.c

index 1a6ba313c2c3d2dac0dc34e01a87006157c7c0f3..2928248c7bbf4812c5a96819033d55aa434e1beb 100644 (file)
@@ -54,9 +54,11 @@ PeiImageRead (
 \r
   Destination8  = Buffer;\r
   Source8       = (CHAR8 *) ((UINTN) FileHandle + FileOffset);\r
-  Length        = *ReadSize;\r
-  while ((Length--) > 0) {\r
-    *(Destination8++) = *(Source8++);\r
+  if (Destination8 != Source8) {\r
+    Length        = *ReadSize;\r
+    while ((Length--) > 0) {\r
+      *(Destination8++) = *(Source8++);\r
+    }\r
   }\r
 \r
   return EFI_SUCCESS;\r
@@ -76,14 +78,21 @@ GetImageReadFunction (
   IN      PE_COFF_LOADER_IMAGE_CONTEXT  *ImageContext\r
   )\r
 {\r
+  PEI_CORE_INSTANCE  *Private;\r
   VOID*  MemoryBuffer;\r
 \r
-  MemoryBuffer = AllocatePages (0x400 / EFI_PAGE_SIZE + 1);\r
-  ASSERT (MemoryBuffer != NULL);\r
+  Private = PEI_CORE_INSTANCE_FROM_PS_THIS (GetPeiServicesTablePointer ());\r
 \r
-  CopyMem (MemoryBuffer, (CONST VOID *) (UINTN) PeiImageRead, 0x400);\r
+  if (!Private->PeiMemoryInstalled) {\r
+    ImageContext->ImageRead = PeiImageRead;\r
+  } else {\r
+    MemoryBuffer = AllocatePages (0x400 / EFI_PAGE_SIZE + 1);\r
+    ASSERT (MemoryBuffer != NULL);\r
 \r
-  ImageContext->ImageRead = (PE_COFF_LOADER_READ_FILE) (UINTN) MemoryBuffer;\r
+    CopyMem (MemoryBuffer, (CONST VOID *) (UINTN) PeiImageRead, 0x400);\r
+\r
+    ImageContext->ImageRead = (PE_COFF_LOADER_READ_FILE) (UINTN) MemoryBuffer;\r
+  }\r
 \r
   return EFI_SUCCESS;\r
 }\r
@@ -113,6 +122,9 @@ LoadAndRelocatePeCoffImage (
 {\r
   EFI_STATUS                            Status;\r
   PE_COFF_LOADER_IMAGE_CONTEXT          ImageContext;\r
+  PEI_CORE_INSTANCE                     *Private;\r
+\r
+  Private = PEI_CORE_INSTANCE_FROM_PS_THIS (GetPeiServicesTablePointer ());\r
 \r
   ZeroMem (&ImageContext, sizeof (ImageContext));\r
   ImageContext.Handle = Pe32Data;\r
@@ -129,21 +141,24 @@ LoadAndRelocatePeCoffImage (
   //\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
-  ASSERT (ImageContext.ImageAddress != 0);\r
-  \r
-  //\r
-  // Skip the reserved space for the stripped PeHeader when load TeImage into memory.\r
-  //\r
-  if (ImageContext.IsTeImage) {\r
-    ImageContext.ImageAddress = ImageContext.ImageAddress + \r
-                                ((EFI_TE_IMAGE_HEADER *) Pe32Data)->StrippedSize -\r
-                                sizeof (EFI_TE_IMAGE_HEADER);\r
+  if (Private->PeiMemoryInstalled) {\r
+    ImageContext.ImageAddress = (EFI_PHYSICAL_ADDRESS)(UINTN) AllocatePages (EFI_SIZE_TO_PAGES ((UINT32) ImageContext.ImageSize));\r
+    ASSERT (ImageContext.ImageAddress != 0);\r
+    \r
+    //\r
+    // Skip the reserved space for the stripped PeHeader when load TeImage into memory.\r
+    //\r
+    if (ImageContext.IsTeImage) {\r
+      ImageContext.ImageAddress = ImageContext.ImageAddress + \r
+                                  ((EFI_TE_IMAGE_HEADER *) Pe32Data)->StrippedSize -\r
+                                  sizeof (EFI_TE_IMAGE_HEADER);\r
+    }\r
+  } else {\r
+    ImageContext.ImageAddress = (EFI_PHYSICAL_ADDRESS)(UINTN) Pe32Data;\r
   }\r
 \r
   //\r
@@ -164,7 +179,9 @@ LoadAndRelocatePeCoffImage (
   //\r
   // Flush the instruction cache so the image data is written before we execute it\r
   //\r
-  InvalidateInstructionCacheRange ((VOID *)(UINTN)ImageContext.ImageAddress, (UINTN)ImageContext.ImageSize);\r
+  if (Private->PeiMemoryInstalled) {\r
+    InvalidateInstructionCacheRange ((VOID *)(UINTN)ImageContext.ImageAddress, (UINTN)ImageContext.ImageSize);\r
+  }\r
 \r
   *ImageAddress = ImageContext.ImageAddress;\r
   *ImageSize    = ImageContext.ImageSize;\r
@@ -207,7 +224,6 @@ PeiLoadImageLoadImage (
   EFI_PHYSICAL_ADDRESS        ImageEntryPoint;\r
   UINT16                      Machine;\r
   PEI_CORE_INSTANCE           *Private;\r
-  VOID                        *EntryPointArg;\r
   EFI_SECTION_TYPE            SearchType1;\r
   EFI_SECTION_TYPE            SearchType2;\r
 \r
@@ -251,38 +267,28 @@ PeiLoadImageLoadImage (
   \r
   Private = PEI_CORE_INSTANCE_FROM_PS_THIS (PeiServices);\r
 \r
-  if (Private->PeiMemoryInstalled && \r
-      (Private->HobList.HandoffInformationTable->BootMode != BOOT_ON_S3_RESUME)) {\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
+  // If memory is installed, perform the shadow operations\r
+  //\r
+  Status = LoadAndRelocatePeCoffImage (\r
+    Pe32Data,\r
+    &ImageAddress,\r
+    &ImageSize,\r
+    &ImageEntryPoint\r
+  );\r
 \r
-    if (EFI_ERROR (Status)) {\r
-      return Status;\r
-    }\r
+  ASSERT_EFI_ERROR (Status);\r
 \r
-    //\r
-    // Got the entry point from the loaded Pe32Data\r
-    //\r
-    Pe32Data    = (VOID *) ((UINTN) ImageAddress);\r
-    *EntryPoint = ImageEntryPoint;\r
-  } else {\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
+  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
   \r
   Machine = PeCoffLoaderGetMachineType (Pe32Data);\r
   \r