]> rtime.felk.cvut.cz Git - l4.git/blob - l4/pkg/bootstrap/server/src/ARCH-amd64/boot32/load_elf.c
9f7c39282551581b8da843f43a71e5c0f1541b35
[l4.git] / l4 / pkg / bootstrap / server / src / ARCH-amd64 / boot32 / load_elf.c
1 /*
2  * (c) 2009 Alexander Warg <warg@os.inf.tu-dresden.de>,
3  *          Frank Mehnert <fm3@os.inf.tu-dresden.de>
4  *     economic rights: Technische Universität Dresden (Germany)
5  *
6  * This file is part of TUD:OS and distributed under the terms of the
7  * GNU General Public License 2.
8  * Please see the COPYING-GPL-2 file for details.
9  */
10 #include <stdio.h>
11 #include <string.h>
12
13 #include "types.h"
14 #include <l4/util/elf.h>
15 #include "load_elf.h"
16
17 l4_uint32_t
18 load_elf (void *elf, l4_uint32_t *vma_start, l4_uint32_t *vma_end)
19 {
20   char *_elf = (char *) elf;
21   Elf64_Ehdr *eh = (Elf64_Ehdr *)(_elf);
22   Elf64_Phdr *ph = (Elf64_Phdr *)(_elf + eh->e_phoff);
23   l4_uint32_t _vma_start = ~0, _vma_end = 0;
24   int i;
25
26   for (i = 0; i < eh->e_phnum; i++, ph++) {
27     if (ph->p_type != PT_LOAD)
28       continue;
29
30     if (ph->p_vaddr < _vma_start)
31       _vma_start = ph->p_vaddr;
32     
33     if (ph->p_vaddr + ph->p_memsz > _vma_end)
34       _vma_end = ph->p_vaddr + ph->p_memsz;
35
36     memcpy ((void*)((Elf32_Addr)ph->p_paddr), 
37             _elf + ph->p_offset, ph->p_filesz);
38
39     if (ph->p_filesz < ph->p_memsz)
40       memset ((void*) ((Elf32_Addr)(ph->p_paddr + ph->p_filesz)), 0,
41                                     ph->p_memsz - ph->p_filesz);
42   }
43
44   if (vma_start)
45     *vma_start = _vma_start;
46   if (vma_end)
47     *vma_end = _vma_end;
48
49   return eh->e_entry;
50 }