xref: /optee_os/ldelf/include/ldelf.h (revision af78e1b12bddf2abe7115d2023b599a25ad84fd5)
17509ff7cSJens Wiklander /* SPDX-License-Identifier: BSD-2-Clause */
27509ff7cSJens Wiklander /*
37509ff7cSJens Wiklander  * Copyright (c) 2019, Linaro Limited
4*af78e1b1SImre Kis  * Copyright (c) 2020-2023, Arm Limited
574f6dd9bSMarouene Boubakri  * Copyright 2022-2023 NXP
67509ff7cSJens Wiklander  */
77509ff7cSJens Wiklander 
87509ff7cSJens Wiklander #ifndef __LDELF_H
97509ff7cSJens Wiklander #define __LDELF_H
107509ff7cSJens Wiklander 
11baa5161dSBalint Dobszay #ifndef __ASSEMBLER__
1265137432SJens Wiklander #include <types_ext.h>
137509ff7cSJens Wiklander #include <tee_api_types.h>
14f90488afSSumit Garg #include <user_ta_header.h>
157509ff7cSJens Wiklander 
167509ff7cSJens Wiklander /* Size of stack for TEE Core to allocate */
177509ff7cSJens Wiklander #define LDELF_STACK_SIZE	(4096 * 2)
187509ff7cSJens Wiklander 
197509ff7cSJens Wiklander /*
207509ff7cSJens Wiklander  * struct ldelf_arg - argument for ldelf
217509ff7cSJens Wiklander  * @uuid:	  [in] UUID of TA to load
227509ff7cSJens Wiklander  * @is_32bit:	  [out] 1 if a 32bit TA or 0 if a 64bit TA
237509ff7cSJens Wiklander  * @flags:	  [out] Flags field of TA header
247509ff7cSJens Wiklander  * @entry_func:	  [out] TA entry function
257509ff7cSJens Wiklander  * @stack_ptr:	  [out] TA stack pointer
2665137432SJens Wiklander  * @dump_entry:	  [out] Dump TA mappings and stack trace
27c86f218cSJens Wiklander  * @ftrace_entry: [out] Dump TA mappings and ftrace buffer
28f90488afSSumit Garg  * @fbuf:         [out] ftrace buffer pointer
29ebef121cSJerome Forissier  * @dl_entry:     [out] Dynamic linking interface (for libdl)
307509ff7cSJens Wiklander  */
317509ff7cSJens Wiklander struct ldelf_arg {
327509ff7cSJens Wiklander 	TEE_UUID uuid;
337509ff7cSJens Wiklander 	uint32_t is_32bit;
347509ff7cSJens Wiklander 	uint32_t flags;
357509ff7cSJens Wiklander 	uint64_t entry_func;
36*af78e1b1SImre Kis 	uint64_t load_addr;
377509ff7cSJens Wiklander 	uint64_t stack_ptr;
3865137432SJens Wiklander 	uint64_t dump_entry;
39c86f218cSJens Wiklander 	uint64_t ftrace_entry;
40ebef121cSJerome Forissier 	uint64_t dl_entry;
41f90488afSSumit Garg 	struct ftrace_buf *fbuf;
4265137432SJens Wiklander };
4365137432SJens Wiklander 
4465137432SJens Wiklander #define DUMP_MAP_READ	BIT(0)
4565137432SJens Wiklander #define DUMP_MAP_WRITE	BIT(1)
4665137432SJens Wiklander #define DUMP_MAP_EXEC	BIT(2)
4765137432SJens Wiklander #define DUMP_MAP_SECURE	BIT(3)
4865137432SJens Wiklander #define DUMP_MAP_EPHEM	BIT(4)
4965137432SJens Wiklander #define DUMP_MAP_LDELF	BIT(7)
5065137432SJens Wiklander 
5165137432SJens Wiklander /*
529aed8c32SJerome Forissier  * struct dump_entry_arg - argument for ldelf_arg::dump_entry()
5365137432SJens Wiklander  */
5465137432SJens Wiklander struct dump_entry_arg {
5565137432SJens Wiklander 	union {
5665137432SJens Wiklander 		struct {
5765137432SJens Wiklander 			uint32_t regs[16];
5865137432SJens Wiklander 		} arm32;
5965137432SJens Wiklander 		struct {
6065137432SJens Wiklander 			uint64_t fp;
6165137432SJens Wiklander 			uint64_t sp;
6265137432SJens Wiklander 			uint64_t pc;
6365137432SJens Wiklander 		} arm64;
6474f6dd9bSMarouene Boubakri 		struct {
6574f6dd9bSMarouene Boubakri 			unsigned long fp;
6674f6dd9bSMarouene Boubakri 			unsigned long sp;
6774f6dd9bSMarouene Boubakri 			unsigned long pc;
6874f6dd9bSMarouene Boubakri 		} rv;
6965137432SJens Wiklander 	};
70cb5f271cSMarouene Boubakri 	bool is_32bit;
7165137432SJens Wiklander 	size_t num_maps;
7265137432SJens Wiklander 	struct dump_map {
7365137432SJens Wiklander 		vaddr_t va;
7465137432SJens Wiklander 		paddr_t pa;
7565137432SJens Wiklander 		size_t sz;
7665137432SJens Wiklander 		uint32_t flags;
7765137432SJens Wiklander 	} maps[];
787509ff7cSJens Wiklander };
797509ff7cSJens Wiklander 
807509ff7cSJens Wiklander /*
81ebef121cSJerome Forissier  * struct dl_entry_arg - argument for ldelf_arg::dl_entry()
82ebef121cSJerome Forissier  */
83ebef121cSJerome Forissier struct dl_entry_arg {
84ebef121cSJerome Forissier 	uint32_t cmd;
85ebef121cSJerome Forissier 	TEE_Result ret;
86ebef121cSJerome Forissier 	union {
87ebef121cSJerome Forissier 		struct {
88ebef121cSJerome Forissier 			TEE_UUID uuid;	/* in */
89ebef121cSJerome Forissier 			uint32_t flags;	/* in */
90ebef121cSJerome Forissier 		} dlopen;
91ebef121cSJerome Forissier 		struct {
92ebef121cSJerome Forissier 			TEE_UUID uuid;	/* in */
93ebef121cSJerome Forissier 			vaddr_t val;	/* out */
94ebef121cSJerome Forissier 			char symbol[];	/* in */
95ebef121cSJerome Forissier 		} dlsym;
96ebef121cSJerome Forissier 	};
97ebef121cSJerome Forissier };
98ebef121cSJerome Forissier 
99ebef121cSJerome Forissier /*
100ebef121cSJerome Forissier  * Values for dl_entry_arg::cmd
101ebef121cSJerome Forissier  */
102ebef121cSJerome Forissier #define LDELF_DL_ENTRY_DLOPEN	0
103ebef121cSJerome Forissier #define LDELF_DL_ENTRY_DLSYM	1
104ebef121cSJerome Forissier 
105ebef121cSJerome Forissier /*
106ebef121cSJerome Forissier  * Values for dl_entry_arg::dlopen::flags
107ebef121cSJerome Forissier  */
108ebef121cSJerome Forissier #define RTLD_NOW	2
109ebef121cSJerome Forissier #define RTLD_GLOBAL	0x100
110ebef121cSJerome Forissier #define RTLD_NODELETE	0x1000
111ebef121cSJerome Forissier 
112baa5161dSBalint Dobszay #define LDELF_MAP_FLAG_SHAREABLE	BIT32(0)
113baa5161dSBalint Dobszay #define LDELF_MAP_FLAG_WRITEABLE	BIT32(1)
114baa5161dSBalint Dobszay #define LDELF_MAP_FLAG_EXECUTABLE	BIT32(2)
1150d482f82SRuchika Gupta #define LDELF_MAP_FLAG_BTI		BIT32(3)
116baa5161dSBalint Dobszay 
117baa5161dSBalint Dobszay #endif /*!__ASSEMBLER__*/
118baa5161dSBalint Dobszay 
119baa5161dSBalint Dobszay #define LDELF_RETURN		0
120baa5161dSBalint Dobszay #define LDELF_LOG		1
121baa5161dSBalint Dobszay #define LDELF_PANIC		2
122baa5161dSBalint Dobszay #define LDELF_MAP_ZI		3
123baa5161dSBalint Dobszay #define LDELF_UNMAP		4
124baa5161dSBalint Dobszay #define LDELF_OPEN_BIN		5
125baa5161dSBalint Dobszay #define LDELF_CLOSE_BIN		6
126baa5161dSBalint Dobszay #define LDELF_MAP_BIN		7
127baa5161dSBalint Dobszay #define LDELF_CP_FROM_BIN	8
128baa5161dSBalint Dobszay #define LDELF_SET_PROT		9
129baa5161dSBalint Dobszay #define LDELF_REMAP		10
130baa5161dSBalint Dobszay #define LDELF_GEN_RND_NUM	11
131baa5161dSBalint Dobszay 
132baa5161dSBalint Dobszay #define LDELF_SCN_MAX		11
133baa5161dSBalint Dobszay 
134ebef121cSJerome Forissier /*
1357509ff7cSJens Wiklander  * ldelf is loaded into memory by TEE Core. BSS is initialized and a
1367509ff7cSJens Wiklander  * stack is allocated and supplied in SP register. A struct ldelf_arg
1377509ff7cSJens Wiklander  * is placed in the stack and a pointer to the struct is provided in
13874f6dd9bSMarouene Boubakri  * r0/x0 on ARM and in a0/x10 on RISC-V.
1397509ff7cSJens Wiklander  *
1407509ff7cSJens Wiklander  * ldelf relocates itself to the address where it is loaded before the main
1417509ff7cSJens Wiklander  * C routine is called.
1427509ff7cSJens Wiklander  *
1437509ff7cSJens Wiklander  * In the main C routine the TA is loaded using the PTA System interface.
1447509ff7cSJens Wiklander  */
1457509ff7cSJens Wiklander 
1467509ff7cSJens Wiklander #endif /*__LDELF_H*/
147