aboutsummaryrefslogtreecommitdiffstats
path: root/roms/skiboot/include/elf.h
diff options
context:
space:
mode:
Diffstat (limited to 'roms/skiboot/include/elf.h')
-rw-r--r--roms/skiboot/include/elf.h232
1 files changed, 232 insertions, 0 deletions
diff --git a/roms/skiboot/include/elf.h b/roms/skiboot/include/elf.h
new file mode 100644
index 000000000..356c6f42f
--- /dev/null
+++ b/roms/skiboot/include/elf.h
@@ -0,0 +1,232 @@
+// SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later
+/* Copyright 2013-2015 IBM Corp. */
+
+#ifndef __ELF_H
+#define __ELF_H
+
+#include <stdint.h>
+#include <types.h>
+
+/* Generic ELF header */
+struct elf_hdr {
+ uint32_t ei_ident;
+#if HAVE_BIG_ENDIAN
+#define ELF_IDENT 0x7F454C46
+#else
+#define ELF_IDENT 0x464C457F
+#endif
+ uint8_t ei_class;
+#define ELF_CLASS_32 1
+#define ELF_CLASS_64 2
+ uint8_t ei_data;
+#define ELF_DATA_LSB 1
+#define ELF_DATA_MSB 2
+ uint8_t ei_version;
+ uint8_t ei_pad[9];
+};
+
+#define ELF_MACH_PPC32 0x14
+#define ELF_MACH_PPC64 0x15
+
+/* 64-bit ELF header */
+struct elf64be_hdr {
+ uint32_t ei_ident;
+ uint8_t ei_class;
+ uint8_t ei_data;
+ uint8_t ei_version;
+ uint8_t ei_pad[9];
+ __be16 e_type;
+ __be16 e_machine;
+ __be32 e_version;
+ __be64 e_entry;
+ __be64 e_phoff;
+ __be64 e_shoff;
+ __be32 e_flags;
+ __be16 e_ehsize;
+ __be16 e_phentsize;
+ __be16 e_phnum;
+ __be16 e_shentsize;
+ __be16 e_shnum;
+ __be16 e_shstrndx;
+};
+
+/* 64-bit ELF program header */
+struct elf64be_phdr {
+ __be32 p_type;
+#define ELF_PTYPE_LOAD 1
+ __be32 p_flags;
+#define ELF_PFLAGS_R 0x4
+#define ELF_PFLAGS_W 0x2
+#define ELF_PFLAGS_X 0x1
+ __be64 p_offset;
+ __be64 p_vaddr;
+ __be64 p_paddr;
+ __be64 p_filesz;
+ __be64 p_memsz;
+ __be64 p_align;
+};
+
+/* 64-bit ELF section header */
+struct elf64be_shdr {
+ __be32 sh_name;
+ __be32 sh_type;
+ __be64 sh_flags;
+#define ELF_SFLAGS_X 0x4
+#define ELF_SFLAGS_A 0x2
+#define ELF_SFLAGS_W 0x1
+ __be64 sh_addr;
+ __be64 sh_offset;
+ __be64 sh_size;
+ __be32 sh_link;
+ __be32 sh_info;
+ __be64 sh_addralign;
+ __be64 sh_entsize;
+};
+
+/* 32-bit ELF header */
+struct elf32be_hdr {
+ uint32_t ei_ident;
+ uint8_t ei_class;
+ uint8_t ei_data;
+ uint8_t ei_version;
+ uint8_t ei_pad[9];
+ __be16 e_type;
+ __be16 e_machine;
+ __be32 e_version;
+ __be32 e_entry;
+ __be32 e_phoff;
+ __be32 e_shoff;
+ __be32 e_flags;
+ __be16 e_ehsize;
+ __be16 e_phentsize;
+ __be16 e_phnum;
+ __be16 e_shentsize;
+ __be16 e_shnum;
+ __be16 e_shstrndx;
+};
+
+/* 32-bit ELF program header*/
+struct elf32be_phdr {
+ __be32 p_type;
+ __be32 p_offset;
+ __be32 p_vaddr;
+ __be32 p_paddr;
+ __be32 p_filesz;
+ __be32 p_memsz;
+ __be32 p_flags;
+ __be32 p_align;
+};
+
+/* 64-bit ELF header */
+struct elf64le_hdr {
+ uint32_t ei_ident;
+ uint8_t ei_class;
+ uint8_t ei_data;
+ uint8_t ei_version;
+ uint8_t ei_pad[9];
+ __le16 e_type;
+ __le16 e_machine;
+ __le32 e_version;
+ __le64 e_entry;
+ __le64 e_phoff;
+ __le64 e_shoff;
+ __le32 e_flags;
+ __le16 e_ehsize;
+ __le16 e_phentsize;
+ __le16 e_phnum;
+ __le16 e_shentsize;
+ __le16 e_shnum;
+ __le16 e_shstrndx;
+};
+
+/* 64-bit ELF program header */
+struct elf64le_phdr {
+ __le32 p_type;
+#define ELF_PTYPE_LOAD 1
+ __le32 p_flags;
+#define ELF_PFLAGS_R 0x4
+#define ELF_PFLAGS_W 0x2
+#define ELF_PFLAGS_X 0x1
+ __le64 p_offset;
+ __le64 p_vaddr;
+ __le64 p_paddr;
+ __le64 p_filesz;
+ __le64 p_memsz;
+ __le64 p_align;
+};
+
+/* 64-bit ELF section header */
+struct elf64le_shdr {
+ __le32 sh_name;
+ __le32 sh_type;
+ __le64 sh_flags;
+#define ELF_SFLAGS_X 0x4
+#define ELF_SFLAGS_A 0x2
+#define ELF_SFLAGS_W 0x1
+ __le64 sh_addr;
+ __le64 sh_offset;
+ __le64 sh_size;
+ __le32 sh_link;
+ __le32 sh_info;
+ __le64 sh_addralign;
+ __le64 sh_entsize;
+};
+
+/* 32-bit ELF header */
+struct elf32le_hdr {
+ uint32_t ei_ident;
+ uint8_t ei_class;
+ uint8_t ei_data;
+ uint8_t ei_version;
+ uint8_t ei_pad[9];
+ __le16 e_type;
+ __le16 e_machine;
+ __le32 e_version;
+ __le32 e_entry;
+ __le32 e_phoff;
+ __le32 e_shoff;
+ __le32 e_flags;
+ __le16 e_ehsize;
+ __le16 e_phentsize;
+ __le16 e_phnum;
+ __le16 e_shentsize;
+ __le16 e_shnum;
+ __le16 e_shstrndx;
+};
+
+/* 32-bit ELF program header*/
+struct elf32le_phdr {
+ __le32 p_type;
+ __le32 p_offset;
+ __le32 p_vaddr;
+ __le32 p_paddr;
+ __le32 p_filesz;
+ __le32 p_memsz;
+ __le32 p_flags;
+ __le32 p_align;
+};
+
+
+/* Some relocation related stuff used in relocate.c */
+struct elf64_dyn {
+ int64_t d_tag;
+#define DT_NULL 0
+#define DT_RELA 7
+#define DT_RELASZ 8
+#define DT_RELAENT 9
+#define DT_RELACOUNT 0x6ffffff9
+ uint64_t d_val;
+};
+
+struct elf64_rela {
+ uint64_t r_offset;
+ uint64_t r_info;
+#define ELF64_R_TYPE(info) ((info) & 0xffffffffu)
+ int64_t r_addend;
+};
+
+/* relocs we support */
+#define R_PPC64_RELATIVE 22
+
+
+#endif /* __ELF_H */