| #ifndef MKELFIMAGE_H |
| #define MKELFIMAGE_H |
| |
| #include <sys/types.h> |
| #include <stdint.h> |
| #include <byteswap.h> |
| #define USE_BSD |
| #include <endian.h> |
| #define _GNU_SOURCE |
| |
| struct memelfheader; |
| struct memelfphdr; |
| struct memelfnote; |
| |
| extern void die(char *fmt, ...); |
| extern void usage(void); |
| extern void error(char *fmt, ...); |
| extern uint16_t ipchksum(const void *data, unsigned long length); |
| extern uint16_t add_ipchksums(unsigned long offset, uint16_t sum, uint16_t new); |
| extern void *xmalloc(size_t size, const char *name); |
| extern void *xrealloc(void *ptr, size_t size, const char *name); |
| extern char *slurp_file(const char *filename, off_t *r_size); |
| extern char *slurp_decompress_file(const char *filename, off_t *r_size); |
| extern struct memelfphdr *add_program_headers(struct memelfheader *ehdr, int count); |
| extern struct memelfnote *add_notes(struct memelfheader *ehdr, int count); |
| |
| typedef char *(probe_t)(char *kernel_buf, off_t kernel_size); |
| typedef int (mkelf_t)(int argc, char **argv, |
| struct memelfheader *hdr, char *kernel_buf, off_t kernel_size); |
| typedef void (usage_t)(void); |
| struct file_type { |
| const char *name; |
| probe_t *probe; |
| mkelf_t *mkelf; |
| usage_t *usage; |
| }; |
| |
| #if BYTE_ORDER == LITTLE_ENDIAN |
| #define cpu_to_le16(val) (val) |
| #define cpu_to_le32(val) (val) |
| #define cpu_to_le64(val) (val) |
| #define cpu_to_be16(val) bswap_16(val) |
| #define cpu_to_be32(val) bswap_32(val) |
| #define cpu_to_be64(val) bswap_64(val) |
| #define le16_to_cpu(val) (val) |
| #define le32_to_cpu(val) (val) |
| #define le64_to_cpu(val) (val) |
| #define be16_to_cpu(val) bswap_16(val) |
| #define be32_to_cpu(val) bswap_32(val) |
| #define be64_to_cpu(val) bswap_64(val) |
| #endif |
| #if BYTE_ORDER == BIG_ENDIAN |
| #define cpu_to_le16(val) bswap_16(val) |
| #define cpu_to_le32(val) bswap_32(val) |
| #define cpu_to_le64(val) bswap_64(val) |
| #define cpu_to_be16(val) (val) |
| #define cpu_to_be32(val) (val) |
| #define cpu_to_be64(val) (val) |
| #define le16_to_cpu(val) bswap_16(val) |
| #define le32_to_cpu(val) bswap_32(val) |
| #define le64_to_cpu(val) bswap_64(val) |
| #define be16_to_cpu(val) (val) |
| #define be32_to_cpu(val) (val) |
| #define be64_to_cpu(val) (val) |
| #endif |
| |
| #define roundup(x, y) ((((x)+((y)-1))/(y))*(y)) |
| |
| struct memelfheader { |
| unsigned ei_class; |
| unsigned ei_data; |
| unsigned e_type; |
| unsigned e_machine; |
| unsigned e_flags; |
| unsigned e_phnum; |
| unsigned e_notenum; |
| unsigned long e_entry; |
| struct memelfphdr *e_phdr; |
| struct memelfnote *e_notes; |
| }; |
| |
| struct memelfphdr { |
| uint64_t p_vaddr; |
| uint64_t p_paddr; |
| uint64_t p_filesz; |
| uint64_t p_memsz; |
| void *p_data; |
| unsigned p_type; |
| unsigned p_flags; |
| }; |
| |
| struct memelfnote { |
| unsigned n_type; |
| char *n_name; |
| void *n_desc; |
| unsigned n_descsz; |
| }; |
| |
| #define OPT_HELP 'h' |
| #define OPT_VERSION 'v' |
| #define OPT_TYPE 't' |
| #define OPT_KERNEL 256 |
| #define OPT_OUTPUT 257 |
| #define OPT_MAX 258 |
| |
| #define MKELF_OPTIONS \ |
| { "help", 0, 0, OPT_HELP }, \ |
| { "version", 0, 0, OPT_VERSION }, \ |
| { "kernel", 1, 0, OPT_KERNEL }, \ |
| { "output", 1, 0, OPT_OUTPUT }, \ |
| { "type", 1, 0, OPT_TYPE }, |
| |
| #define MKELF_OPT_STR "hvt:" |
| |
| extern probe_t vmlinux_i386_probe; |
| extern probe_t bzImage_i386_probe; |
| extern probe_t linux_i386_probe; |
| extern mkelf_t linux_i386_mkelf; |
| extern usage_t linux_i386_usage; |
| |
| extern probe_t linux_ia64_probe; |
| extern mkelf_t linux_ia64_mkelf; |
| extern usage_t linux_ia64_usage; |
| |
| #endif /* MKELFIMAGE_H */ |