1*b2441318SGreg Kroah-Hartman /* SPDX-License-Identifier: GPL-2.0 */ 294b212c2SPaul Mackerras #ifndef _PPC_BOOT_ELF_H_ 394b212c2SPaul Mackerras #define _PPC_BOOT_ELF_H_ 494b212c2SPaul Mackerras 594b212c2SPaul Mackerras /* 32-bit ELF base types. */ 694b212c2SPaul Mackerras typedef unsigned int Elf32_Addr; 794b212c2SPaul Mackerras typedef unsigned short Elf32_Half; 894b212c2SPaul Mackerras typedef unsigned int Elf32_Off; 994b212c2SPaul Mackerras typedef signed int Elf32_Sword; 1094b212c2SPaul Mackerras typedef unsigned int Elf32_Word; 1194b212c2SPaul Mackerras 1294b212c2SPaul Mackerras /* 64-bit ELF base types. */ 1394b212c2SPaul Mackerras typedef unsigned long long Elf64_Addr; 1494b212c2SPaul Mackerras typedef unsigned short Elf64_Half; 1594b212c2SPaul Mackerras typedef signed short Elf64_SHalf; 1694b212c2SPaul Mackerras typedef unsigned long long Elf64_Off; 1794b212c2SPaul Mackerras typedef signed int Elf64_Sword; 1894b212c2SPaul Mackerras typedef unsigned int Elf64_Word; 1994b212c2SPaul Mackerras typedef unsigned long long Elf64_Xword; 2094b212c2SPaul Mackerras typedef signed long long Elf64_Sxword; 2194b212c2SPaul Mackerras 2294b212c2SPaul Mackerras /* These constants are for the segment types stored in the image headers */ 2394b212c2SPaul Mackerras #define PT_NULL 0 2494b212c2SPaul Mackerras #define PT_LOAD 1 2594b212c2SPaul Mackerras #define PT_DYNAMIC 2 2694b212c2SPaul Mackerras #define PT_INTERP 3 2794b212c2SPaul Mackerras #define PT_NOTE 4 2894b212c2SPaul Mackerras #define PT_SHLIB 5 2994b212c2SPaul Mackerras #define PT_PHDR 6 3094b212c2SPaul Mackerras #define PT_TLS 7 /* Thread local storage segment */ 3194b212c2SPaul Mackerras #define PT_LOOS 0x60000000 /* OS-specific */ 3294b212c2SPaul Mackerras #define PT_HIOS 0x6fffffff /* OS-specific */ 3394b212c2SPaul Mackerras #define PT_LOPROC 0x70000000 3494b212c2SPaul Mackerras #define PT_HIPROC 0x7fffffff 3594b212c2SPaul Mackerras #define PT_GNU_EH_FRAME 0x6474e550 3694b212c2SPaul Mackerras 3794b212c2SPaul Mackerras #define PT_GNU_STACK (PT_LOOS + 0x474e551) 3894b212c2SPaul Mackerras 3994b212c2SPaul Mackerras /* These constants define the different elf file types */ 4094b212c2SPaul Mackerras #define ET_NONE 0 4194b212c2SPaul Mackerras #define ET_REL 1 4294b212c2SPaul Mackerras #define ET_EXEC 2 4394b212c2SPaul Mackerras #define ET_DYN 3 4494b212c2SPaul Mackerras #define ET_CORE 4 4594b212c2SPaul Mackerras #define ET_LOPROC 0xff00 4694b212c2SPaul Mackerras #define ET_HIPROC 0xffff 4794b212c2SPaul Mackerras 4894b212c2SPaul Mackerras /* These constants define the various ELF target machines */ 4994b212c2SPaul Mackerras #define EM_NONE 0 5094b212c2SPaul Mackerras #define EM_PPC 20 /* PowerPC */ 5194b212c2SPaul Mackerras #define EM_PPC64 21 /* PowerPC64 */ 5294b212c2SPaul Mackerras 5394b212c2SPaul Mackerras #define EI_NIDENT 16 5494b212c2SPaul Mackerras 5594b212c2SPaul Mackerras typedef struct elf32_hdr { 5694b212c2SPaul Mackerras unsigned char e_ident[EI_NIDENT]; 5794b212c2SPaul Mackerras Elf32_Half e_type; 5894b212c2SPaul Mackerras Elf32_Half e_machine; 5994b212c2SPaul Mackerras Elf32_Word e_version; 6094b212c2SPaul Mackerras Elf32_Addr e_entry; /* Entry point */ 6194b212c2SPaul Mackerras Elf32_Off e_phoff; 6294b212c2SPaul Mackerras Elf32_Off e_shoff; 6394b212c2SPaul Mackerras Elf32_Word e_flags; 6494b212c2SPaul Mackerras Elf32_Half e_ehsize; 6594b212c2SPaul Mackerras Elf32_Half e_phentsize; 6694b212c2SPaul Mackerras Elf32_Half e_phnum; 6794b212c2SPaul Mackerras Elf32_Half e_shentsize; 6894b212c2SPaul Mackerras Elf32_Half e_shnum; 6994b212c2SPaul Mackerras Elf32_Half e_shstrndx; 7094b212c2SPaul Mackerras } Elf32_Ehdr; 7194b212c2SPaul Mackerras 7294b212c2SPaul Mackerras typedef struct elf64_hdr { 7394b212c2SPaul Mackerras unsigned char e_ident[16]; /* ELF "magic number" */ 7494b212c2SPaul Mackerras Elf64_Half e_type; 7594b212c2SPaul Mackerras Elf64_Half e_machine; 7694b212c2SPaul Mackerras Elf64_Word e_version; 7794b212c2SPaul Mackerras Elf64_Addr e_entry; /* Entry point virtual address */ 7894b212c2SPaul Mackerras Elf64_Off e_phoff; /* Program header table file offset */ 7994b212c2SPaul Mackerras Elf64_Off e_shoff; /* Section header table file offset */ 8094b212c2SPaul Mackerras Elf64_Word e_flags; 8194b212c2SPaul Mackerras Elf64_Half e_ehsize; 8294b212c2SPaul Mackerras Elf64_Half e_phentsize; 8394b212c2SPaul Mackerras Elf64_Half e_phnum; 8494b212c2SPaul Mackerras Elf64_Half e_shentsize; 8594b212c2SPaul Mackerras Elf64_Half e_shnum; 8694b212c2SPaul Mackerras Elf64_Half e_shstrndx; 8794b212c2SPaul Mackerras } Elf64_Ehdr; 8894b212c2SPaul Mackerras 8994b212c2SPaul Mackerras /* These constants define the permissions on sections in the program 9094b212c2SPaul Mackerras header, p_flags. */ 9194b212c2SPaul Mackerras #define PF_R 0x4 9294b212c2SPaul Mackerras #define PF_W 0x2 9394b212c2SPaul Mackerras #define PF_X 0x1 9494b212c2SPaul Mackerras 9594b212c2SPaul Mackerras typedef struct elf32_phdr { 9694b212c2SPaul Mackerras Elf32_Word p_type; 9794b212c2SPaul Mackerras Elf32_Off p_offset; 9894b212c2SPaul Mackerras Elf32_Addr p_vaddr; 9994b212c2SPaul Mackerras Elf32_Addr p_paddr; 10094b212c2SPaul Mackerras Elf32_Word p_filesz; 10194b212c2SPaul Mackerras Elf32_Word p_memsz; 10294b212c2SPaul Mackerras Elf32_Word p_flags; 10394b212c2SPaul Mackerras Elf32_Word p_align; 10494b212c2SPaul Mackerras } Elf32_Phdr; 10594b212c2SPaul Mackerras 10694b212c2SPaul Mackerras typedef struct elf64_phdr { 10794b212c2SPaul Mackerras Elf64_Word p_type; 10894b212c2SPaul Mackerras Elf64_Word p_flags; 10994b212c2SPaul Mackerras Elf64_Off p_offset; /* Segment file offset */ 11094b212c2SPaul Mackerras Elf64_Addr p_vaddr; /* Segment virtual address */ 11194b212c2SPaul Mackerras Elf64_Addr p_paddr; /* Segment physical address */ 11294b212c2SPaul Mackerras Elf64_Xword p_filesz; /* Segment size in file */ 11394b212c2SPaul Mackerras Elf64_Xword p_memsz; /* Segment size in memory */ 11494b212c2SPaul Mackerras Elf64_Xword p_align; /* Segment alignment, file & memory */ 11594b212c2SPaul Mackerras } Elf64_Phdr; 11694b212c2SPaul Mackerras 11794b212c2SPaul Mackerras #define EI_MAG0 0 /* e_ident[] indexes */ 11894b212c2SPaul Mackerras #define EI_MAG1 1 11994b212c2SPaul Mackerras #define EI_MAG2 2 12094b212c2SPaul Mackerras #define EI_MAG3 3 12194b212c2SPaul Mackerras #define EI_CLASS 4 12294b212c2SPaul Mackerras #define EI_DATA 5 12394b212c2SPaul Mackerras #define EI_VERSION 6 12494b212c2SPaul Mackerras #define EI_OSABI 7 12594b212c2SPaul Mackerras #define EI_PAD 8 12694b212c2SPaul Mackerras 12794b212c2SPaul Mackerras #define ELFMAG0 0x7f /* EI_MAG */ 12894b212c2SPaul Mackerras #define ELFMAG1 'E' 12994b212c2SPaul Mackerras #define ELFMAG2 'L' 13094b212c2SPaul Mackerras #define ELFMAG3 'F' 13194b212c2SPaul Mackerras #define ELFMAG "\177ELF" 13294b212c2SPaul Mackerras #define SELFMAG 4 13394b212c2SPaul Mackerras 13494b212c2SPaul Mackerras #define ELFCLASSNONE 0 /* EI_CLASS */ 13594b212c2SPaul Mackerras #define ELFCLASS32 1 13694b212c2SPaul Mackerras #define ELFCLASS64 2 13794b212c2SPaul Mackerras #define ELFCLASSNUM 3 13894b212c2SPaul Mackerras 13994b212c2SPaul Mackerras #define ELFDATANONE 0 /* e_ident[EI_DATA] */ 14094b212c2SPaul Mackerras #define ELFDATA2LSB 1 14194b212c2SPaul Mackerras #define ELFDATA2MSB 2 14294b212c2SPaul Mackerras 14394b212c2SPaul Mackerras #define EV_NONE 0 /* e_version, EI_VERSION */ 14494b212c2SPaul Mackerras #define EV_CURRENT 1 14594b212c2SPaul Mackerras #define EV_NUM 2 14694b212c2SPaul Mackerras 14794b212c2SPaul Mackerras #define ELFOSABI_NONE 0 14894b212c2SPaul Mackerras #define ELFOSABI_LINUX 3 14994b212c2SPaul Mackerras 15088e68731SMark A. Greer struct elf_info { 15188e68731SMark A. Greer unsigned long loadsize; 15288e68731SMark A. Greer unsigned long memsize; 15388e68731SMark A. Greer unsigned long elfoffset; 15488e68731SMark A. Greer }; 15588e68731SMark A. Greer int parse_elf64(void *hdr, struct elf_info *info); 15688e68731SMark A. Greer int parse_elf32(void *hdr, struct elf_info *info); 15788e68731SMark A. Greer 15894b212c2SPaul Mackerras #endif /* _PPC_BOOT_ELF_H_ */ 159