1 // Copyright 2008-2009 Segher Boessenkool <segher@kernel.crashing.org>
2 // This code is licensed to you under the terms of the GNU GPL, version 2;
3 // see file COPYING or http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt
8 // Determine if a valid ELF image exists at the given memory location.
10 int valid_elf_image(void *addr)
14 return header[0] == 0x7f454c46 // ELF
15 && header[1] == 0x01020100 // 32-bit, BE, ELF v1, SVR
16 && header[4] == 0x00020014 // executable, PowerPC
17 && header[5] == 1 // object file v1
18 && (header[10] & 0xffff) == 32; // PHDR size
22 // Returns the entry point address.
24 void *load_elf_image(void *addr)
27 u32 *phdr = addr + header[7];
28 u32 n = header[11] >> 16;
31 for (i = 0; i < n; i++, phdr += 8) {
32 if (phdr[0] != 1) // PT_LOAD
36 void *dest = (void *)phdr[3];
40 memcpy(dest, addr + off, filesz);
41 memset(dest + filesz, 0, memsz - filesz);
43 sync_before_exec(dest, memsz);
46 return (void *)header[6];