17509ff7cSJens Wiklander /* SPDX-License-Identifier: BSD-2-Clause */ 27509ff7cSJens Wiklander /* 37509ff7cSJens Wiklander * Copyright (c) 2019, Linaro Limited 47509ff7cSJens Wiklander */ 57509ff7cSJens Wiklander 67509ff7cSJens Wiklander #ifndef TA_ELF_H 77509ff7cSJens Wiklander #define TA_ELF_H 87509ff7cSJens Wiklander 965137432SJens Wiklander #include <ldelf.h> 107509ff7cSJens Wiklander #include <sys/queue.h> 117509ff7cSJens Wiklander #include <tee_api_types.h> 127509ff7cSJens Wiklander #include <types_ext.h> 137509ff7cSJens Wiklander 147509ff7cSJens Wiklander struct segment { 157509ff7cSJens Wiklander size_t offset; 167509ff7cSJens Wiklander size_t vaddr; 177509ff7cSJens Wiklander size_t filesz; 187509ff7cSJens Wiklander size_t memsz; 197509ff7cSJens Wiklander size_t flags; 207509ff7cSJens Wiklander size_t align; 217509ff7cSJens Wiklander bool remapped_writeable; 227509ff7cSJens Wiklander TAILQ_ENTRY(segment) link; 237509ff7cSJens Wiklander }; 247509ff7cSJens Wiklander 257509ff7cSJens Wiklander TAILQ_HEAD(segment_head, segment); 267509ff7cSJens Wiklander 277509ff7cSJens Wiklander struct ta_elf { 287509ff7cSJens Wiklander bool is_main; 297509ff7cSJens Wiklander bool is_32bit; /* Initialized from Elf32_Ehdr/Elf64_Ehdr */ 307509ff7cSJens Wiklander bool is_legacy; 317509ff7cSJens Wiklander 327509ff7cSJens Wiklander vaddr_t load_addr; 337509ff7cSJens Wiklander vaddr_t max_addr; 347509ff7cSJens Wiklander vaddr_t max_offs; 357509ff7cSJens Wiklander 367509ff7cSJens Wiklander vaddr_t ehdr_addr; 377509ff7cSJens Wiklander 387509ff7cSJens Wiklander /* Initialized from Elf32_Ehdr/Elf64_Ehdr */ 397509ff7cSJens Wiklander vaddr_t e_entry; 407509ff7cSJens Wiklander vaddr_t e_phoff; 417509ff7cSJens Wiklander vaddr_t e_shoff; 427509ff7cSJens Wiklander unsigned int e_phnum; 437509ff7cSJens Wiklander unsigned int e_shnum; 447509ff7cSJens Wiklander unsigned int e_phentsize; 457509ff7cSJens Wiklander unsigned int e_shentsize; 467509ff7cSJens Wiklander 477509ff7cSJens Wiklander void *phdr; 487509ff7cSJens Wiklander void *shdr; 497509ff7cSJens Wiklander /* 507509ff7cSJens Wiklander * dynsymtab and dynstr are used for external symbols, they may hold 517509ff7cSJens Wiklander * other symbols too. 527509ff7cSJens Wiklander */ 537509ff7cSJens Wiklander void *dynsymtab; 547509ff7cSJens Wiklander size_t num_dynsyms; 557509ff7cSJens Wiklander const char *dynstr; 567509ff7cSJens Wiklander size_t dynstr_size; 577509ff7cSJens Wiklander 587509ff7cSJens Wiklander struct segment_head segs; 597509ff7cSJens Wiklander 60*0242833aSJens Wiklander vaddr_t exidx_start; 61*0242833aSJens Wiklander size_t exidx_size; 62*0242833aSJens Wiklander 637509ff7cSJens Wiklander uint32_t handle; 647509ff7cSJens Wiklander 657509ff7cSJens Wiklander TEE_UUID uuid; 667509ff7cSJens Wiklander TAILQ_ENTRY(ta_elf) link; 677509ff7cSJens Wiklander }; 687509ff7cSJens Wiklander 697509ff7cSJens Wiklander TAILQ_HEAD(ta_elf_queue, ta_elf); 707509ff7cSJens Wiklander 717509ff7cSJens Wiklander extern struct ta_elf_queue main_elf_queue; 727509ff7cSJens Wiklander 737509ff7cSJens Wiklander void ta_elf_load_main(const TEE_UUID *uuid, uint32_t *is_32bit, 747509ff7cSJens Wiklander uint64_t *entry, uint64_t *sp, uint32_t *ta_flags); 757509ff7cSJens Wiklander void ta_elf_load_dependency(struct ta_elf *elf, bool is_32bit); 767509ff7cSJens Wiklander void ta_elf_relocate(struct ta_elf *elf); 777509ff7cSJens Wiklander void ta_elf_finalize_mappings(struct ta_elf *elf); 787509ff7cSJens Wiklander 7965137432SJens Wiklander void ta_elf_print_mappings(struct ta_elf_queue *elf_queue, size_t num_maps, 8065137432SJens Wiklander struct dump_map *maps, vaddr_t mpool_base); 81*0242833aSJens Wiklander #ifdef CFG_UNWIND 82*0242833aSJens Wiklander void ta_elf_stack_trace_a32(uint32_t regs[16]); 83*0242833aSJens Wiklander void ta_elf_stack_trace_a64(uint64_t fp, uint64_t sp, uint64_t pc); 84*0242833aSJens Wiklander #else 85*0242833aSJens Wiklander static inline void ta_elf_stack_trace_a32(uint32_t regs[16] __unused) { } 86*0242833aSJens Wiklander static inline void ta_elf_stack_trace_a64(uint64_t fp __unused, 87*0242833aSJens Wiklander uint64_t sp __unused, 88*0242833aSJens Wiklander uint64_t pc __unused) { } 89*0242833aSJens Wiklander #endif /*CFG_UNWIND*/ 907509ff7cSJens Wiklander #endif /*TA_ELF_H*/ 91