text: // 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 */
  