Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

[POWERPC] Move bootwrapper ELF parsing routines to a file

The ELF parsing routines local to arch/powerpc/boot/main.c are useful
to other callers therefore move them to their own file.

Signed-off-by: Mark A. Greer <mgreer@mvista.com>
Signed-off-by: Paul Mackerras <paulus@samba.org>

authored by

Mark A. Greer and committed by
Paul Mackerras
88e68731 5e41763a

+85 -67
+1 -1
arch/powerpc/boot/Makefile
··· 42 42 43 43 src-wlib := string.S crt0.S stdio.c main.c flatdevtree.c flatdevtree_misc.c \ 44 44 ns16550.c serial.c simple_alloc.c div64.S util.S \ 45 - gunzip_util.c $(zlib) devtree.c 45 + gunzip_util.c elf_util.c $(zlib) devtree.c 46 46 src-plat := of.c 47 47 src-boot := $(src-wlib) $(src-plat) empty.c 48 48
+8
arch/powerpc/boot/elf.h
··· 146 146 #define ELFOSABI_NONE 0 147 147 #define ELFOSABI_LINUX 3 148 148 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 + 149 157 #endif /* _PPC_BOOT_ELF_H_ */
+76
arch/powerpc/boot/elf_util.c
··· 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 && 30 + elf64->e_type == ET_EXEC && 31 + elf64->e_machine == EM_PPC64)) 32 + return 0; 33 + 34 + elf64ph = (Elf64_Phdr *)((unsigned long)elf64 + 35 + (unsigned long)elf64->e_phoff); 36 + for (i = 0; i < (unsigned int)elf64->e_phnum; i++, elf64ph++) 37 + if (elf64ph->p_type == PT_LOAD) 38 + break; 39 + if (i >= (unsigned int)elf64->e_phnum) 40 + return 0; 41 + 42 + info->loadsize = (unsigned long)elf64ph->p_filesz; 43 + info->memsize = (unsigned long)elf64ph->p_memsz; 44 + info->elfoffset = (unsigned long)elf64ph->p_offset; 45 + 46 + return 1; 47 + } 48 + 49 + int parse_elf32(void *hdr, struct elf_info *info) 50 + { 51 + Elf32_Ehdr *elf32 = hdr; 52 + Elf32_Phdr *elf32ph; 53 + unsigned int i; 54 + 55 + if (!(elf32->e_ident[EI_MAG0] == ELFMAG0 && 56 + elf32->e_ident[EI_MAG1] == ELFMAG1 && 57 + elf32->e_ident[EI_MAG2] == ELFMAG2 && 58 + elf32->e_ident[EI_MAG3] == ELFMAG3 && 59 + elf32->e_ident[EI_CLASS] == ELFCLASS32 && 60 + elf32->e_ident[EI_DATA] == ELFDATA2MSB && 61 + elf32->e_type == ET_EXEC && 62 + elf32->e_machine == EM_PPC)) 63 + return 0; 64 + 65 + elf32ph = (Elf32_Phdr *) ((unsigned long)elf32 + elf32->e_phoff); 66 + for (i = 0; i < elf32->e_phnum; i++, elf32ph++) 67 + if (elf32ph->p_type == PT_LOAD) 68 + break; 69 + if (i >= elf32->e_phnum) 70 + return 0; 71 + 72 + info->loadsize = elf32ph->p_filesz; 73 + info->memsize = elf32ph->p_memsz; 74 + info->elfoffset = elf32ph->p_offset; 75 + return 1; 76 + }
-66
arch/powerpc/boot/main.c
··· 36 36 unsigned long size; 37 37 }; 38 38 39 - struct elf_info { 40 - unsigned long loadsize; 41 - unsigned long memsize; 42 - unsigned long elfoffset; 43 - }; 44 - 45 39 typedef void (*kernel_entry_t)(unsigned long, unsigned long, void *); 46 40 47 41 #undef DEBUG 48 - 49 - static int parse_elf64(void *hdr, struct elf_info *info) 50 - { 51 - Elf64_Ehdr *elf64 = hdr; 52 - Elf64_Phdr *elf64ph; 53 - unsigned int i; 54 - 55 - if (!(elf64->e_ident[EI_MAG0] == ELFMAG0 && 56 - elf64->e_ident[EI_MAG1] == ELFMAG1 && 57 - elf64->e_ident[EI_MAG2] == ELFMAG2 && 58 - elf64->e_ident[EI_MAG3] == ELFMAG3 && 59 - elf64->e_ident[EI_CLASS] == ELFCLASS64 && 60 - elf64->e_ident[EI_DATA] == ELFDATA2MSB && 61 - elf64->e_type == ET_EXEC && 62 - elf64->e_machine == EM_PPC64)) 63 - return 0; 64 - 65 - elf64ph = (Elf64_Phdr *)((unsigned long)elf64 + 66 - (unsigned long)elf64->e_phoff); 67 - for (i = 0; i < (unsigned int)elf64->e_phnum; i++, elf64ph++) 68 - if (elf64ph->p_type == PT_LOAD) 69 - break; 70 - if (i >= (unsigned int)elf64->e_phnum) 71 - return 0; 72 - 73 - info->loadsize = (unsigned long)elf64ph->p_filesz; 74 - info->memsize = (unsigned long)elf64ph->p_memsz; 75 - info->elfoffset = (unsigned long)elf64ph->p_offset; 76 - 77 - return 1; 78 - } 79 - 80 - static int parse_elf32(void *hdr, struct elf_info *info) 81 - { 82 - Elf32_Ehdr *elf32 = hdr; 83 - Elf32_Phdr *elf32ph; 84 - unsigned int i; 85 - 86 - if (!(elf32->e_ident[EI_MAG0] == ELFMAG0 && 87 - elf32->e_ident[EI_MAG1] == ELFMAG1 && 88 - elf32->e_ident[EI_MAG2] == ELFMAG2 && 89 - elf32->e_ident[EI_MAG3] == ELFMAG3 && 90 - elf32->e_ident[EI_CLASS] == ELFCLASS32 && 91 - elf32->e_ident[EI_DATA] == ELFDATA2MSB && 92 - elf32->e_type == ET_EXEC && 93 - elf32->e_machine == EM_PPC)) 94 - return 0; 95 - 96 - elf32ph = (Elf32_Phdr *) ((unsigned long)elf32 + elf32->e_phoff); 97 - for (i = 0; i < elf32->e_phnum; i++, elf32ph++) 98 - if (elf32ph->p_type == PT_LOAD) 99 - break; 100 - if (i >= elf32->e_phnum) 101 - return 0; 102 - 103 - info->loadsize = elf32ph->p_filesz; 104 - info->memsize = elf32ph->p_memsz; 105 - info->elfoffset = elf32ph->p_offset; 106 - return 1; 107 - } 108 42 109 43 static struct addr_range prep_kernel(void) 110 44 {