^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) /* SPDX-License-Identifier: GPL-2.0 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2) #ifndef _PPC_BOOT_ELF_H_
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) #define _PPC_BOOT_ELF_H_
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) /* 32-bit ELF base types. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6) typedef unsigned int Elf32_Addr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7) typedef unsigned short Elf32_Half;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8) typedef unsigned int Elf32_Off;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9) typedef signed int Elf32_Sword;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10) typedef unsigned int Elf32_Word;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) /* 64-bit ELF base types. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) typedef unsigned long long Elf64_Addr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14) typedef unsigned short Elf64_Half;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) typedef signed short Elf64_SHalf;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) typedef unsigned long long Elf64_Off;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) typedef signed int Elf64_Sword;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18) typedef unsigned int Elf64_Word;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) typedef unsigned long long Elf64_Xword;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) typedef signed long long Elf64_Sxword;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) /* These constants are for the segment types stored in the image headers */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) #define PT_NULL 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) #define PT_LOAD 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) #define PT_DYNAMIC 2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26) #define PT_INTERP 3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) #define PT_NOTE 4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) #define PT_SHLIB 5
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) #define PT_PHDR 6
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) #define PT_TLS 7 /* Thread local storage segment */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) #define PT_LOOS 0x60000000 /* OS-specific */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) #define PT_HIOS 0x6fffffff /* OS-specific */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) #define PT_LOPROC 0x70000000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) #define PT_HIPROC 0x7fffffff
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) #define PT_GNU_EH_FRAME 0x6474e550
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) #define PT_GNU_STACK (PT_LOOS + 0x474e551)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) /* These constants define the different elf file types */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) #define ET_NONE 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) #define ET_REL 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) #define ET_EXEC 2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) #define ET_DYN 3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44) #define ET_CORE 4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) #define ET_LOPROC 0xff00
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46) #define ET_HIPROC 0xffff
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48) /* These constants define the various ELF target machines */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) #define EM_NONE 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50) #define EM_PPC 20 /* PowerPC */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) #define EM_PPC64 21 /* PowerPC64 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) #define EI_NIDENT 16
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55) typedef struct elf32_hdr {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) unsigned char e_ident[EI_NIDENT];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) Elf32_Half e_type;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58) Elf32_Half e_machine;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59) Elf32_Word e_version;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60) Elf32_Addr e_entry; /* Entry point */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) Elf32_Off e_phoff;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) Elf32_Off e_shoff;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63) Elf32_Word e_flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64) Elf32_Half e_ehsize;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) Elf32_Half e_phentsize;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66) Elf32_Half e_phnum;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67) Elf32_Half e_shentsize;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68) Elf32_Half e_shnum;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69) Elf32_Half e_shstrndx;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70) } Elf32_Ehdr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72) typedef struct elf64_hdr {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73) unsigned char e_ident[16]; /* ELF "magic number" */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74) Elf64_Half e_type;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75) Elf64_Half e_machine;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76) Elf64_Word e_version;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77) Elf64_Addr e_entry; /* Entry point virtual address */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78) Elf64_Off e_phoff; /* Program header table file offset */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79) Elf64_Off e_shoff; /* Section header table file offset */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80) Elf64_Word e_flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81) Elf64_Half e_ehsize;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82) Elf64_Half e_phentsize;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83) Elf64_Half e_phnum;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84) Elf64_Half e_shentsize;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85) Elf64_Half e_shnum;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86) Elf64_Half e_shstrndx;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87) } Elf64_Ehdr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89) /* These constants define the permissions on sections in the program
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90) header, p_flags. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91) #define PF_R 0x4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92) #define PF_W 0x2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93) #define PF_X 0x1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95) typedef struct elf32_phdr {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 96) Elf32_Word p_type;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 97) Elf32_Off p_offset;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 98) Elf32_Addr p_vaddr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 99) Elf32_Addr p_paddr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) Elf32_Word p_filesz;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) Elf32_Word p_memsz;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) Elf32_Word p_flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) Elf32_Word p_align;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) } Elf32_Phdr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) typedef struct elf64_phdr {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) Elf64_Word p_type;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) Elf64_Word p_flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) Elf64_Off p_offset; /* Segment file offset */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) Elf64_Addr p_vaddr; /* Segment virtual address */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) Elf64_Addr p_paddr; /* Segment physical address */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) Elf64_Xword p_filesz; /* Segment size in file */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) Elf64_Xword p_memsz; /* Segment size in memory */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) Elf64_Xword p_align; /* Segment alignment, file & memory */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) } Elf64_Phdr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) #define EI_MAG0 0 /* e_ident[] indexes */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118) #define EI_MAG1 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119) #define EI_MAG2 2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) #define EI_MAG3 3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) #define EI_CLASS 4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122) #define EI_DATA 5
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123) #define EI_VERSION 6
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124) #define EI_OSABI 7
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125) #define EI_PAD 8
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127) #define ELFMAG0 0x7f /* EI_MAG */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128) #define ELFMAG1 'E'
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129) #define ELFMAG2 'L'
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130) #define ELFMAG3 'F'
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131) #define ELFMAG "\177ELF"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132) #define SELFMAG 4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134) #define ELFCLASSNONE 0 /* EI_CLASS */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135) #define ELFCLASS32 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136) #define ELFCLASS64 2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137) #define ELFCLASSNUM 3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139) #define ELFDATANONE 0 /* e_ident[EI_DATA] */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140) #define ELFDATA2LSB 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141) #define ELFDATA2MSB 2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143) #define EV_NONE 0 /* e_version, EI_VERSION */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144) #define EV_CURRENT 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145) #define EV_NUM 2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147) #define ELFOSABI_NONE 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148) #define ELFOSABI_LINUX 3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150) struct elf_info {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151) unsigned long loadsize;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 152) unsigned long memsize;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 153) unsigned long elfoffset;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 154) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 155) int parse_elf64(void *hdr, struct elf_info *info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 156) int parse_elf32(void *hdr, struct elf_info *info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 157)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 158) #endif /* _PPC_BOOT_ELF_H_ */