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