1*4882a593Smuzhiyun // SPDX-License-Identifier: GPL-2.0-or-later 2*4882a593Smuzhiyun /* 3*4882a593Smuzhiyun * Copyright (C) Paul Mackerras 1997. 4*4882a593Smuzhiyun * 5*4882a593Smuzhiyun * Updates for PPC64 by Todd Inglett, Dave Engebretsen & Peter Bergner. 6*4882a593Smuzhiyun */ 7*4882a593Smuzhiyun #include <stdarg.h> 8*4882a593Smuzhiyun #include <stddef.h> 9*4882a593Smuzhiyun #include "elf.h" 10*4882a593Smuzhiyun #include "page.h" 11*4882a593Smuzhiyun #include "string.h" 12*4882a593Smuzhiyun #include "stdio.h" 13*4882a593Smuzhiyun parse_elf64(void * hdr,struct elf_info * info)14*4882a593Smuzhiyunint parse_elf64(void *hdr, struct elf_info *info) 15*4882a593Smuzhiyun { 16*4882a593Smuzhiyun Elf64_Ehdr *elf64 = hdr; 17*4882a593Smuzhiyun Elf64_Phdr *elf64ph; 18*4882a593Smuzhiyun unsigned int i; 19*4882a593Smuzhiyun 20*4882a593Smuzhiyun if (!(elf64->e_ident[EI_MAG0] == ELFMAG0 && 21*4882a593Smuzhiyun elf64->e_ident[EI_MAG1] == ELFMAG1 && 22*4882a593Smuzhiyun elf64->e_ident[EI_MAG2] == ELFMAG2 && 23*4882a593Smuzhiyun elf64->e_ident[EI_MAG3] == ELFMAG3 && 24*4882a593Smuzhiyun elf64->e_ident[EI_CLASS] == ELFCLASS64 && 25*4882a593Smuzhiyun #ifdef __LITTLE_ENDIAN__ 26*4882a593Smuzhiyun elf64->e_ident[EI_DATA] == ELFDATA2LSB && 27*4882a593Smuzhiyun #else 28*4882a593Smuzhiyun elf64->e_ident[EI_DATA] == ELFDATA2MSB && 29*4882a593Smuzhiyun #endif 30*4882a593Smuzhiyun (elf64->e_type == ET_EXEC || 31*4882a593Smuzhiyun elf64->e_type == ET_DYN) && 32*4882a593Smuzhiyun elf64->e_machine == EM_PPC64)) 33*4882a593Smuzhiyun return 0; 34*4882a593Smuzhiyun 35*4882a593Smuzhiyun elf64ph = (Elf64_Phdr *)((unsigned long)elf64 + 36*4882a593Smuzhiyun (unsigned long)elf64->e_phoff); 37*4882a593Smuzhiyun for (i = 0; i < (unsigned int)elf64->e_phnum; i++, elf64ph++) 38*4882a593Smuzhiyun if (elf64ph->p_type == PT_LOAD) 39*4882a593Smuzhiyun break; 40*4882a593Smuzhiyun if (i >= (unsigned int)elf64->e_phnum) 41*4882a593Smuzhiyun return 0; 42*4882a593Smuzhiyun 43*4882a593Smuzhiyun info->loadsize = (unsigned long)elf64ph->p_filesz; 44*4882a593Smuzhiyun info->memsize = (unsigned long)elf64ph->p_memsz; 45*4882a593Smuzhiyun info->elfoffset = (unsigned long)elf64ph->p_offset; 46*4882a593Smuzhiyun 47*4882a593Smuzhiyun return 1; 48*4882a593Smuzhiyun } 49*4882a593Smuzhiyun parse_elf32(void * hdr,struct elf_info * info)50*4882a593Smuzhiyunint parse_elf32(void *hdr, struct elf_info *info) 51*4882a593Smuzhiyun { 52*4882a593Smuzhiyun Elf32_Ehdr *elf32 = hdr; 53*4882a593Smuzhiyun Elf32_Phdr *elf32ph; 54*4882a593Smuzhiyun unsigned int i; 55*4882a593Smuzhiyun 56*4882a593Smuzhiyun if (!(elf32->e_ident[EI_MAG0] == ELFMAG0 && 57*4882a593Smuzhiyun elf32->e_ident[EI_MAG1] == ELFMAG1 && 58*4882a593Smuzhiyun elf32->e_ident[EI_MAG2] == ELFMAG2 && 59*4882a593Smuzhiyun elf32->e_ident[EI_MAG3] == ELFMAG3 && 60*4882a593Smuzhiyun elf32->e_ident[EI_CLASS] == ELFCLASS32 && 61*4882a593Smuzhiyun elf32->e_ident[EI_DATA] == ELFDATA2MSB && 62*4882a593Smuzhiyun (elf32->e_type == ET_EXEC || 63*4882a593Smuzhiyun elf32->e_type == ET_DYN) && 64*4882a593Smuzhiyun elf32->e_machine == EM_PPC)) 65*4882a593Smuzhiyun return 0; 66*4882a593Smuzhiyun 67*4882a593Smuzhiyun elf32ph = (Elf32_Phdr *) ((unsigned long)elf32 + elf32->e_phoff); 68*4882a593Smuzhiyun for (i = 0; i < elf32->e_phnum; i++, elf32ph++) 69*4882a593Smuzhiyun if (elf32ph->p_type == PT_LOAD) 70*4882a593Smuzhiyun break; 71*4882a593Smuzhiyun if (i >= elf32->e_phnum) 72*4882a593Smuzhiyun return 0; 73*4882a593Smuzhiyun 74*4882a593Smuzhiyun info->loadsize = elf32ph->p_filesz; 75*4882a593Smuzhiyun info->memsize = elf32ph->p_memsz; 76*4882a593Smuzhiyun info->elfoffset = elf32ph->p_offset; 77*4882a593Smuzhiyun return 1; 78*4882a593Smuzhiyun } 79