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