summaryrefslogtreecommitdiff
path: root/util/mkelfImage/include/mkelfImage.h
diff options
context:
space:
mode:
Diffstat (limited to 'util/mkelfImage/include/mkelfImage.h')
-rw-r--r--util/mkelfImage/include/mkelfImage.h125
1 files changed, 125 insertions, 0 deletions
diff --git a/util/mkelfImage/include/mkelfImage.h b/util/mkelfImage/include/mkelfImage.h
new file mode 100644
index 0000000000..917f46e8c2
--- /dev/null
+++ b/util/mkelfImage/include/mkelfImage.h
@@ -0,0 +1,125 @@
+#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 */