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