Initial commit
[savezelda.git] / loader / elf.c
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
4
5 #include "loader.h"
6
7
8 // Determine if a valid ELF image exists at the given memory location.
9
10 int valid_elf_image(void *addr)
11 {
12         u32 *header = addr;
13
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
19 }
20
21
22 // Returns the entry point address.
23
24 void *load_elf_image(void *addr)
25 {
26         u32 *header = addr;
27         u32 *phdr = addr + header[7];
28         u32 n = header[11] >> 16;
29         u32 i;
30
31         for (i = 0; i < n; i++, phdr += 8) {
32                 if (phdr[0] != 1)       // PT_LOAD
33                         continue;
34
35                 u32 off = phdr[1];
36                 void *dest = (void *)phdr[3];
37                 u32 filesz = phdr[4];
38                 u32 memsz = phdr[5];
39
40                 memcpy(dest, addr + off, filesz);
41                 memset(dest + filesz, 0, memsz - filesz);
42
43                 sync_before_exec(dest, memsz);
44         }
45
46         return (void *)header[6];
47 }