| 
									
										
										
										
											2005-08-08 13:24:38 +10:00
										 |  |  | #ifndef _PPC_BOOT_ELF_H_
 | 
					
						
							|  |  |  | #define _PPC_BOOT_ELF_H_
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* 32-bit ELF base types. */ | 
					
						
							|  |  |  | typedef unsigned int Elf32_Addr; | 
					
						
							|  |  |  | typedef unsigned short Elf32_Half; | 
					
						
							|  |  |  | typedef unsigned int Elf32_Off; | 
					
						
							|  |  |  | typedef signed int Elf32_Sword; | 
					
						
							|  |  |  | typedef unsigned int Elf32_Word; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* 64-bit ELF base types. */ | 
					
						
							|  |  |  | typedef unsigned long long Elf64_Addr; | 
					
						
							|  |  |  | typedef unsigned short Elf64_Half; | 
					
						
							|  |  |  | typedef signed short Elf64_SHalf; | 
					
						
							|  |  |  | typedef unsigned long long Elf64_Off; | 
					
						
							|  |  |  | typedef signed int Elf64_Sword; | 
					
						
							|  |  |  | typedef unsigned int Elf64_Word; | 
					
						
							|  |  |  | typedef unsigned long long Elf64_Xword; | 
					
						
							|  |  |  | typedef signed long long Elf64_Sxword; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* These constants are for the segment types stored in the image headers */ | 
					
						
							|  |  |  | #define PT_NULL    0
 | 
					
						
							|  |  |  | #define PT_LOAD    1
 | 
					
						
							|  |  |  | #define PT_DYNAMIC 2
 | 
					
						
							|  |  |  | #define PT_INTERP  3
 | 
					
						
							|  |  |  | #define PT_NOTE    4
 | 
					
						
							|  |  |  | #define PT_SHLIB   5
 | 
					
						
							|  |  |  | #define PT_PHDR    6
 | 
					
						
							|  |  |  | #define PT_TLS     7		/* Thread local storage segment */
 | 
					
						
							|  |  |  | #define PT_LOOS    0x60000000	/* OS-specific */
 | 
					
						
							|  |  |  | #define PT_HIOS    0x6fffffff	/* OS-specific */
 | 
					
						
							|  |  |  | #define PT_LOPROC  0x70000000
 | 
					
						
							|  |  |  | #define PT_HIPROC  0x7fffffff
 | 
					
						
							|  |  |  | #define PT_GNU_EH_FRAME		0x6474e550
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #define PT_GNU_STACK	(PT_LOOS + 0x474e551)
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* These constants define the different elf file types */ | 
					
						
							|  |  |  | #define ET_NONE   0
 | 
					
						
							|  |  |  | #define ET_REL    1
 | 
					
						
							|  |  |  | #define ET_EXEC   2
 | 
					
						
							|  |  |  | #define ET_DYN    3
 | 
					
						
							|  |  |  | #define ET_CORE   4
 | 
					
						
							|  |  |  | #define ET_LOPROC 0xff00
 | 
					
						
							|  |  |  | #define ET_HIPROC 0xffff
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* These constants define the various ELF target machines */ | 
					
						
							|  |  |  | #define EM_NONE  0
 | 
					
						
							|  |  |  | #define EM_PPC	       20	/* PowerPC */
 | 
					
						
							|  |  |  | #define EM_PPC64       21	/* PowerPC64 */
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #define EI_NIDENT	16
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | typedef struct elf32_hdr { | 
					
						
							|  |  |  | 	unsigned char e_ident[EI_NIDENT]; | 
					
						
							|  |  |  | 	Elf32_Half e_type; | 
					
						
							|  |  |  | 	Elf32_Half e_machine; | 
					
						
							|  |  |  | 	Elf32_Word e_version; | 
					
						
							|  |  |  | 	Elf32_Addr e_entry;	/* Entry point */ | 
					
						
							|  |  |  | 	Elf32_Off e_phoff; | 
					
						
							|  |  |  | 	Elf32_Off e_shoff; | 
					
						
							|  |  |  | 	Elf32_Word e_flags; | 
					
						
							|  |  |  | 	Elf32_Half e_ehsize; | 
					
						
							|  |  |  | 	Elf32_Half e_phentsize; | 
					
						
							|  |  |  | 	Elf32_Half e_phnum; | 
					
						
							|  |  |  | 	Elf32_Half e_shentsize; | 
					
						
							|  |  |  | 	Elf32_Half e_shnum; | 
					
						
							|  |  |  | 	Elf32_Half e_shstrndx; | 
					
						
							|  |  |  | } Elf32_Ehdr; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | typedef struct elf64_hdr { | 
					
						
							|  |  |  | 	unsigned char e_ident[16];	/* ELF "magic number" */ | 
					
						
							|  |  |  | 	Elf64_Half e_type; | 
					
						
							|  |  |  | 	Elf64_Half e_machine; | 
					
						
							|  |  |  | 	Elf64_Word e_version; | 
					
						
							|  |  |  | 	Elf64_Addr e_entry;	/* Entry point virtual address */ | 
					
						
							|  |  |  | 	Elf64_Off e_phoff;	/* Program header table file offset */ | 
					
						
							|  |  |  | 	Elf64_Off e_shoff;	/* Section header table file offset */ | 
					
						
							|  |  |  | 	Elf64_Word e_flags; | 
					
						
							|  |  |  | 	Elf64_Half e_ehsize; | 
					
						
							|  |  |  | 	Elf64_Half e_phentsize; | 
					
						
							|  |  |  | 	Elf64_Half e_phnum; | 
					
						
							|  |  |  | 	Elf64_Half e_shentsize; | 
					
						
							|  |  |  | 	Elf64_Half e_shnum; | 
					
						
							|  |  |  | 	Elf64_Half e_shstrndx; | 
					
						
							|  |  |  | } Elf64_Ehdr; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* These constants define the permissions on sections in the program
 | 
					
						
							|  |  |  |    header, p_flags. */ | 
					
						
							|  |  |  | #define PF_R		0x4
 | 
					
						
							|  |  |  | #define PF_W		0x2
 | 
					
						
							|  |  |  | #define PF_X		0x1
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | typedef struct elf32_phdr { | 
					
						
							|  |  |  | 	Elf32_Word p_type; | 
					
						
							|  |  |  | 	Elf32_Off p_offset; | 
					
						
							|  |  |  | 	Elf32_Addr p_vaddr; | 
					
						
							|  |  |  | 	Elf32_Addr p_paddr; | 
					
						
							|  |  |  | 	Elf32_Word p_filesz; | 
					
						
							|  |  |  | 	Elf32_Word p_memsz; | 
					
						
							|  |  |  | 	Elf32_Word p_flags; | 
					
						
							|  |  |  | 	Elf32_Word p_align; | 
					
						
							|  |  |  | } Elf32_Phdr; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | typedef struct elf64_phdr { | 
					
						
							|  |  |  | 	Elf64_Word p_type; | 
					
						
							|  |  |  | 	Elf64_Word p_flags; | 
					
						
							|  |  |  | 	Elf64_Off p_offset;	/* Segment file offset */ | 
					
						
							|  |  |  | 	Elf64_Addr p_vaddr;	/* Segment virtual address */ | 
					
						
							|  |  |  | 	Elf64_Addr p_paddr;	/* Segment physical address */ | 
					
						
							|  |  |  | 	Elf64_Xword p_filesz;	/* Segment size in file */ | 
					
						
							|  |  |  | 	Elf64_Xword p_memsz;	/* Segment size in memory */ | 
					
						
							|  |  |  | 	Elf64_Xword p_align;	/* Segment alignment, file & memory */ | 
					
						
							|  |  |  | } Elf64_Phdr; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #define	EI_MAG0		0	/* e_ident[] indexes */
 | 
					
						
							|  |  |  | #define	EI_MAG1		1
 | 
					
						
							|  |  |  | #define	EI_MAG2		2
 | 
					
						
							|  |  |  | #define	EI_MAG3		3
 | 
					
						
							|  |  |  | #define	EI_CLASS	4
 | 
					
						
							|  |  |  | #define	EI_DATA		5
 | 
					
						
							|  |  |  | #define	EI_VERSION	6
 | 
					
						
							|  |  |  | #define	EI_OSABI	7
 | 
					
						
							|  |  |  | #define	EI_PAD		8
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #define	ELFMAG0		0x7f	/* EI_MAG */
 | 
					
						
							|  |  |  | #define	ELFMAG1		'E'
 | 
					
						
							|  |  |  | #define	ELFMAG2		'L'
 | 
					
						
							|  |  |  | #define	ELFMAG3		'F'
 | 
					
						
							|  |  |  | #define	ELFMAG		"\177ELF"
 | 
					
						
							|  |  |  | #define	SELFMAG		4
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #define	ELFCLASSNONE	0	/* EI_CLASS */
 | 
					
						
							|  |  |  | #define	ELFCLASS32	1
 | 
					
						
							|  |  |  | #define	ELFCLASS64	2
 | 
					
						
							|  |  |  | #define	ELFCLASSNUM	3
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #define ELFDATANONE	0	/* e_ident[EI_DATA] */
 | 
					
						
							|  |  |  | #define ELFDATA2LSB	1
 | 
					
						
							|  |  |  | #define ELFDATA2MSB	2
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #define EV_NONE		0	/* e_version, EI_VERSION */
 | 
					
						
							|  |  |  | #define EV_CURRENT	1
 | 
					
						
							|  |  |  | #define EV_NUM		2
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #define ELFOSABI_NONE	0
 | 
					
						
							|  |  |  | #define ELFOSABI_LINUX	3
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-03-27 15:29:50 -07:00
										 |  |  | struct elf_info { | 
					
						
							|  |  |  | 	unsigned long loadsize; | 
					
						
							|  |  |  | 	unsigned long memsize; | 
					
						
							|  |  |  | 	unsigned long elfoffset; | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | int parse_elf64(void *hdr, struct elf_info *info); | 
					
						
							|  |  |  | int parse_elf32(void *hdr, struct elf_info *info); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-08-08 13:24:38 +10:00
										 |  |  | #endif				/* _PPC_BOOT_ELF_H_ */
 |