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