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