1 #ifndef EFI_WRAPPER_H
2 #define EFI_WRAPPER_H
3 
4 #define MSDOS_SIGNATURE	0x5a4d
5 #define PE_SIGNATURE	0x4550
6 #define PE32_FORMAT	0x10b
7 #define PE32P_FORMAT	0x20b	/* PE32+ */
8 
9 #define IMAGE_FILE_MACHINE_I386			0x14c
10 #define IMAGE_FILE_MACHINE_X86_64		0x8664
11 #define IMAGE_FILE_EXECUTABLE_IMAGE		0x0002
12 #define IMAGE_FILE_LINE_NUMBERS_STRIPPED	0x0004
13 #define IMAGE_FILE_32BIT_MACHINE		0x0100
14 #define IMAGE_FILE_DEBUG_STRIPPED		0x0200
15 
16 #define IMAGE_SUBSYSTEM_EFI_APPLICATION		0x0a
17 
18 #define IMAGE_SCN_CNT_CODE		0x00000020
19 #define IMAGE_SCN_CNT_INITIALIZED_DATA	0x00000040
20 #define IMAGE_SCN_ALIGN_1BYTES		0x00100000
21 #define IMAGE_SCN_ALIGN_16BYTES		0x00500000
22 #define IMAGE_SCN_MEM_DISCARDABLE	0x02000000
23 #define IMAGE_SCN_MEM_EXECUTE		0x20000000
24 #define IMAGE_SCN_MEM_READ		0x40000000
25 
26 #define __packed	__attribute__((packed))
27 #define OFFSETOF(t,m)	((size_t)&((t *)0)->m)
28 
29 struct header {
30 	__uint16_t msdos_signature;
31 	__uint8_t _pad1[0x16];
32 	__uint16_t relocs_ptr;
33 	__uint8_t __pad2[0x3c - 0x1a];
34 	__uint32_t pe_hdr;
35 	__uint16_t pe_signature;
36 	__uint16_t _pad2;
37 } __packed;
38 
39 /* FIXME: when setting up coff_hdr, set up optional_hdr_sz
40  * based on PE32 or PE32+ format
41  */
42 /*
43  * COFF header
44  */
45 struct coff_hdr {
46 	__uint16_t arch;
47 	__uint16_t nr_sections;
48 	__uint32_t timedatestamp;
49 	__uint32_t symtab;
50 	__uint32_t nr_syms;
51 	__uint16_t optional_hdr_sz;
52 	__uint16_t characteristics;
53 } __packed;
54 
55 struct optional_hdr {
56 	__uint16_t format;
57 	__uint8_t major_linker_version;
58 	__uint8_t minor_linker_version;
59 	__uint32_t code_sz;
60 	__uint32_t initialized_data_sz;
61 	__uint32_t uninitialized_data_sz;
62 	__uint32_t entry_point;
63 	__uint32_t base_code;
64 	__uint32_t data;
65 } __packed;
66 
67 /* For PE32+, the optional_header does NOT have
68  * data after base_code
69  */
70 struct optional_hdr_pe32p {
71 	__uint16_t format;
72 	__uint8_t major_linker_version;
73 	__uint8_t minor_linker_version;
74 	__uint32_t code_sz;
75 	__uint32_t initialized_data_sz;
76 	__uint32_t uninitialized_data_sz;
77 	__uint32_t entry_point;
78 	__uint32_t base_code;
79 } __packed;
80 /*
81  * Extra header fields
82  */
83 struct extra_hdr {
84 	__uint32_t image_base;
85 	__uint32_t section_align;
86 	__uint32_t file_align;
87 	__uint16_t major_os_version;
88 	__uint16_t minor_os_version;
89 	__uint16_t major_image_version;
90 	__uint16_t minor_image_version;
91 	__uint16_t major_subsystem_version;
92 	__uint16_t minor_subsystem_version;
93 	__uint32_t win32_version;
94 	__uint32_t image_sz;
95 	__uint32_t headers_sz;
96 	__uint32_t checksum;
97 	__uint16_t subsystem;
98 	__uint16_t dll_characteristics;
99 	__uint32_t stack_reserve_sz;
100 	__uint32_t stack_commit_sz;
101 	__uint32_t heap_reserve_sz;
102 	__uint32_t heap_commit_sz;
103 	__uint32_t loader_flags;
104 	__uint32_t rva_and_sizes_nr;
105 	struct {
106 		__uint64_t export_table;
107 		__uint64_t import_table;
108 		__uint64_t resource_table;
109 		__uint64_t exception_table;
110 		__uint64_t certification_table;
111 		__uint64_t base_relocation_table;
112 	} data_directory;
113 } __packed;
114 
115 /* Extra header for PE32+ format
116  * FIXME: There are additional fields in Microsoft PE COFF v8
117  */
118 
119 struct extra_hdr_pe32p {
120 	__uint64_t image_base;
121 	__uint32_t section_align;
122 	__uint32_t file_align;
123 	__uint16_t major_os_version;
124 	__uint16_t minor_os_version;
125 	__uint16_t major_image_version;
126 	__uint16_t minor_image_version;
127 	__uint16_t major_subsystem_version;
128 	__uint16_t minor_subsystem_version;
129 	__uint32_t win32_version;
130 	__uint32_t image_sz;
131 	__uint32_t headers_sz;
132 	__uint32_t checksum;
133 	__uint16_t subsystem;
134 	__uint16_t dll_characteristics;
135 	__uint64_t stack_reserve_sz;
136 	__uint64_t stack_commit_sz;
137 	__uint64_t heap_reserve_sz;
138 	__uint64_t heap_commit_sz;
139 	__uint32_t loader_flags;
140 	__uint32_t rva_and_sizes_nr;
141 	struct {
142 		__uint64_t export_table;
143 		__uint64_t import_table;
144 		__uint64_t resource_table;
145 		__uint64_t exception_table;
146 		__uint64_t certification_table;
147 		__uint64_t base_relocation_table;
148 	} data_directory;
149 } __packed;
150 
151 struct section {
152 	__uint8_t name[8];
153 	__uint32_t virtual_sz;
154 	__uint32_t virtual_address;
155 	__uint32_t raw_data_sz;
156 	__uint32_t raw_data;
157 	__uint32_t relocs;
158 	__uint32_t line_numbers;
159 	__uint16_t relocs_nr;
160 	__uint16_t line_numbers_nr;
161 	__uint32_t characteristics;
162 } __packed;
163 
164 struct coff_reloc {
165 	__uint32_t virtual_address;
166 	__uint32_t symtab_index;
167 	__uint16_t type;
168 };
169 
170 #endif /* EFI_WRAPPER_H */
171