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