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