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