xref: /optee_os/ldelf/include/ldelf.h (revision 65137432d3a42d885777bf65d65952e3bae53e80)
17509ff7cSJens Wiklander /* SPDX-License-Identifier: BSD-2-Clause */
27509ff7cSJens Wiklander /*
37509ff7cSJens Wiklander  * Copyright (c) 2019, Linaro Limited
47509ff7cSJens Wiklander  */
57509ff7cSJens Wiklander 
67509ff7cSJens Wiklander #ifndef __LDELF_H
77509ff7cSJens Wiklander #define __LDELF_H
87509ff7cSJens Wiklander 
9*65137432SJens Wiklander #include <types_ext.h>
107509ff7cSJens Wiklander #include <tee_api_types.h>
117509ff7cSJens Wiklander 
127509ff7cSJens Wiklander /* Size of stack for TEE Core to allocate */
137509ff7cSJens Wiklander #define LDELF_STACK_SIZE	(4096 * 2)
147509ff7cSJens Wiklander 
157509ff7cSJens Wiklander /*
167509ff7cSJens Wiklander  * struct ldelf_arg - argument for ldelf
177509ff7cSJens Wiklander  * @uuid:	[in] UUID of TA to load
187509ff7cSJens Wiklander  * @is_32bit:	[out] 1 if a 32bit TA or 0 if a 64bit TA
197509ff7cSJens Wiklander  * @flags:	[out] Flags field of TA header
207509ff7cSJens Wiklander  * @entry_func:	[out] TA entry function
217509ff7cSJens Wiklander  * @stack_ptr:	[out] TA stack pointer
22*65137432SJens Wiklander  * @dump_entry: [out] Dump TA mappings and stack trace
237509ff7cSJens Wiklander  */
247509ff7cSJens Wiklander struct ldelf_arg {
257509ff7cSJens Wiklander 	TEE_UUID uuid;
267509ff7cSJens Wiklander 	uint32_t is_32bit;
277509ff7cSJens Wiklander 	uint32_t flags;
287509ff7cSJens Wiklander 	uint64_t entry_func;
297509ff7cSJens Wiklander 	uint64_t stack_ptr;
30*65137432SJens Wiklander 	uint64_t dump_entry;
31*65137432SJens Wiklander };
32*65137432SJens Wiklander 
33*65137432SJens Wiklander #define DUMP_MAP_READ	BIT(0)
34*65137432SJens Wiklander #define DUMP_MAP_WRITE	BIT(1)
35*65137432SJens Wiklander #define DUMP_MAP_EXEC	BIT(2)
36*65137432SJens Wiklander #define DUMP_MAP_SECURE	BIT(3)
37*65137432SJens Wiklander #define DUMP_MAP_EPHEM	BIT(4)
38*65137432SJens Wiklander #define DUMP_MAP_LDELF	BIT(7)
39*65137432SJens Wiklander 
40*65137432SJens Wiklander /*
41*65137432SJens Wiklander  * struct dump_entry_arg - argument for ldelf_dump()
42*65137432SJens Wiklander  */
43*65137432SJens Wiklander struct dump_entry_arg {
44*65137432SJens Wiklander 	union {
45*65137432SJens Wiklander 		struct {
46*65137432SJens Wiklander 			uint32_t regs[16];
47*65137432SJens Wiklander 		} arm32;
48*65137432SJens Wiklander 		struct {
49*65137432SJens Wiklander 			uint64_t fp;
50*65137432SJens Wiklander 			uint64_t sp;
51*65137432SJens Wiklander 			uint64_t pc;
52*65137432SJens Wiklander 		} arm64;
53*65137432SJens Wiklander 	};
54*65137432SJens Wiklander 	bool is_arm32;
55*65137432SJens Wiklander 	size_t num_maps;
56*65137432SJens Wiklander 	struct dump_map {
57*65137432SJens Wiklander 		vaddr_t va;
58*65137432SJens Wiklander 		paddr_t pa;
59*65137432SJens Wiklander 		size_t sz;
60*65137432SJens Wiklander 		uint32_t flags;
61*65137432SJens Wiklander 	} maps[];
627509ff7cSJens Wiklander };
637509ff7cSJens Wiklander 
647509ff7cSJens Wiklander /*
657509ff7cSJens Wiklander  * ldelf is loaded into memory by TEE Core. BSS is initialized and a
667509ff7cSJens Wiklander  * stack is allocated and supplied in SP register. A struct ldelf_arg
677509ff7cSJens Wiklander  * is placed in the stack and a pointer to the struct is provided in
687509ff7cSJens Wiklander  * r0/x0.
697509ff7cSJens Wiklander  *
707509ff7cSJens Wiklander  * ldelf relocates itself to the address where it is loaded before the main
717509ff7cSJens Wiklander  * C routine is called.
727509ff7cSJens Wiklander  *
737509ff7cSJens Wiklander  * In the main C routine the TA is loaded using the PTA System interface.
747509ff7cSJens Wiklander  */
757509ff7cSJens Wiklander 
767509ff7cSJens Wiklander #endif /*__LDELF_H*/
77