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)
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.
14 #include <l4/util/elf.h>
18 load_elf (void *elf, l4_uint32_t *vma_start, l4_uint32_t *vma_end)
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;
26 for (i = 0; i < eh->e_phnum; i++, ph++) {
27 if (ph->p_type != PT_LOAD)
30 if (ph->p_vaddr < _vma_start)
31 _vma_start = ph->p_vaddr;
33 if (ph->p_vaddr + ph->p_memsz > _vma_end)
34 _vma_end = ph->p_vaddr + ph->p_memsz;
36 memcpy ((void*)((Elf32_Addr)ph->p_paddr),
37 _elf + ph->p_offset, ph->p_filesz);
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);
45 *vma_start = _vma_start;