|  | /* SPDX-License-Identifier: GPL-2.0 */ | 
|  | #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 | 
|  |  | 
|  | 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); | 
|  |  | 
|  | #endif				/* _PPC_BOOT_ELF_H_ */ |