#ifndef EFI_WRAPPER_H
#define EFI_WRAPPER_H
#define MSDOS_SIGNATURE 0x5a4d
#define PE_SIGNATURE 0x4550
#define PE32_FORMAT 0x10b
#define PE32P_FORMAT 0x20b /* PE32+ */
#define IMAGE_FILE_MACHINE_I386 0x14c
#define IMAGE_FILE_MACHINE_X86_64 0x8664
#define IMAGE_FILE_EXECUTABLE_IMAGE 0x0002
#define IMAGE_FILE_LINE_NUMBERS_STRIPPED 0x0004
#define IMAGE_FILE_32BIT_MACHINE 0x0100
#define IMAGE_FILE_DEBUG_STRIPPED 0x0200
#define IMAGE_SUBSYSTEM_EFI_APPLICATION 0x0a
#define IMAGE_SCN_CNT_CODE 0x00000020
#define IMAGE_SCN_CNT_INITIALIZED_DATA 0x00000040
#define IMAGE_SCN_ALIGN_1BYTES 0x00100000
#define IMAGE_SCN_ALIGN_16BYTES 0x00500000
#define IMAGE_SCN_MEM_DISCARDABLE 0x02000000
#define IMAGE_SCN_MEM_EXECUTE 0x20000000
#define IMAGE_SCN_MEM_READ 0x40000000
#define __packed __attribute__((packed))
#define OFFSETOF(t,m) ((size_t)&((t *)0)->m)
struct header {
__uint16_t msdos_signature;
__uint8_t _pad1[0x16];
__uint16_t relocs_ptr;
__uint8_t __pad2[0x3c - 0x1a];
__uint32_t pe_hdr;
__uint16_t pe_signature;
__uint16_t _pad2;
} __packed;
/* FIXME: when setting up coff_hdr, set up optional_hdr_sz
* based on PE32 or PE32+ format
*/
/*
* COFF header
*/
struct coff_hdr {
__uint16_t arch;
__uint16_t nr_sections;
__uint32_t timedatestamp;
__uint32_t symtab;
__uint32_t nr_syms;
__uint16_t optional_hdr_sz;
__uint16_t characteristics;
} __packed;
struct optional_hdr {
__uint16_t format;
__uint8_t major_linker_version;
__uint8_t minor_linker_version;
__uint32_t code_sz;
__uint32_t initialized_data_sz;
__uint32_t uninitialized_data_sz;
__uint32_t entry_point;
__uint32_t base_code;
__uint32_t data;
} __packed;
/* For PE32+, the optional_header does NOT have
* data after base_code
*/
struct optional_hdr_pe32p {
__uint16_t format;
__uint8_t major_linker_version;
__uint8_t minor_linker_version;
__uint32_t code_sz;
__uint32_t initialized_data_sz;
__uint32_t uninitialized_data_sz;
__uint32_t entry_point;
__uint32_t base_code;
} __packed;
/*
* Extra header fields
*/
struct extra_hdr {
__uint32_t image_base;
__uint32_t section_align;
__uint32_t file_align;
__uint16_t major_os_version;
__uint16_t minor_os_version;
__uint16_t major_image_version;
__uint16_t minor_image_version;
__uint16_t major_subsystem_version;
__uint16_t minor_subsystem_version;
__uint32_t win32_version;
__uint32_t image_sz;
__uint32_t headers_sz;
__uint32_t checksum;
__uint16_t subsystem;
__uint16_t dll_characteristics;
__uint32_t stack_reserve_sz;
__uint32_t stack_commit_sz;
__uint32_t heap_reserve_sz;
__uint32_t heap_commit_sz;
__uint32_t loader_flags;
__uint32_t rva_and_sizes_nr;
struct {
__uint64_t export_table;
__uint64_t import_table;
__uint64_t resource_table;
__uint64_t exception_table;
__uint64_t certification_table;
__uint64_t base_relocation_table;
} data_directory;
} __packed;
/* Extra header for PE32+ format
* FIXME: There are additional fields in Microsoft PE COFF v8
*/
struct extra_hdr_pe32p {
__uint64_t image_base;
__uint32_t section_align;
__uint32_t file_align;
__uint16_t major_os_version;
__uint16_t minor_os_version;
__uint16_t major_image_version;
__uint16_t minor_image_version;
__uint16_t major_subsystem_version;
__uint16_t minor_subsystem_version;
__uint32_t win32_version;
__uint32_t image_sz;
__uint32_t headers_sz;
__uint32_t checksum;
__uint16_t subsystem;
__uint16_t dll_characteristics;
__uint64_t stack_reserve_sz;
__uint64_t stack_commit_sz;
__uint64_t heap_reserve_sz;
__uint64_t heap_commit_sz;
__uint32_t loader_flags;
__uint32_t rva_and_sizes_nr;
struct {
__uint64_t export_table;
__uint64_t import_table;
__uint64_t resource_table;
__uint64_t exception_table;
__uint64_t certification_table;
__uint64_t base_relocation_table;
} data_directory;
} __packed;
struct section {
__uint8_t name[8];
__uint32_t virtual_sz;
__uint32_t virtual_address;
__uint32_t raw_data_sz;
__uint32_t raw_data;
__uint32_t relocs;
__uint32_t line_numbers;
__uint16_t relocs_nr;
__uint16_t line_numbers_nr;
__uint32_t characteristics;
} __packed;
struct coff_reloc {
__uint32_t virtual_address;
__uint32_t symtab_index;
__uint16_t type;
};
#endif /* EFI_WRAPPER_H */