/*++ | |
Copyright (c) 2006, Intel Corporation | |
All rights reserved. This program and the accompanying materials | |
are licensed and made available under the terms and conditions of the BSD License | |
which accompanies this distribution. The full text of the license may be found at | |
http://opensource.org/licenses/bsd-license.php | |
THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, | |
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. | |
Module Name: | |
ImageRead.c | |
Abstract: | |
--*/ | |
#include <DxeIpl.h> | |
EFI_STATUS | |
EFIAPI | |
PeiImageRead ( | |
IN VOID *FileHandle, | |
IN UINTN FileOffset, | |
IN OUT UINTN *ReadSize, | |
OUT VOID *Buffer | |
) | |
/*++ | |
Routine Description: | |
Support routine for the PE/COFF Loader that reads a buffer from a PE/COFF file | |
Arguments: | |
FileHandle - The handle to the PE/COFF file | |
FileOffset - The offset, in bytes, into the file to read | |
ReadSize - The number of bytes to read from the file starting at FileOffset | |
Buffer - A pointer to the buffer to read the data into. | |
Returns: | |
EFI_SUCCESS - ReadSize bytes of data were read into Buffer from the PE/COFF file starting at FileOffset | |
--*/ | |
{ | |
UINT8 *Destination32; | |
UINT8 *Source32; | |
UINTN Length; | |
Destination32 = Buffer; | |
Source32 = (UINT8 *) ((UINTN) FileHandle + FileOffset); | |
// | |
// This function assumes 32-bit alignment to increase performance | |
// | |
// ASSERT (ALIGN_POINTER (Destination32, sizeof (UINT32)) == Destination32); | |
// ASSERT (ALIGN_POINTER (Source32, sizeof (UINT32)) == Source32); | |
Length = *ReadSize; | |
while (Length--) { | |
*(Destination32++) = *(Source32++); | |
} | |
return EFI_SUCCESS; | |
} | |
EFI_STATUS | |
GetImageReadFunction ( | |
IN PE_COFF_LOADER_IMAGE_CONTEXT *ImageContext | |
) | |
/*++ | |
Routine Description: | |
Support routine to return the PE32 Image Reader. | |
If the PeiImageRead() function is less than a page | |
in legnth. If the function is more than a page the DXE IPL will crash!!!! | |
Arguments: | |
ImageContext - The context of the image being loaded | |
Returns: | |
EFI_SUCCESS - If Image function location is found | |
--*/ | |
{ | |
VOID *MemoryBuffer; | |
if (gInMemory) { | |
ImageContext->ImageRead = PeiImageRead; | |
return EFI_SUCCESS; | |
} | |
// | |
// BugBug; This code assumes PeiImageRead() is less than a page in size! | |
// Allocate a page so we can shaddow the read function from FLASH into | |
// memory to increase performance. | |
// | |
MemoryBuffer = AllocateCopyPool (0x400, (VOID *)(UINTN) PeiImageRead); | |
ASSERT (MemoryBuffer != NULL); | |
ImageContext->ImageRead = (PE_COFF_LOADER_READ_FILE) (UINTN) MemoryBuffer; | |
return EFI_SUCCESS; | |
} |