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