aboutsummaryrefslogtreecommitdiffstats
path: root/arch/powerpc/boot/main.c
diff options
context:
space:
mode:
authorMark A. Greer <mgreer@mvista.com>2007-03-27 18:29:50 -0400
committerPaul Mackerras <paulus@samba.org>2007-04-12 13:55:16 -0400
commit88e687313e683ee006152d611b95f40900e3bce0 (patch)
treef4929de1202fb2f16bce5b5bfc144b60c7f9571b /arch/powerpc/boot/main.c
parent5e41763ae9b4b6335fab88da85600f16d7a5a7b5 (diff)
[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>
Diffstat (limited to 'arch/powerpc/boot/main.c')
-rw-r--r--arch/powerpc/boot/main.c66
1 files changed, 0 insertions, 66 deletions
diff --git a/arch/powerpc/boot/main.c b/arch/powerpc/boot/main.c
index 03c0ccaecf2..30390621203 100644
--- a/arch/powerpc/boot/main.c
+++ b/arch/powerpc/boot/main.c
@@ -36,76 +36,10 @@ struct addr_range {
36 unsigned long size; 36 unsigned long size;
37}; 37};
38 38
39struct elf_info {
40 unsigned long loadsize;
41 unsigned long memsize;
42 unsigned long elfoffset;
43};
44
45typedef void (*kernel_entry_t)(unsigned long, unsigned long, void *); 39typedef void (*kernel_entry_t)(unsigned long, unsigned long, void *);
46 40
47#undef DEBUG 41#undef DEBUG
48 42
49static 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
80static 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
109static struct addr_range prep_kernel(void) 43static struct addr_range prep_kernel(void)
110{ 44{
111 char elfheader[256]; 45 char elfheader[256];