1*7509ff7cSJens Wiklander /* SPDX-License-Identifier: BSD-2-Clause */ 2*7509ff7cSJens Wiklander /* 3*7509ff7cSJens Wiklander * Copyright (c) 2019, Linaro Limited 4*7509ff7cSJens Wiklander */ 5*7509ff7cSJens Wiklander 6*7509ff7cSJens Wiklander #ifndef TA_ELF_H 7*7509ff7cSJens Wiklander #define TA_ELF_H 8*7509ff7cSJens Wiklander 9*7509ff7cSJens Wiklander #include <sys/queue.h> 10*7509ff7cSJens Wiklander #include <tee_api_types.h> 11*7509ff7cSJens Wiklander #include <types_ext.h> 12*7509ff7cSJens Wiklander 13*7509ff7cSJens Wiklander struct segment { 14*7509ff7cSJens Wiklander size_t offset; 15*7509ff7cSJens Wiklander size_t vaddr; 16*7509ff7cSJens Wiklander size_t filesz; 17*7509ff7cSJens Wiklander size_t memsz; 18*7509ff7cSJens Wiklander size_t flags; 19*7509ff7cSJens Wiklander size_t align; 20*7509ff7cSJens Wiklander bool remapped_writeable; 21*7509ff7cSJens Wiklander TAILQ_ENTRY(segment) link; 22*7509ff7cSJens Wiklander }; 23*7509ff7cSJens Wiklander 24*7509ff7cSJens Wiklander TAILQ_HEAD(segment_head, segment); 25*7509ff7cSJens Wiklander 26*7509ff7cSJens Wiklander struct ta_elf { 27*7509ff7cSJens Wiklander bool is_main; 28*7509ff7cSJens Wiklander bool is_32bit; /* Initialized from Elf32_Ehdr/Elf64_Ehdr */ 29*7509ff7cSJens Wiklander bool is_legacy; 30*7509ff7cSJens Wiklander 31*7509ff7cSJens Wiklander vaddr_t load_addr; 32*7509ff7cSJens Wiklander vaddr_t max_addr; 33*7509ff7cSJens Wiklander vaddr_t max_offs; 34*7509ff7cSJens Wiklander 35*7509ff7cSJens Wiklander vaddr_t ehdr_addr; 36*7509ff7cSJens Wiklander 37*7509ff7cSJens Wiklander /* Initialized from Elf32_Ehdr/Elf64_Ehdr */ 38*7509ff7cSJens Wiklander vaddr_t e_entry; 39*7509ff7cSJens Wiklander vaddr_t e_phoff; 40*7509ff7cSJens Wiklander vaddr_t e_shoff; 41*7509ff7cSJens Wiklander unsigned int e_phnum; 42*7509ff7cSJens Wiklander unsigned int e_shnum; 43*7509ff7cSJens Wiklander unsigned int e_phentsize; 44*7509ff7cSJens Wiklander unsigned int e_shentsize; 45*7509ff7cSJens Wiklander 46*7509ff7cSJens Wiklander void *phdr; 47*7509ff7cSJens Wiklander void *shdr; 48*7509ff7cSJens Wiklander /* 49*7509ff7cSJens Wiklander * dynsymtab and dynstr are used for external symbols, they may hold 50*7509ff7cSJens Wiklander * other symbols too. 51*7509ff7cSJens Wiklander */ 52*7509ff7cSJens Wiklander void *dynsymtab; 53*7509ff7cSJens Wiklander size_t num_dynsyms; 54*7509ff7cSJens Wiklander const char *dynstr; 55*7509ff7cSJens Wiklander size_t dynstr_size; 56*7509ff7cSJens Wiklander 57*7509ff7cSJens Wiklander struct segment_head segs; 58*7509ff7cSJens Wiklander 59*7509ff7cSJens Wiklander uint32_t handle; 60*7509ff7cSJens Wiklander 61*7509ff7cSJens Wiklander TEE_UUID uuid; 62*7509ff7cSJens Wiklander TAILQ_ENTRY(ta_elf) link; 63*7509ff7cSJens Wiklander }; 64*7509ff7cSJens Wiklander 65*7509ff7cSJens Wiklander TAILQ_HEAD(ta_elf_queue, ta_elf); 66*7509ff7cSJens Wiklander 67*7509ff7cSJens Wiklander extern struct ta_elf_queue main_elf_queue; 68*7509ff7cSJens Wiklander 69*7509ff7cSJens Wiklander void ta_elf_load_main(const TEE_UUID *uuid, uint32_t *is_32bit, 70*7509ff7cSJens Wiklander uint64_t *entry, uint64_t *sp, uint32_t *ta_flags); 71*7509ff7cSJens Wiklander void ta_elf_load_dependency(struct ta_elf *elf, bool is_32bit); 72*7509ff7cSJens Wiklander void ta_elf_relocate(struct ta_elf *elf); 73*7509ff7cSJens Wiklander void ta_elf_finalize_mappings(struct ta_elf *elf); 74*7509ff7cSJens Wiklander 75*7509ff7cSJens Wiklander #endif /*TA_ELF_H*/ 76