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