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