1/*
2 * Copyright 2017, Data61
3 * Commonwealth Scientific and Industrial Research Organisation (CSIRO)
4 * ABN 41 687 119 230.
5 *
6 * This software may be distributed and modified according to the terms of
7 * the GNU General Public License version 2. Note that NO WARRANTY is provided.
8 * See "LICENSE_GPLv2.txt" for details.
9 *
10 * @TAG(DATA61_GPL)
11 */
12
13#include <arch/kernel/elf.h>
14#include <linker.h>
15
16BOOT_CODE bool_t
17elf_checkFile(Elf64_Header_t *elf)
18{
19    return (
20               elf->e_ident[0] == '\177' &&
21               elf->e_ident[1] == 'E'    &&
22               elf->e_ident[2] == 'L'    &&
23               elf->e_ident[3] == 'F'    &&
24               elf->e_ident[4] == 2
25           );
26}
27
28
29BOOT_CODE v_region_t
30elf_getMemoryBounds(Elf64_Header_t *elf)
31{
32    v_region_t  elf_reg;
33    vptr_t      sect_start;
34    vptr_t      sect_end;
35    uint32_t    i;
36    Elf64_Phdr_t *phdr = (Elf64_Phdr_t *)((paddr_t)elf + elf->e_phoff);
37
38    elf_reg.start = 0x7fffffffffffffffUL;
39    elf_reg.end = 0;
40
41    for (i = 0; i < elf->e_phnum; i++) {
42        if (phdr[i].p_memsz > 0) {
43            sect_start = phdr[i].p_vaddr;
44            sect_end = sect_start + phdr[i].p_memsz;
45            if (sect_start < elf_reg.start) {
46                elf_reg.start = sect_start;
47            }
48            if (sect_end > elf_reg.end) {
49                elf_reg.end = sect_end;
50            }
51        }
52    }
53
54    return elf_reg;
55}
56
57BOOT_CODE void
58elf_load(Elf64_Header_t *elf, seL4_Word offset)
59{
60    paddr_t     src;
61    paddr_t     dst;
62    uint64_t    len;
63    uint32_t    i;
64    Elf64_Phdr_t *phdr = (Elf64_Phdr_t *)((paddr_t)elf + elf->e_phoff);
65
66    for (i = 0; i < elf->e_phnum; i++) {
67        src = (paddr_t)elf + phdr[i].p_offset;
68        dst = phdr[i].p_vaddr + offset;
69        len = phdr[i].p_filesz;
70        memcpy((void *)dst, (char *)src, len);
71        dst += len;
72        memset((void *)dst, 0, phdr[i].p_memsz - len);
73    }
74}
75