xref: /optee_os/ldelf/include/ldelf.h (revision ebef121c1f5cd813489c823c81834f83e7f5fb4e)
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 
965137432SJens Wiklander #include <types_ext.h>
107509ff7cSJens Wiklander #include <tee_api_types.h>
11f90488afSSumit Garg #include <user_ta_header.h>
127509ff7cSJens Wiklander 
137509ff7cSJens Wiklander /* Size of stack for TEE Core to allocate */
147509ff7cSJens Wiklander #define LDELF_STACK_SIZE	(4096 * 2)
157509ff7cSJens Wiklander 
167509ff7cSJens Wiklander /*
177509ff7cSJens Wiklander  * struct ldelf_arg - argument for ldelf
187509ff7cSJens Wiklander  * @uuid:	  [in] UUID of TA to load
197509ff7cSJens Wiklander  * @is_32bit:	  [out] 1 if a 32bit TA or 0 if a 64bit TA
207509ff7cSJens Wiklander  * @flags:	  [out] Flags field of TA header
217509ff7cSJens Wiklander  * @entry_func:	  [out] TA entry function
227509ff7cSJens Wiklander  * @stack_ptr:	  [out] TA stack pointer
2365137432SJens Wiklander  * @dump_entry:	  [out] Dump TA mappings and stack trace
24c86f218cSJens Wiklander  * @ftrace_entry: [out] Dump TA mappings and ftrace buffer
25f90488afSSumit Garg  * @fbuf:         [out] ftrace buffer pointer
26*ebef121cSJerome Forissier  * @dl_entry:     [out] Dynamic linking interface (for libdl)
277509ff7cSJens Wiklander  */
287509ff7cSJens Wiklander struct ldelf_arg {
297509ff7cSJens Wiklander 	TEE_UUID uuid;
307509ff7cSJens Wiklander 	uint32_t is_32bit;
317509ff7cSJens Wiklander 	uint32_t flags;
327509ff7cSJens Wiklander 	uint64_t entry_func;
337509ff7cSJens Wiklander 	uint64_t stack_ptr;
3465137432SJens Wiklander 	uint64_t dump_entry;
35c86f218cSJens Wiklander 	uint64_t ftrace_entry;
36*ebef121cSJerome Forissier 	uint64_t dl_entry;
37f90488afSSumit Garg 	struct ftrace_buf *fbuf;
3865137432SJens Wiklander };
3965137432SJens Wiklander 
4065137432SJens Wiklander #define DUMP_MAP_READ	BIT(0)
4165137432SJens Wiklander #define DUMP_MAP_WRITE	BIT(1)
4265137432SJens Wiklander #define DUMP_MAP_EXEC	BIT(2)
4365137432SJens Wiklander #define DUMP_MAP_SECURE	BIT(3)
4465137432SJens Wiklander #define DUMP_MAP_EPHEM	BIT(4)
4565137432SJens Wiklander #define DUMP_MAP_LDELF	BIT(7)
4665137432SJens Wiklander 
4765137432SJens Wiklander /*
489aed8c32SJerome Forissier  * struct dump_entry_arg - argument for ldelf_arg::dump_entry()
4965137432SJens Wiklander  */
5065137432SJens Wiklander struct dump_entry_arg {
5165137432SJens Wiklander 	union {
5265137432SJens Wiklander 		struct {
5365137432SJens Wiklander 			uint32_t regs[16];
5465137432SJens Wiklander 		} arm32;
5565137432SJens Wiklander 		struct {
5665137432SJens Wiklander 			uint64_t fp;
5765137432SJens Wiklander 			uint64_t sp;
5865137432SJens Wiklander 			uint64_t pc;
5965137432SJens Wiklander 		} arm64;
6065137432SJens Wiklander 	};
6165137432SJens Wiklander 	bool is_arm32;
6265137432SJens Wiklander 	size_t num_maps;
6365137432SJens Wiklander 	struct dump_map {
6465137432SJens Wiklander 		vaddr_t va;
6565137432SJens Wiklander 		paddr_t pa;
6665137432SJens Wiklander 		size_t sz;
6765137432SJens Wiklander 		uint32_t flags;
6865137432SJens Wiklander 	} maps[];
697509ff7cSJens Wiklander };
707509ff7cSJens Wiklander 
717509ff7cSJens Wiklander /*
72*ebef121cSJerome Forissier  * struct dl_entry_arg - argument for ldelf_arg::dl_entry()
73*ebef121cSJerome Forissier  */
74*ebef121cSJerome Forissier struct dl_entry_arg {
75*ebef121cSJerome Forissier 	uint32_t cmd;
76*ebef121cSJerome Forissier 	TEE_Result ret;
77*ebef121cSJerome Forissier 	union {
78*ebef121cSJerome Forissier 		struct {
79*ebef121cSJerome Forissier 			TEE_UUID uuid;	/* in */
80*ebef121cSJerome Forissier 			uint32_t flags;	/* in */
81*ebef121cSJerome Forissier 		} dlopen;
82*ebef121cSJerome Forissier 		struct {
83*ebef121cSJerome Forissier 			TEE_UUID uuid;	/* in */
84*ebef121cSJerome Forissier 			vaddr_t val;	/* out */
85*ebef121cSJerome Forissier 			char symbol[];	/* in */
86*ebef121cSJerome Forissier 		} dlsym;
87*ebef121cSJerome Forissier 	};
88*ebef121cSJerome Forissier };
89*ebef121cSJerome Forissier 
90*ebef121cSJerome Forissier /*
91*ebef121cSJerome Forissier  * Values for dl_entry_arg::cmd
92*ebef121cSJerome Forissier  */
93*ebef121cSJerome Forissier #define LDELF_DL_ENTRY_DLOPEN	0
94*ebef121cSJerome Forissier #define LDELF_DL_ENTRY_DLSYM	1
95*ebef121cSJerome Forissier 
96*ebef121cSJerome Forissier /*
97*ebef121cSJerome Forissier  * Values for dl_entry_arg::dlopen::flags
98*ebef121cSJerome Forissier  */
99*ebef121cSJerome Forissier #define RTLD_NOW	2
100*ebef121cSJerome Forissier #define RTLD_GLOBAL	0x100
101*ebef121cSJerome Forissier #define RTLD_NODELETE	0x1000
102*ebef121cSJerome Forissier 
103*ebef121cSJerome Forissier /*
1047509ff7cSJens Wiklander  * ldelf is loaded into memory by TEE Core. BSS is initialized and a
1057509ff7cSJens Wiklander  * stack is allocated and supplied in SP register. A struct ldelf_arg
1067509ff7cSJens Wiklander  * is placed in the stack and a pointer to the struct is provided in
1077509ff7cSJens Wiklander  * r0/x0.
1087509ff7cSJens Wiklander  *
1097509ff7cSJens Wiklander  * ldelf relocates itself to the address where it is loaded before the main
1107509ff7cSJens Wiklander  * C routine is called.
1117509ff7cSJens Wiklander  *
1127509ff7cSJens Wiklander  * In the main C routine the TA is loaded using the PTA System interface.
1137509ff7cSJens Wiklander  */
1147509ff7cSJens Wiklander 
1157509ff7cSJens Wiklander #endif /*__LDELF_H*/
116