1 /** @file 2 Function prototypes and defines on Memory Only PE COFF loader 3 4 Copyright (c) 2006 - 2014, Intel Corporation. All rights reserved.<BR> 5 This program and the accompanying materials 6 are licensed and made available under the terms and conditions of the BSD License 7 which accompanies this distribution. The full text of the license may be found at 8 http://opensource.org/licenses/bsd-license.php 9 10 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, 11 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. 12 13 **/ 14 15 #ifndef __BASE_PE_COFF_LIB_H__ 16 #define __BASE_PE_COFF_LIB_H__ 17 18 // 19 // Return status codes from the PE/COFF Loader services 20 // BUGBUG: Find where used and see if can be replaced by RETURN_STATUS codes 21 // 22 #define IMAGE_ERROR_SUCCESS 0 23 #define IMAGE_ERROR_IMAGE_READ 1 24 #define IMAGE_ERROR_INVALID_PE_HEADER_SIGNATURE 2 25 #define IMAGE_ERROR_INVALID_MACHINE_TYPE 3 26 #define IMAGE_ERROR_INVALID_SUBSYSTEM 4 27 #define IMAGE_ERROR_INVALID_IMAGE_ADDRESS 5 28 #define IMAGE_ERROR_INVALID_IMAGE_SIZE 6 29 #define IMAGE_ERROR_INVALID_SECTION_ALIGNMENT 7 30 #define IMAGE_ERROR_SECTION_NOT_LOADED 8 31 #define IMAGE_ERROR_FAILED_RELOCATION 9 32 #define IMAGE_ERROR_FAILED_ICACHE_FLUSH 10 33 34 35 // 36 // PE/COFF Loader Read Function passed in by caller 37 // 38 typedef 39 RETURN_STATUS 40 (EFIAPI *PE_COFF_LOADER_READ_FILE) ( 41 IN VOID *FileHandle, 42 IN UINTN FileOffset, 43 IN OUT UINTN *ReadSize, 44 OUT VOID *Buffer 45 ); 46 47 // 48 // Context structure used while PE/COFF image is being loaded and relocated 49 // 50 typedef struct { 51 PHYSICAL_ADDRESS ImageAddress; 52 UINT64 ImageSize; 53 PHYSICAL_ADDRESS DestinationAddress; 54 PHYSICAL_ADDRESS EntryPoint; 55 PE_COFF_LOADER_READ_FILE ImageRead; 56 VOID *Handle; 57 VOID *FixupData; 58 UINT32 SectionAlignment; 59 UINT32 PeCoffHeaderOffset; 60 UINT32 DebugDirectoryEntryRva; 61 VOID *CodeView; 62 CHAR8 *PdbPointer; 63 UINTN SizeOfHeaders; 64 UINT32 ImageCodeMemoryType; 65 UINT32 ImageDataMemoryType; 66 UINT32 ImageError; 67 UINTN FixupDataSize; 68 UINT16 Machine; 69 UINT16 ImageType; 70 BOOLEAN RelocationsStripped; 71 BOOLEAN IsTeImage; 72 } PE_COFF_LOADER_IMAGE_CONTEXT; 73 74 75 /** 76 Retrieves information on a PE/COFF image 77 78 @param ImageContext The context of the image being loaded 79 80 @retval EFI_SUCCESS The information on the PE/COFF image was collected. 81 @retval EFI_INVALID_PARAMETER ImageContext is NULL. 82 @retval EFI_UNSUPPORTED The PE/COFF image is not supported. 83 @retval Otherwise The error status from reading the PE/COFF image using the 84 ImageContext->ImageRead() function 85 86 **/ 87 RETURN_STATUS 88 EFIAPI 89 PeCoffLoaderGetImageInfo ( 90 IN OUT PE_COFF_LOADER_IMAGE_CONTEXT *ImageContext 91 ) 92 ; 93 94 /** 95 Relocates a PE/COFF image in memory 96 97 @param ImageContext Contains information on the loaded image to relocate 98 99 @retval EFI_SUCCESS if the PE/COFF image was relocated 100 @retval EFI_LOAD_ERROR if the image is not a valid PE/COFF image 101 @retval EFI_UNSUPPORTED not support 102 103 **/ 104 RETURN_STATUS 105 EFIAPI 106 PeCoffLoaderRelocateImage ( 107 IN OUT PE_COFF_LOADER_IMAGE_CONTEXT *ImageContext 108 ) 109 ; 110 111 /** 112 Loads a PE/COFF image into memory 113 114 @param ImageContext Contains information on image to load into memory 115 116 @retval EFI_SUCCESS if the PE/COFF image was loaded 117 @retval EFI_BUFFER_TOO_SMALL if the caller did not provide a large enough buffer 118 @retval EFI_LOAD_ERROR if the image is a runtime driver with no relocations 119 @retval EFI_INVALID_PARAMETER if the image address is invalid 120 121 **/ 122 RETURN_STATUS 123 EFIAPI 124 PeCoffLoaderLoadImage ( 125 IN OUT PE_COFF_LOADER_IMAGE_CONTEXT *ImageContext 126 ) 127 ; 128 129 VOID * 130 EFIAPI 131 PeCoffLoaderGetPdbPointer ( 132 IN VOID *Pe32Data 133 ) 134 ; 135 136 RETURN_STATUS 137 EFIAPI 138 PeCoffLoaderGetEntryPoint ( 139 IN VOID *Pe32Data, 140 OUT VOID **EntryPoint, 141 OUT VOID **BaseOfImage 142 ) 143 ; 144 145 // 146 // These functions are used by the ARM PE/COFF relocation code and by 147 // the ELF to PE/COFF converter so that is why they are public 148 // 149 150 /** 151 Pass in a pointer to an ARM MOVT or MOVW immediate instruciton and 152 return the immediate data encoded in the instruction 153 154 @param Instruction Pointer to ARM MOVT or MOVW immediate instruction 155 156 @return Immediate address encoded in the instruction 157 158 **/ 159 UINT16 160 EFIAPI 161 ThumbMovtImmediateAddress ( 162 IN UINT16 *Instruction 163 ); 164 165 /** 166 Update an ARM MOVT or MOVW immediate instruction immediate data. 167 168 @param Instruction Pointer to ARM MOVT or MOVW immediate instruction 169 @param Address New addres to patch into the instruction 170 171 **/ 172 VOID 173 EFIAPI 174 ThumbMovtImmediatePatch ( 175 IN OUT UINT16 *Instruction, 176 IN UINT16 Address 177 ); 178 179 180 /** 181 Pass in a pointer to an ARM MOVW/MOVT instruciton pair and 182 return the immediate data encoded in the two` instruction 183 184 @param Instructions Pointer to ARM MOVW/MOVT insturction pair 185 186 @return Immediate address encoded in the instructions 187 188 **/ 189 UINT32 190 EFIAPI 191 ThumbMovwMovtImmediateAddress ( 192 IN UINT16 *Instructions 193 ); 194 195 /** 196 Update an ARM MOVW/MOVT immediate instruction instruction pair. 197 198 @param Instructions Pointer to ARM MOVW/MOVT instruction pair 199 @param Address New addres to patch into the instructions 200 **/ 201 VOID 202 EFIAPI 203 ThumbMovwMovtImmediatePatch ( 204 IN OUT UINT16 *Instructions, 205 IN UINT32 Address 206 ); 207 208 209 210 #endif 211