123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204 |
- /** @file
- Function prototypes and defines on Memory Only PE COFF loader
- Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.<BR>
- SPDX-License-Identifier: BSD-2-Clause-Patent
- **/
- #ifndef __BASE_PE_COFF_LIB_H__
- #define __BASE_PE_COFF_LIB_H__
- //
- // Return status codes from the PE/COFF Loader services
- // BUGBUG: Find where used and see if can be replaced by RETURN_STATUS codes
- //
- #define IMAGE_ERROR_SUCCESS 0
- #define IMAGE_ERROR_IMAGE_READ 1
- #define IMAGE_ERROR_INVALID_PE_HEADER_SIGNATURE 2
- #define IMAGE_ERROR_INVALID_MACHINE_TYPE 3
- #define IMAGE_ERROR_INVALID_SUBSYSTEM 4
- #define IMAGE_ERROR_INVALID_IMAGE_ADDRESS 5
- #define IMAGE_ERROR_INVALID_IMAGE_SIZE 6
- #define IMAGE_ERROR_INVALID_SECTION_ALIGNMENT 7
- #define IMAGE_ERROR_SECTION_NOT_LOADED 8
- #define IMAGE_ERROR_FAILED_RELOCATION 9
- #define IMAGE_ERROR_FAILED_ICACHE_FLUSH 10
- //
- // PE/COFF Loader Read Function passed in by caller
- //
- typedef
- RETURN_STATUS
- (EFIAPI *PE_COFF_LOADER_READ_FILE) (
- IN VOID *FileHandle,
- IN UINTN FileOffset,
- IN OUT UINTN *ReadSize,
- OUT VOID *Buffer
- );
- //
- // Context structure used while PE/COFF image is being loaded and relocated
- //
- typedef struct {
- PHYSICAL_ADDRESS ImageAddress;
- UINT64 ImageSize;
- PHYSICAL_ADDRESS DestinationAddress;
- PHYSICAL_ADDRESS EntryPoint;
- PE_COFF_LOADER_READ_FILE ImageRead;
- VOID *Handle;
- VOID *FixupData;
- UINT32 SectionAlignment;
- UINT32 PeCoffHeaderOffset;
- UINT32 DebugDirectoryEntryRva;
- VOID *CodeView;
- CHAR8 *PdbPointer;
- UINTN SizeOfHeaders;
- UINT32 ImageCodeMemoryType;
- UINT32 ImageDataMemoryType;
- UINT32 ImageError;
- UINTN FixupDataSize;
- UINT16 Machine;
- UINT16 ImageType;
- BOOLEAN RelocationsStripped;
- BOOLEAN IsTeImage;
- } PE_COFF_LOADER_IMAGE_CONTEXT;
- /**
- Retrieves information on a PE/COFF image
- @param ImageContext The context of the image being loaded
- @retval EFI_SUCCESS The information on the PE/COFF image was collected.
- @retval EFI_INVALID_PARAMETER ImageContext is NULL.
- @retval EFI_UNSUPPORTED The PE/COFF image is not supported.
- @retval Otherwise The error status from reading the PE/COFF image using the
- ImageContext->ImageRead() function
- **/
- RETURN_STATUS
- EFIAPI
- PeCoffLoaderGetImageInfo (
- IN OUT PE_COFF_LOADER_IMAGE_CONTEXT *ImageContext
- )
- ;
- /**
- Relocates a PE/COFF image in memory
- @param ImageContext Contains information on the loaded image to relocate
- @retval EFI_SUCCESS if the PE/COFF image was relocated
- @retval EFI_LOAD_ERROR if the image is not a valid PE/COFF image
- @retval EFI_UNSUPPORTED not support
- **/
- RETURN_STATUS
- EFIAPI
- PeCoffLoaderRelocateImage (
- IN OUT PE_COFF_LOADER_IMAGE_CONTEXT *ImageContext
- )
- ;
- /**
- Loads a PE/COFF image into memory
- @param ImageContext Contains information on image to load into memory
- @retval EFI_SUCCESS if the PE/COFF image was loaded
- @retval EFI_BUFFER_TOO_SMALL if the caller did not provide a large enough buffer
- @retval EFI_LOAD_ERROR if the image is a runtime driver with no relocations
- @retval EFI_INVALID_PARAMETER if the image address is invalid
- **/
- RETURN_STATUS
- EFIAPI
- PeCoffLoaderLoadImage (
- IN OUT PE_COFF_LOADER_IMAGE_CONTEXT *ImageContext
- )
- ;
- VOID *
- EFIAPI
- PeCoffLoaderGetPdbPointer (
- IN VOID *Pe32Data
- )
- ;
- RETURN_STATUS
- EFIAPI
- PeCoffLoaderGetEntryPoint (
- IN VOID *Pe32Data,
- OUT VOID **EntryPoint,
- OUT VOID **BaseOfImage
- )
- ;
- //
- // These functions are used by the ARM PE/COFF relocation code and by
- // the ELF to PE/COFF converter so that is why they are public
- //
- /**
- Pass in a pointer to an ARM MOVT or MOVW immediate instruction and
- return the immediate data encoded in the instruction
- @param Instruction Pointer to ARM MOVT or MOVW immediate instruction
- @return Immediate address encoded in the instruction
- **/
- UINT16
- EFIAPI
- ThumbMovtImmediateAddress (
- IN UINT16 *Instruction
- );
- /**
- Update an ARM MOVT or MOVW immediate instruction immediate data.
- @param Instruction Pointer to ARM MOVT or MOVW immediate instruction
- @param Address New address to patch into the instruction
- **/
- VOID
- EFIAPI
- ThumbMovtImmediatePatch (
- IN OUT UINT16 *Instruction,
- IN UINT16 Address
- );
- /**
- Pass in a pointer to an ARM MOVW/MOVT instruction pair and
- return the immediate data encoded in the two` instruction
- @param Instructions Pointer to ARM MOVW/MOVT instruction pair
- @return Immediate address encoded in the instructions
- **/
- UINT32
- EFIAPI
- ThumbMovwMovtImmediateAddress (
- IN UINT16 *Instructions
- );
- /**
- Update an ARM MOVW/MOVT immediate instruction instruction pair.
- @param Instructions Pointer to ARM MOVW/MOVT instruction pair
- @param Address New address to patch into the instructions
- **/
- VOID
- EFIAPI
- ThumbMovwMovtImmediatePatch (
- IN OUT UINT16 *Instructions,
- IN UINT32 Address
- );
- #endif
|