| /** @file | |
| Function prototypes and defines on Memory Only PE COFF loader | |
| Copyright (c) 2006 - 2014, Intel Corporation. All rights reserved.<BR> | |
| 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. | |
| **/ | |
| #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 instruciton 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 addres to patch into the instruction | |
| **/ | |
| VOID | |
| EFIAPI | |
| ThumbMovtImmediatePatch ( | |
| IN OUT UINT16 *Instruction, | |
| IN UINT16 Address | |
| ); | |
| /** | |
| Pass in a pointer to an ARM MOVW/MOVT instruciton pair and | |
| return the immediate data encoded in the two` instruction | |
| @param Instructions Pointer to ARM MOVW/MOVT insturction 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 addres to patch into the instructions | |
| **/ | |
| VOID | |
| EFIAPI | |
| ThumbMovwMovtImmediatePatch ( | |
| IN OUT UINT16 *Instructions, | |
| IN UINT32 Address | |
| ); | |
| #endif |