]> git.proxmox.com Git - mirror_edk2.git/blame - BaseTools/Source/C/Include/IndustryStandard/PeImage.h
BaseTools: Replace BSD License with BSD+Patent License
[mirror_edk2.git] / BaseTools / Source / C / Include / IndustryStandard / PeImage.h
CommitLineData
30fdf114
LG
1/** @file\r
2 EFI image format for PE32+. Please note some data structures are different\r
3 for IA-32 and Itanium-based images, look for UINTN and the #ifdef EFI_IA64\r
4\r
5 @bug Fix text - doc as defined in MSFT EFI specification.\r
6\r
f7496d71 7 Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.<BR>\r
4afd3d04 8 Portions copyright (c) 2011 - 2013, ARM Ltd. All rights reserved.<BR>\r
30fdf114 9\r
2e351cbe 10 SPDX-License-Identifier: BSD-2-Clause-Patent\r
30fdf114 11\r
30fdf114
LG
12**/\r
13\r
14#ifndef __PE_IMAGE_H__\r
15#define __PE_IMAGE_H__\r
16\r
17//\r
18// PE32+ Subsystem type for EFI images\r
19//\r
20#define EFI_IMAGE_SUBSYSTEM_EFI_APPLICATION 10\r
21#define EFI_IMAGE_SUBSYSTEM_EFI_BOOT_SERVICE_DRIVER 11\r
22#define EFI_IMAGE_SUBSYSTEM_EFI_RUNTIME_DRIVER 12\r
23#define EFI_IMAGE_SUBSYSTEM_SAL_RUNTIME_DRIVER 13\r
24\r
25//\r
26// BugBug: Need to get a real answer for this problem. This is not in the\r
27// PE specification.\r
28//\r
29// A SAL runtime driver does not get fixed up when a transition to\r
30// virtual mode is made. In all other cases it should be treated\r
31// like a EFI_IMAGE_SUBSYSTEM_EFI_RUNTIME_DRIVER image\r
32//\r
33#define EFI_IMAGE_SUBSYSTEM_SAL_RUNTIME_DRIVER 13\r
34\r
35//\r
36// PE32+ Machine type for EFI images\r
37//\r
38#define IMAGE_FILE_MACHINE_I386 0x014c\r
30fdf114
LG
39#define IMAGE_FILE_MACHINE_EBC 0x0EBC\r
40#define IMAGE_FILE_MACHINE_X64 0x8664\r
41#define IMAGE_FILE_MACHINE_ARM 0x01c0 // Thumb only\r
42#define IMAGE_FILE_MACHINE_ARMT 0x01c2 // 32bit Mixed ARM and Thumb/Thumb 2 Little Endian\r
4afd3d04 43#define IMAGE_FILE_MACHINE_ARM64 0xAA64 // 64bit ARM Architecture, Little Endian\r
30fdf114
LG
44\r
45//\r
46// Support old names for backward compatible\r
47//\r
f7496d71 48#define EFI_IMAGE_MACHINE_IA32 IMAGE_FILE_MACHINE_I386\r
f7496d71 49#define EFI_IMAGE_MACHINE_EBC IMAGE_FILE_MACHINE_EBC\r
30fdf114
LG
50#define EFI_IMAGE_MACHINE_X64 IMAGE_FILE_MACHINE_X64\r
51#define EFI_IMAGE_MACHINE_ARMT IMAGE_FILE_MACHINE_ARMT\r
4afd3d04 52#define EFI_IMAGE_MACHINE_AARCH64 IMAGE_FILE_MACHINE_ARM64\r
30fdf114
LG
53\r
54#define EFI_IMAGE_DOS_SIGNATURE 0x5A4D // MZ\r
55#define EFI_IMAGE_OS2_SIGNATURE 0x454E // NE\r
56#define EFI_IMAGE_OS2_SIGNATURE_LE 0x454C // LE\r
57#define EFI_IMAGE_NT_SIGNATURE 0x00004550 // PE00\r
58#define EFI_IMAGE_EDOS_SIGNATURE 0x44454550 // PEED\r
59\r
60///\r
61/// PE images can start with an optional DOS header, so if an image is run\r
62/// under DOS it can print an error message.\r
63///\r
64typedef struct {\r
65 UINT16 e_magic; // Magic number\r
66 UINT16 e_cblp; // Bytes on last page of file\r
67 UINT16 e_cp; // Pages in file\r
68 UINT16 e_crlc; // Relocations\r
69 UINT16 e_cparhdr; // Size of header in paragraphs\r
70 UINT16 e_minalloc; // Minimum extra paragraphs needed\r
71 UINT16 e_maxalloc; // Maximum extra paragraphs needed\r
72 UINT16 e_ss; // Initial (relative) SS value\r
73 UINT16 e_sp; // Initial SP value\r
74 UINT16 e_csum; // Checksum\r
75 UINT16 e_ip; // Initial IP value\r
76 UINT16 e_cs; // Initial (relative) CS value\r
77 UINT16 e_lfarlc; // File address of relocation table\r
78 UINT16 e_ovno; // Overlay number\r
79 UINT16 e_res[4]; // Reserved words\r
80 UINT16 e_oemid; // OEM identifier (for e_oeminfo)\r
81 UINT16 e_oeminfo; // OEM information; e_oemid specific\r
82 UINT16 e_res2[10]; // Reserved words\r
83 UINT32 e_lfanew; // File address of new exe header\r
84} EFI_IMAGE_DOS_HEADER;\r
85\r
86///\r
87/// File header format.\r
88///\r
89typedef struct {\r
90 UINT16 Machine;\r
91 UINT16 NumberOfSections;\r
92 UINT32 TimeDateStamp;\r
93 UINT32 PointerToSymbolTable;\r
94 UINT32 NumberOfSymbols;\r
95 UINT16 SizeOfOptionalHeader;\r
96 UINT16 Characteristics;\r
97} EFI_IMAGE_FILE_HEADER;\r
98\r
99#define EFI_IMAGE_SIZEOF_FILE_HEADER 20\r
100\r
101#define EFI_IMAGE_FILE_RELOCS_STRIPPED 0x0001 // Relocation info stripped from file.\r
102#define EFI_IMAGE_FILE_EXECUTABLE_IMAGE 0x0002 // File is executable (i.e. no unresolved externel references).\r
103#define EFI_IMAGE_FILE_LINE_NUMS_STRIPPED 0x0004 // Line nunbers stripped from file.\r
104#define EFI_IMAGE_FILE_LOCAL_SYMS_STRIPPED 0x0008 // Local symbols stripped from file.\r
40d841f6 105#define EFI_IMAGE_FILE_LARGE_ADDRESS_AWARE 0x0020 // Supports addresses > 2-GB\r
30fdf114
LG
106#define EFI_IMAGE_FILE_BYTES_REVERSED_LO 0x0080 // Bytes of machine word are reversed.\r
107#define EFI_IMAGE_FILE_32BIT_MACHINE 0x0100 // 32 bit word machine.\r
108#define EFI_IMAGE_FILE_DEBUG_STRIPPED 0x0200 // Debugging info stripped from file in .DBG file\r
109#define EFI_IMAGE_FILE_SYSTEM 0x1000 // System File.\r
110#define EFI_IMAGE_FILE_DLL 0x2000 // File is a DLL.\r
111#define EFI_IMAGE_FILE_BYTES_REVERSED_HI 0x8000 // Bytes of machine word are reversed.\r
112#define EFI_IMAGE_FILE_MACHINE_UNKNOWN 0\r
113#define EFI_IMAGE_FILE_MACHINE_I386 0x14c // Intel 386.\r
114#define EFI_IMAGE_FILE_MACHINE_R3000 0x162 // MIPS* little-endian, 0540 big-endian\r
115#define EFI_IMAGE_FILE_MACHINE_R4000 0x166 // MIPS* little-endian\r
116#define EFI_IMAGE_FILE_MACHINE_ALPHA 0x184 // Alpha_AXP*\r
117#define EFI_IMAGE_FILE_MACHINE_POWERPC 0x1F0 // IBM* PowerPC Little-Endian\r
118#define EFI_IMAGE_FILE_MACHINE_TAHOE 0x7cc // Intel EM machine\r
119//\r
120// * Other names and brands may be claimed as the property of others.\r
121//\r
122\r
123///\r
124/// Directory format.\r
125///\r
126typedef struct {\r
127 UINT32 VirtualAddress;\r
128 UINT32 Size;\r
129} EFI_IMAGE_DATA_DIRECTORY;\r
130\r
131#define EFI_IMAGE_NUMBER_OF_DIRECTORY_ENTRIES 16\r
132\r
133typedef struct {\r
134 UINT16 Magic;\r
135 UINT8 MajorLinkerVersion;\r
136 UINT8 MinorLinkerVersion;\r
137 UINT32 SizeOfCode;\r
138 UINT32 SizeOfInitializedData;\r
139 UINT32 SizeOfUninitializedData;\r
140 UINT32 AddressOfEntryPoint;\r
141 UINT32 BaseOfCode;\r
142 UINT32 BaseOfData;\r
143 UINT32 BaseOfBss;\r
144 UINT32 GprMask;\r
145 UINT32 CprMask[4];\r
146 UINT32 GpValue;\r
147} EFI_IMAGE_ROM_OPTIONAL_HEADER;\r
148\r
149#define EFI_IMAGE_ROM_OPTIONAL_HDR_MAGIC 0x107\r
150#define EFI_IMAGE_SIZEOF_ROM_OPTIONAL_HEADER sizeof (EFI_IMAGE_ROM_OPTIONAL_HEADER)\r
151\r
152typedef struct {\r
153 EFI_IMAGE_FILE_HEADER FileHeader;\r
154 EFI_IMAGE_ROM_OPTIONAL_HEADER OptionalHeader;\r
155} EFI_IMAGE_ROM_HEADERS;\r
156\r
157///\r
158/// @attention\r
159/// EFI_IMAGE_OPTIONAL_HEADER32 and EFI_IMAGE_OPTIONAL_HEADER64\r
160/// are for use ONLY by tools. All proper EFI code MUST use\r
161/// EFI_IMAGE_OPTIONAL_HEADER ONLY!!!\r
162///\r
163#define EFI_IMAGE_NT_OPTIONAL_HDR32_MAGIC 0x10b\r
164\r
165typedef struct {\r
166 //\r
167 // Standard fields.\r
168 //\r
169 UINT16 Magic;\r
170 UINT8 MajorLinkerVersion;\r
171 UINT8 MinorLinkerVersion;\r
172 UINT32 SizeOfCode;\r
173 UINT32 SizeOfInitializedData;\r
174 UINT32 SizeOfUninitializedData;\r
175 UINT32 AddressOfEntryPoint;\r
176 UINT32 BaseOfCode;\r
177 UINT32 BaseOfData;\r
178 //\r
179 // NT additional fields.\r
180 //\r
181 UINT32 ImageBase;\r
182 UINT32 SectionAlignment;\r
183 UINT32 FileAlignment;\r
184 UINT16 MajorOperatingSystemVersion;\r
185 UINT16 MinorOperatingSystemVersion;\r
186 UINT16 MajorImageVersion;\r
187 UINT16 MinorImageVersion;\r
188 UINT16 MajorSubsystemVersion;\r
189 UINT16 MinorSubsystemVersion;\r
190 UINT32 Win32VersionValue;\r
191 UINT32 SizeOfImage;\r
192 UINT32 SizeOfHeaders;\r
193 UINT32 CheckSum;\r
194 UINT16 Subsystem;\r
195 UINT16 DllCharacteristics;\r
196 UINT32 SizeOfStackReserve;\r
197 UINT32 SizeOfStackCommit;\r
198 UINT32 SizeOfHeapReserve;\r
199 UINT32 SizeOfHeapCommit;\r
200 UINT32 LoaderFlags;\r
201 UINT32 NumberOfRvaAndSizes;\r
202 EFI_IMAGE_DATA_DIRECTORY DataDirectory[EFI_IMAGE_NUMBER_OF_DIRECTORY_ENTRIES];\r
203} EFI_IMAGE_OPTIONAL_HEADER32;\r
204\r
205///\r
206/// @attention\r
207/// EFI_IMAGE_OPTIONAL_HEADER32 and EFI_IMAGE_OPTIONAL_HEADER64\r
208/// are for use ONLY by tools. All proper EFI code MUST use\r
209/// EFI_IMAGE_OPTIONAL_HEADER ONLY!!!\r
210///\r
211#define EFI_IMAGE_NT_OPTIONAL_HDR64_MAGIC 0x20b\r
212\r
213typedef struct {\r
214 //\r
215 // Standard fields.\r
216 //\r
217 UINT16 Magic;\r
218 UINT8 MajorLinkerVersion;\r
219 UINT8 MinorLinkerVersion;\r
220 UINT32 SizeOfCode;\r
221 UINT32 SizeOfInitializedData;\r
222 UINT32 SizeOfUninitializedData;\r
223 UINT32 AddressOfEntryPoint;\r
224 UINT32 BaseOfCode;\r
225 //\r
226 // NT additional fields.\r
227 //\r
228 UINT64 ImageBase;\r
229 UINT32 SectionAlignment;\r
230 UINT32 FileAlignment;\r
231 UINT16 MajorOperatingSystemVersion;\r
232 UINT16 MinorOperatingSystemVersion;\r
233 UINT16 MajorImageVersion;\r
234 UINT16 MinorImageVersion;\r
235 UINT16 MajorSubsystemVersion;\r
236 UINT16 MinorSubsystemVersion;\r
237 UINT32 Win32VersionValue;\r
238 UINT32 SizeOfImage;\r
239 UINT32 SizeOfHeaders;\r
240 UINT32 CheckSum;\r
241 UINT16 Subsystem;\r
242 UINT16 DllCharacteristics;\r
243 UINT64 SizeOfStackReserve;\r
244 UINT64 SizeOfStackCommit;\r
245 UINT64 SizeOfHeapReserve;\r
246 UINT64 SizeOfHeapCommit;\r
247 UINT32 LoaderFlags;\r
248 UINT32 NumberOfRvaAndSizes;\r
249 EFI_IMAGE_DATA_DIRECTORY DataDirectory[EFI_IMAGE_NUMBER_OF_DIRECTORY_ENTRIES];\r
250} EFI_IMAGE_OPTIONAL_HEADER64;\r
251\r
252///\r
253/// @attention\r
254/// EFI_IMAGE_NT_HEADERS32 and EFI_IMAGE_HEADERS64 are for use ONLY\r
255/// by tools. All proper EFI code MUST use EFI_IMAGE_NT_HEADERS ONLY!!!\r
256///\r
257typedef struct {\r
258 UINT32 Signature;\r
259 EFI_IMAGE_FILE_HEADER FileHeader;\r
260 EFI_IMAGE_OPTIONAL_HEADER32 OptionalHeader;\r
261} EFI_IMAGE_NT_HEADERS32;\r
262\r
263#define EFI_IMAGE_SIZEOF_NT_OPTIONAL32_HEADER sizeof (EFI_IMAGE_NT_HEADERS32)\r
264\r
265typedef struct {\r
266 UINT32 Signature;\r
267 EFI_IMAGE_FILE_HEADER FileHeader;\r
268 EFI_IMAGE_OPTIONAL_HEADER64 OptionalHeader;\r
269} EFI_IMAGE_NT_HEADERS64;\r
270\r
271#define EFI_IMAGE_SIZEOF_NT_OPTIONAL64_HEADER sizeof (EFI_IMAGE_NT_HEADERS64)\r
272\r
273//\r
274// Subsystem Values\r
275//\r
276#define EFI_IMAGE_SUBSYSTEM_UNKNOWN 0\r
277#define EFI_IMAGE_SUBSYSTEM_NATIVE 1\r
278#define EFI_IMAGE_SUBSYSTEM_WINDOWS_GUI 2\r
279#define EFI_IMAGE_SUBSYSTEM_WINDOWS_CUI 3.\r
280#define EFI_IMAGE_SUBSYSTEM_OS2_CUI 5\r
281#define EFI_IMAGE_SUBSYSTEM_POSIX_CUI 7\r
282\r
283//\r
284// Directory Entries\r
285//\r
286#define EFI_IMAGE_DIRECTORY_ENTRY_EXPORT 0\r
287#define EFI_IMAGE_DIRECTORY_ENTRY_IMPORT 1\r
288#define EFI_IMAGE_DIRECTORY_ENTRY_RESOURCE 2\r
289#define EFI_IMAGE_DIRECTORY_ENTRY_EXCEPTION 3\r
290#define EFI_IMAGE_DIRECTORY_ENTRY_SECURITY 4\r
291#define EFI_IMAGE_DIRECTORY_ENTRY_BASERELOC 5\r
292#define EFI_IMAGE_DIRECTORY_ENTRY_DEBUG 6\r
293#define EFI_IMAGE_DIRECTORY_ENTRY_COPYRIGHT 7\r
294#define EFI_IMAGE_DIRECTORY_ENTRY_GLOBALPTR 8\r
295#define EFI_IMAGE_DIRECTORY_ENTRY_TLS 9\r
296#define EFI_IMAGE_DIRECTORY_ENTRY_LOAD_CONFIG 10\r
297\r
298//\r
299// Section header format.\r
300//\r
301#define EFI_IMAGE_SIZEOF_SHORT_NAME 8\r
302\r
303typedef struct {\r
304 UINT8 Name[EFI_IMAGE_SIZEOF_SHORT_NAME];\r
305 union {\r
306 UINT32 PhysicalAddress;\r
307 UINT32 VirtualSize;\r
308 } Misc;\r
309 UINT32 VirtualAddress;\r
310 UINT32 SizeOfRawData;\r
311 UINT32 PointerToRawData;\r
312 UINT32 PointerToRelocations;\r
313 UINT32 PointerToLinenumbers;\r
314 UINT16 NumberOfRelocations;\r
315 UINT16 NumberOfLinenumbers;\r
316 UINT32 Characteristics;\r
317} EFI_IMAGE_SECTION_HEADER;\r
318\r
319#define EFI_IMAGE_SIZEOF_SECTION_HEADER 40\r
320\r
321#define EFI_IMAGE_SCN_TYPE_NO_PAD 0x00000008 // Reserved.\r
322#define EFI_IMAGE_SCN_CNT_CODE 0x00000020\r
323#define EFI_IMAGE_SCN_CNT_INITIALIZED_DATA 0x00000040\r
324#define EFI_IMAGE_SCN_CNT_UNINITIALIZED_DATA 0x00000080\r
325\r
326#define EFI_IMAGE_SCN_LNK_OTHER 0x00000100 // Reserved.\r
327#define EFI_IMAGE_SCN_LNK_INFO 0x00000200 // Section contains comments or some other type of information.\r
328#define EFI_IMAGE_SCN_LNK_REMOVE 0x00000800 // Section contents will not become part of image.\r
329#define EFI_IMAGE_SCN_LNK_COMDAT 0x00001000\r
330\r
331#define EFI_IMAGE_SCN_ALIGN_1BYTES 0x00100000\r
332#define EFI_IMAGE_SCN_ALIGN_2BYTES 0x00200000\r
333#define EFI_IMAGE_SCN_ALIGN_4BYTES 0x00300000\r
334#define EFI_IMAGE_SCN_ALIGN_8BYTES 0x00400000\r
335#define EFI_IMAGE_SCN_ALIGN_16BYTES 0x00500000\r
336#define EFI_IMAGE_SCN_ALIGN_32BYTES 0x00600000\r
337#define EFI_IMAGE_SCN_ALIGN_64BYTES 0x00700000\r
338\r
339#define EFI_IMAGE_SCN_MEM_DISCARDABLE 0x02000000\r
340#define EFI_IMAGE_SCN_MEM_NOT_CACHED 0x04000000\r
341#define EFI_IMAGE_SCN_MEM_NOT_PAGED 0x08000000\r
342#define EFI_IMAGE_SCN_MEM_SHARED 0x10000000\r
343#define EFI_IMAGE_SCN_MEM_EXECUTE 0x20000000\r
344#define EFI_IMAGE_SCN_MEM_READ 0x40000000\r
345#define EFI_IMAGE_SCN_MEM_WRITE 0x80000000\r
346\r
347///\r
348/// Symbol format.\r
349///\r
350#define EFI_IMAGE_SIZEOF_SYMBOL 18\r
351\r
352//\r
353// Section values.\r
354//\r
355// Symbols have a section number of the section in which they are\r
356// defined. Otherwise, section numbers have the following meanings:\r
357//\r
358#define EFI_IMAGE_SYM_UNDEFINED (UINT16) 0 // Symbol is undefined or is common.\r
359#define EFI_IMAGE_SYM_ABSOLUTE (UINT16) -1 // Symbol is an absolute value.\r
360#define EFI_IMAGE_SYM_DEBUG (UINT16) -2 // Symbol is a special debug item.\r
361//\r
362// Type (fundamental) values.\r
363//\r
364#define EFI_IMAGE_SYM_TYPE_NULL 0 // no type.\r
365#define EFI_IMAGE_SYM_TYPE_VOID 1 //\r
366#define EFI_IMAGE_SYM_TYPE_CHAR 2 // type character.\r
367#define EFI_IMAGE_SYM_TYPE_SHORT 3 // type short integer.\r
368#define EFI_IMAGE_SYM_TYPE_INT 4\r
369#define EFI_IMAGE_SYM_TYPE_LONG 5\r
370#define EFI_IMAGE_SYM_TYPE_FLOAT 6\r
371#define EFI_IMAGE_SYM_TYPE_DOUBLE 7\r
372#define EFI_IMAGE_SYM_TYPE_STRUCT 8\r
373#define EFI_IMAGE_SYM_TYPE_UNION 9\r
374#define EFI_IMAGE_SYM_TYPE_ENUM 10 // enumeration.\r
375#define EFI_IMAGE_SYM_TYPE_MOE 11 // member of enumeration.\r
376#define EFI_IMAGE_SYM_TYPE_BYTE 12\r
377#define EFI_IMAGE_SYM_TYPE_WORD 13\r
378#define EFI_IMAGE_SYM_TYPE_UINT 14\r
379#define EFI_IMAGE_SYM_TYPE_DWORD 15\r
380\r
381//\r
382// Type (derived) values.\r
383//\r
384#define EFI_IMAGE_SYM_DTYPE_NULL 0 // no derived type.\r
385#define EFI_IMAGE_SYM_DTYPE_POINTER 1\r
386#define EFI_IMAGE_SYM_DTYPE_FUNCTION 2\r
387#define EFI_IMAGE_SYM_DTYPE_ARRAY 3\r
388\r
389//\r
390// Storage classes.\r
391//\r
392#define EFI_IMAGE_SYM_CLASS_END_OF_FUNCTION (UINT8) -1\r
393#define EFI_IMAGE_SYM_CLASS_NULL 0\r
394#define EFI_IMAGE_SYM_CLASS_AUTOMATIC 1\r
395#define EFI_IMAGE_SYM_CLASS_EXTERNAL 2\r
396#define EFI_IMAGE_SYM_CLASS_STATIC 3\r
397#define EFI_IMAGE_SYM_CLASS_REGISTER 4\r
398#define EFI_IMAGE_SYM_CLASS_EXTERNAL_DEF 5\r
399#define EFI_IMAGE_SYM_CLASS_LABEL 6\r
400#define EFI_IMAGE_SYM_CLASS_UNDEFINED_LABEL 7\r
401#define EFI_IMAGE_SYM_CLASS_MEMBER_OF_STRUCT 8\r
402#define EFI_IMAGE_SYM_CLASS_ARGUMENT 9\r
403#define EFI_IMAGE_SYM_CLASS_STRUCT_TAG 10\r
404#define EFI_IMAGE_SYM_CLASS_MEMBER_OF_UNION 11\r
405#define EFI_IMAGE_SYM_CLASS_UNION_TAG 12\r
406#define EFI_IMAGE_SYM_CLASS_TYPE_DEFINITION 13\r
407#define EFI_IMAGE_SYM_CLASS_UNDEFINED_STATIC 14\r
408#define EFI_IMAGE_SYM_CLASS_ENUM_TAG 15\r
409#define EFI_IMAGE_SYM_CLASS_MEMBER_OF_ENUM 16\r
410#define EFI_IMAGE_SYM_CLASS_REGISTER_PARAM 17\r
411#define EFI_IMAGE_SYM_CLASS_BIT_FIELD 18\r
412#define EFI_IMAGE_SYM_CLASS_BLOCK 100\r
413#define EFI_IMAGE_SYM_CLASS_FUNCTION 101\r
414#define EFI_IMAGE_SYM_CLASS_END_OF_STRUCT 102\r
415#define EFI_IMAGE_SYM_CLASS_FILE 103\r
416#define EFI_IMAGE_SYM_CLASS_SECTION 104\r
417#define EFI_IMAGE_SYM_CLASS_WEAK_EXTERNAL 105\r
418\r
419//\r
420// type packing constants\r
421//\r
422#define EFI_IMAGE_N_BTMASK 017\r
423#define EFI_IMAGE_N_TMASK 060\r
424#define EFI_IMAGE_N_TMASK1 0300\r
425#define EFI_IMAGE_N_TMASK2 0360\r
426#define EFI_IMAGE_N_BTSHFT 4\r
427#define EFI_IMAGE_N_TSHIFT 2\r
428\r
429//\r
430// Communal selection types.\r
431//\r
432#define EFI_IMAGE_COMDAT_SELECT_NODUPLICATES 1\r
433#define EFI_IMAGE_COMDAT_SELECT_ANY 2\r
434#define EFI_IMAGE_COMDAT_SELECT_SAME_SIZE 3\r
435#define EFI_IMAGE_COMDAT_SELECT_EXACT_MATCH 4\r
436#define EFI_IMAGE_COMDAT_SELECT_ASSOCIATIVE 5\r
437\r
438#define EFI_IMAGE_WEAK_EXTERN_SEARCH_NOLIBRARY 1\r
439#define EFI_IMAGE_WEAK_EXTERN_SEARCH_LIBRARY 2\r
440#define EFI_IMAGE_WEAK_EXTERN_SEARCH_ALIAS 3\r
441\r
442///\r
443/// Relocation format.\r
444///\r
445typedef struct {\r
446 UINT32 VirtualAddress;\r
447 UINT32 SymbolTableIndex;\r
448 UINT16 Type;\r
449} EFI_IMAGE_RELOCATION;\r
450\r
451#define EFI_IMAGE_SIZEOF_RELOCATION 10\r
452\r
453//\r
454// I386 relocation types.\r
455//\r
456#define EFI_IMAGE_REL_I386_ABSOLUTE 0 // Reference is absolute, no relocation is necessary\r
457#define EFI_IMAGE_REL_I386_DIR16 01 // Direct 16-bit reference to the symbols virtual address\r
458#define EFI_IMAGE_REL_I386_REL16 02 // PC-relative 16-bit reference to the symbols virtual address\r
459#define EFI_IMAGE_REL_I386_DIR32 06 // Direct 32-bit reference to the symbols virtual address\r
460#define EFI_IMAGE_REL_I386_DIR32NB 07 // Direct 32-bit reference to the symbols virtual address, base not included\r
461#define EFI_IMAGE_REL_I386_SEG12 09 // Direct 16-bit reference to the segment-selector bits of a 32-bit virtual address\r
462#define EFI_IMAGE_REL_I386_SECTION 010\r
463#define EFI_IMAGE_REL_I386_SECREL 011\r
464#define EFI_IMAGE_REL_I386_REL32 020 // PC-relative 32-bit reference to the symbols virtual address\r
465\r
466//\r
467// x64 processor relocation types.\r
468//\r
f7496d71
LG
469#define IMAGE_REL_AMD64_ABSOLUTE 0x0000\r
470#define IMAGE_REL_AMD64_ADDR64 0x0001\r
471#define IMAGE_REL_AMD64_ADDR32 0x0002\r
472#define IMAGE_REL_AMD64_ADDR32NB 0x0003\r
473#define IMAGE_REL_AMD64_REL32 0x0004\r
474#define IMAGE_REL_AMD64_REL32_1 0x0005\r
475#define IMAGE_REL_AMD64_REL32_2 0x0006\r
476#define IMAGE_REL_AMD64_REL32_3 0x0007\r
477#define IMAGE_REL_AMD64_REL32_4 0x0008\r
478#define IMAGE_REL_AMD64_REL32_5 0x0009\r
479#define IMAGE_REL_AMD64_SECTION 0x000A\r
480#define IMAGE_REL_AMD64_SECREL 0x000B\r
481#define IMAGE_REL_AMD64_SECREL7 0x000C\r
482#define IMAGE_REL_AMD64_TOKEN 0x000D\r
483#define IMAGE_REL_AMD64_SREL32 0x000E\r
484#define IMAGE_REL_AMD64_PAIR 0x000F\r
485#define IMAGE_REL_AMD64_SSPAN32 0x0010\r
30fdf114
LG
486\r
487///\r
488/// Based relocation format.\r
489///\r
490typedef struct {\r
491 UINT32 VirtualAddress;\r
492 UINT32 SizeOfBlock;\r
493} EFI_IMAGE_BASE_RELOCATION;\r
494\r
495#define EFI_IMAGE_SIZEOF_BASE_RELOCATION 8\r
496\r
497//\r
498// Based relocation types.\r
499//\r
500#define EFI_IMAGE_REL_BASED_ABSOLUTE 0\r
501#define EFI_IMAGE_REL_BASED_HIGH 1\r
502#define EFI_IMAGE_REL_BASED_LOW 2\r
503#define EFI_IMAGE_REL_BASED_HIGHLOW 3\r
504#define EFI_IMAGE_REL_BASED_HIGHADJ 4\r
505#define EFI_IMAGE_REL_BASED_MIPS_JMPADDR 5\r
08dd311f
LG
506#define EFI_IMAGE_REL_BASED_ARM_MOV32A 5\r
507#define EFI_IMAGE_REL_BASED_ARM_MOV32T 7\r
30fdf114
LG
508#define EFI_IMAGE_REL_BASED_IA64_IMM64 9\r
509#define EFI_IMAGE_REL_BASED_DIR64 10\r
510\r
40d841f6 511\r
30fdf114
LG
512///\r
513/// Line number format.\r
514///\r
515typedef struct {\r
516 union {\r
517 UINT32 SymbolTableIndex; // Symbol table index of function name if Linenumber is 0.\r
518 UINT32 VirtualAddress; // Virtual address of line number.\r
519 } Type;\r
520 UINT16 Linenumber; // Line number.\r
521} EFI_IMAGE_LINENUMBER;\r
522\r
523#define EFI_IMAGE_SIZEOF_LINENUMBER 6\r
524\r
525//\r
526// Archive format.\r
527//\r
528#define EFI_IMAGE_ARCHIVE_START_SIZE 8\r
529#define EFI_IMAGE_ARCHIVE_START "!<arch>\n"\r
530#define EFI_IMAGE_ARCHIVE_END "`\n"\r
531#define EFI_IMAGE_ARCHIVE_PAD "\n"\r
532#define EFI_IMAGE_ARCHIVE_LINKER_MEMBER "/ "\r
533#define EFI_IMAGE_ARCHIVE_LONGNAMES_MEMBER "// "\r
534\r
535typedef struct {\r
536 UINT8 Name[16]; // File member name - `/' terminated.\r
537 UINT8 Date[12]; // File member date - decimal.\r
538 UINT8 UserID[6]; // File member user id - decimal.\r
539 UINT8 GroupID[6]; // File member group id - decimal.\r
540 UINT8 Mode[8]; // File member mode - octal.\r
541 UINT8 Size[10]; // File member size - decimal.\r
542 UINT8 EndHeader[2]; // String to end header.\r
543} EFI_IMAGE_ARCHIVE_MEMBER_HEADER;\r
544\r
545#define EFI_IMAGE_SIZEOF_ARCHIVE_MEMBER_HDR 60\r
546\r
547//\r
548// DLL support.\r
549//\r
550\r
551///\r
552/// DLL Export Format\r
553///\r
554typedef struct {\r
555 UINT32 Characteristics;\r
556 UINT32 TimeDateStamp;\r
557 UINT16 MajorVersion;\r
558 UINT16 MinorVersion;\r
559 UINT32 Name;\r
560 UINT32 Base;\r
561 UINT32 NumberOfFunctions;\r
562 UINT32 NumberOfNames;\r
563 UINT32 AddressOfFunctions;\r
564 UINT32 AddressOfNames;\r
565 UINT32 AddressOfNameOrdinals;\r
566} EFI_IMAGE_EXPORT_DIRECTORY;\r
567\r
568///\r
569/// DLL support.\r
570/// Import Format\r
571///\r
572typedef struct {\r
573 UINT16 Hint;\r
574 UINT8 Name[1];\r
575} EFI_IMAGE_IMPORT_BY_NAME;\r
576\r
577typedef struct {\r
578 union {\r
579 UINT32 Function;\r
580 UINT32 Ordinal;\r
581 EFI_IMAGE_IMPORT_BY_NAME *AddressOfData;\r
582 } u1;\r
583} EFI_IMAGE_THUNK_DATA;\r
584\r
585#define EFI_IMAGE_ORDINAL_FLAG 0x80000000\r
586#define EFI_IMAGE_SNAP_BY_ORDINAL(Ordinal) ((Ordinal & EFI_IMAGE_ORDINAL_FLAG) != 0)\r
587#define EFI_IMAGE_ORDINAL(Ordinal) (Ordinal & 0xffff)\r
588\r
589typedef struct {\r
590 UINT32 Characteristics;\r
591 UINT32 TimeDateStamp;\r
592 UINT32 ForwarderChain;\r
593 UINT32 Name;\r
594 EFI_IMAGE_THUNK_DATA *FirstThunk;\r
595} EFI_IMAGE_IMPORT_DESCRIPTOR;\r
596\r
597///\r
598/// Debug Format\r
599///\r
600#define EFI_IMAGE_DEBUG_TYPE_CODEVIEW 2\r
601\r
602typedef struct {\r
603 UINT32 Characteristics;\r
604 UINT32 TimeDateStamp;\r
605 UINT16 MajorVersion;\r
606 UINT16 MinorVersion;\r
607 UINT32 Type;\r
608 UINT32 SizeOfData;\r
609 UINT32 RVA;\r
610 UINT32 FileOffset;\r
611} EFI_IMAGE_DEBUG_DIRECTORY_ENTRY;\r
612\r
613#define CODEVIEW_SIGNATURE_NB10 0x3031424E // "NB10"\r
614typedef struct {\r
615 UINT32 Signature; // "NB10"\r
616 UINT32 Unknown;\r
617 UINT32 Unknown2;\r
618 UINT32 Unknown3;\r
619 //\r
620 // Filename of .PDB goes here\r
621 //\r
622} EFI_IMAGE_DEBUG_CODEVIEW_NB10_ENTRY;\r
623\r
624#define CODEVIEW_SIGNATURE_RSDS 0x53445352 // "RSDS"\r
625typedef struct {\r
626 UINT32 Signature; // "RSDS"\r
627 UINT32 Unknown;\r
628 UINT32 Unknown2;\r
629 UINT32 Unknown3;\r
630 UINT32 Unknown4;\r
631 UINT32 Unknown5;\r
632 //\r
633 // Filename of .PDB goes here\r
634 //\r
635} EFI_IMAGE_DEBUG_CODEVIEW_RSDS_ENTRY;\r
636\r
a709adfa
LG
637///\r
638/// Debug Data Structure defined by Apple Mach-O to Coff utility\r
639///\r
2bc3256c 640#define CODEVIEW_SIGNATURE_MTOC SIGNATURE_32('M', 'T', 'O', 'C')\r
a709adfa
LG
641typedef struct {\r
642 UINT32 Signature; ///< "MTOC"\r
643 EFI_GUID MachOUuid;\r
644 //\r
645 // Filename of .DLL (Mach-O with debug info) goes here\r
646 //\r
647} EFI_IMAGE_DEBUG_CODEVIEW_MTOC_ENTRY;\r
648\r
30fdf114
LG
649//\r
650// .pdata entries for X64\r
651//\r
652typedef struct {\r
653 UINT32 FunctionStartAddress;\r
654 UINT32 FunctionEndAddress;\r
655 UINT32 UnwindInfoAddress;\r
656} RUNTIME_FUNCTION;\r
657\r
658typedef struct {\r
659 UINT8 Version:3;\r
660 UINT8 Flags:5;\r
661 UINT8 SizeOfProlog;\r
662 UINT8 CountOfUnwindCodes;\r
663 UINT8 FrameRegister:4;\r
664 UINT8 FrameRegisterOffset:4;\r
665} UNWIND_INFO;\r
666\r
b303ea72
LG
667///\r
668/// Resource format.\r
669///\r
670typedef struct {\r
671 UINT32 Characteristics;\r
672 UINT32 TimeDateStamp;\r
673 UINT16 MajorVersion;\r
674 UINT16 MinorVersion;\r
675 UINT16 NumberOfNamedEntries;\r
676 UINT16 NumberOfIdEntries;\r
677 //\r
678 // Array of EFI_IMAGE_RESOURCE_DIRECTORY_ENTRY entries goes here.\r
679 //\r
680} EFI_IMAGE_RESOURCE_DIRECTORY;\r
681\r
682///\r
683/// Resource directory entry format.\r
684///\r
685typedef struct {\r
686 union {\r
687 struct {\r
688 UINT32 NameOffset:31;\r
689 UINT32 NameIsString:1;\r
690 } s;\r
691 UINT32 Id;\r
692 } u1;\r
693 union {\r
694 UINT32 OffsetToData;\r
695 struct {\r
696 UINT32 OffsetToDirectory:31;\r
697 UINT32 DataIsDirectory:1;\r
698 } s;\r
699 } u2;\r
700} EFI_IMAGE_RESOURCE_DIRECTORY_ENTRY;\r
701\r
702///\r
703/// Resource directory entry for string.\r
704///\r
705typedef struct {\r
706 UINT16 Length;\r
707 CHAR16 String[1];\r
708} EFI_IMAGE_RESOURCE_DIRECTORY_STRING;\r
709\r
710///\r
711/// Resource directory entry for data array.\r
712///\r
713typedef struct {\r
714 UINT32 OffsetToData;\r
715 UINT32 Size;\r
716 UINT32 CodePage;\r
717 UINT32 Reserved;\r
718} EFI_IMAGE_RESOURCE_DATA_ENTRY;\r
719\r
30fdf114
LG
720///\r
721/// Header format for TE images\r
722///\r
723typedef struct {\r
724 UINT16 Signature; // signature for TE format = "VZ"\r
725 UINT16 Machine; // from the original file header\r
726 UINT8 NumberOfSections; // from the original file header\r
727 UINT8 Subsystem; // from original optional header\r
728 UINT16 StrippedSize; // how many bytes we removed from the header\r
729 UINT32 AddressOfEntryPoint; // offset to entry point -- from original optional header\r
730 UINT32 BaseOfCode; // from original image -- required for ITP debug\r
731 UINT64 ImageBase; // from original file header\r
732 EFI_IMAGE_DATA_DIRECTORY DataDirectory[2]; // only base relocation and debug directory\r
733} EFI_TE_IMAGE_HEADER;\r
734\r
735#define EFI_TE_IMAGE_HEADER_SIGNATURE 0x5A56 // "VZ"\r
736\r
737//\r
738// Data directory indexes in our TE image header\r
739//\r
740#define EFI_TE_IMAGE_DIRECTORY_ENTRY_BASERELOC 0\r
741#define EFI_TE_IMAGE_DIRECTORY_ENTRY_DEBUG 1\r
742\r
743\r
744//\r
745// Union of PE32, PE32+, and TE headers\r
746//\r
747typedef union {\r
748 EFI_IMAGE_NT_HEADERS32 Pe32;\r
749 EFI_IMAGE_NT_HEADERS64 Pe32Plus;\r
750 EFI_TE_IMAGE_HEADER Te;\r
751} EFI_IMAGE_OPTIONAL_HEADER_UNION;\r
752\r
753typedef union {\r
754 EFI_IMAGE_NT_HEADERS32 *Pe32;\r
755 EFI_IMAGE_NT_HEADERS64 *Pe32Plus;\r
756 EFI_TE_IMAGE_HEADER *Te;\r
757 EFI_IMAGE_OPTIONAL_HEADER_UNION *Union;\r
758} EFI_IMAGE_OPTIONAL_HEADER_PTR_UNION;\r
759\r
760#endif\r