| Olaf Hering | decd300 | 2005-08-08 13:24:38 +1000 | [diff] [blame] | 1 | #ifndef _PPC_BOOT_ELF_H_ | 
|  | 2 | #define _PPC_BOOT_ELF_H_ | 
|  | 3 |  | 
|  | 4 | /* 32-bit ELF base types. */ | 
|  | 5 | typedef unsigned int Elf32_Addr; | 
|  | 6 | typedef unsigned short Elf32_Half; | 
|  | 7 | typedef unsigned int Elf32_Off; | 
|  | 8 | typedef signed int Elf32_Sword; | 
|  | 9 | typedef unsigned int Elf32_Word; | 
|  | 10 |  | 
|  | 11 | /* 64-bit ELF base types. */ | 
|  | 12 | typedef unsigned long long Elf64_Addr; | 
|  | 13 | typedef unsigned short Elf64_Half; | 
|  | 14 | typedef signed short Elf64_SHalf; | 
|  | 15 | typedef unsigned long long Elf64_Off; | 
|  | 16 | typedef signed int Elf64_Sword; | 
|  | 17 | typedef unsigned int Elf64_Word; | 
|  | 18 | typedef unsigned long long Elf64_Xword; | 
|  | 19 | typedef 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 |  | 
|  | 54 | typedef 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 |  | 
|  | 71 | typedef 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 |  | 
|  | 94 | typedef 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 |  | 
|  | 105 | typedef 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 |  | 
| Mark A. Greer | 88e6873 | 2007-03-27 15:29:50 -0700 | [diff] [blame] | 149 | struct elf_info { | 
|  | 150 | unsigned long loadsize; | 
|  | 151 | unsigned long memsize; | 
|  | 152 | unsigned long elfoffset; | 
|  | 153 | }; | 
|  | 154 | int parse_elf64(void *hdr, struct elf_info *info); | 
|  | 155 | int parse_elf32(void *hdr, struct elf_info *info); | 
|  | 156 |  | 
| Olaf Hering | decd300 | 2005-08-08 13:24:38 +1000 | [diff] [blame] | 157 | #endif				/* _PPC_BOOT_ELF_H_ */ |