| Mark A. Greer | 88e6873 | 2007-03-27 15:29:50 -0700 | [diff] [blame] | 1 | /* | 
|  | 2 | * Copyright (C) Paul Mackerras 1997. | 
|  | 3 | * | 
|  | 4 | * Updates for PPC64 by Todd Inglett, Dave Engebretsen & Peter Bergner. | 
|  | 5 | * | 
|  | 6 | * This program is free software; you can redistribute it and/or | 
|  | 7 | * modify it under the terms of the GNU General Public License | 
|  | 8 | * as published by the Free Software Foundation; either version | 
|  | 9 | * 2 of the License, or (at your option) any later version. | 
|  | 10 | */ | 
|  | 11 | #include <stdarg.h> | 
|  | 12 | #include <stddef.h> | 
|  | 13 | #include "elf.h" | 
|  | 14 | #include "page.h" | 
|  | 15 | #include "string.h" | 
|  | 16 | #include "stdio.h" | 
|  | 17 |  | 
|  | 18 | int parse_elf64(void *hdr, struct elf_info *info) | 
|  | 19 | { | 
|  | 20 | Elf64_Ehdr *elf64 = hdr; | 
|  | 21 | Elf64_Phdr *elf64ph; | 
|  | 22 | unsigned int i; | 
|  | 23 |  | 
|  | 24 | if (!(elf64->e_ident[EI_MAG0]  == ELFMAG0	&& | 
|  | 25 | elf64->e_ident[EI_MAG1]  == ELFMAG1	&& | 
|  | 26 | elf64->e_ident[EI_MAG2]  == ELFMAG2	&& | 
|  | 27 | elf64->e_ident[EI_MAG3]  == ELFMAG3	&& | 
|  | 28 | elf64->e_ident[EI_CLASS] == ELFCLASS64	&& | 
|  | 29 | elf64->e_ident[EI_DATA]  == ELFDATA2MSB	&& | 
| Paul Mackerras | 549e815 | 2008-08-30 11:43:47 +1000 | [diff] [blame] | 30 | (elf64->e_type            == ET_EXEC || | 
|  | 31 | elf64->e_type            == ET_DYN)	&& | 
| Mark A. Greer | 88e6873 | 2007-03-27 15:29:50 -0700 | [diff] [blame] | 32 | elf64->e_machine         == EM_PPC64)) | 
|  | 33 | return 0; | 
|  | 34 |  | 
|  | 35 | elf64ph = (Elf64_Phdr *)((unsigned long)elf64 + | 
|  | 36 | (unsigned long)elf64->e_phoff); | 
|  | 37 | for (i = 0; i < (unsigned int)elf64->e_phnum; i++, elf64ph++) | 
|  | 38 | if (elf64ph->p_type == PT_LOAD) | 
|  | 39 | break; | 
|  | 40 | if (i >= (unsigned int)elf64->e_phnum) | 
|  | 41 | return 0; | 
|  | 42 |  | 
|  | 43 | info->loadsize = (unsigned long)elf64ph->p_filesz; | 
|  | 44 | info->memsize = (unsigned long)elf64ph->p_memsz; | 
|  | 45 | info->elfoffset = (unsigned long)elf64ph->p_offset; | 
|  | 46 |  | 
|  | 47 | return 1; | 
|  | 48 | } | 
|  | 49 |  | 
|  | 50 | int parse_elf32(void *hdr, struct elf_info *info) | 
|  | 51 | { | 
|  | 52 | Elf32_Ehdr *elf32 = hdr; | 
|  | 53 | Elf32_Phdr *elf32ph; | 
|  | 54 | unsigned int i; | 
|  | 55 |  | 
|  | 56 | if (!(elf32->e_ident[EI_MAG0]  == ELFMAG0	&& | 
|  | 57 | elf32->e_ident[EI_MAG1]  == ELFMAG1	&& | 
|  | 58 | elf32->e_ident[EI_MAG2]  == ELFMAG2	&& | 
|  | 59 | elf32->e_ident[EI_MAG3]  == ELFMAG3	&& | 
|  | 60 | elf32->e_ident[EI_CLASS] == ELFCLASS32	&& | 
|  | 61 | elf32->e_ident[EI_DATA]  == ELFDATA2MSB	&& | 
| Paul Mackerras | 549e815 | 2008-08-30 11:43:47 +1000 | [diff] [blame] | 62 | (elf32->e_type            == ET_EXEC || | 
|  | 63 | elf32->e_type            == ET_DYN)      && | 
| Mark A. Greer | 88e6873 | 2007-03-27 15:29:50 -0700 | [diff] [blame] | 64 | elf32->e_machine         == EM_PPC)) | 
|  | 65 | return 0; | 
|  | 66 |  | 
|  | 67 | elf32ph = (Elf32_Phdr *) ((unsigned long)elf32 + elf32->e_phoff); | 
|  | 68 | for (i = 0; i < elf32->e_phnum; i++, elf32ph++) | 
|  | 69 | if (elf32ph->p_type == PT_LOAD) | 
|  | 70 | break; | 
|  | 71 | if (i >= elf32->e_phnum) | 
|  | 72 | return 0; | 
|  | 73 |  | 
|  | 74 | info->loadsize = elf32ph->p_filesz; | 
|  | 75 | info->memsize = elf32ph->p_memsz; | 
|  | 76 | info->elfoffset = elf32ph->p_offset; | 
|  | 77 | return 1; | 
|  | 78 | } |