xref: /optee_os/ldelf/ta_elf.h (revision 0242833aad7b016d788bfc9ab49140e42ba54182)
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