\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
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
{\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
//\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
//\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
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
\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