xref: /optee_os/ldelf/include/ldelf.h (revision 74f6dd9bbb68b3dc3d475da445d84cccafd4d94d)
17509ff7cSJens Wiklander /* SPDX-License-Identifier: BSD-2-Clause */
27509ff7cSJens Wiklander /*
37509ff7cSJens Wiklander  * Copyright (c) 2019, Linaro Limited
4baa5161dSBalint Dobszay  * Copyright (c) 2020, Arm Limited
5*74f6dd9bSMarouene 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;
367509ff7cSJens Wiklander 	uint64_t stack_ptr;
3765137432SJens Wiklander 	uint64_t dump_entry;
38c86f218cSJens Wiklander 	uint64_t ftrace_entry;
39ebef121cSJerome Forissier 	uint64_t dl_entry;
40f90488afSSumit Garg 	struct ftrace_buf *fbuf;
4165137432SJens Wiklander };
4265137432SJens Wiklander 
4365137432SJens Wiklander #define DUMP_MAP_READ	BIT(0)
4465137432SJens Wiklander #define DUMP_MAP_WRITE	BIT(1)
4565137432SJens Wiklander #define DUMP_MAP_EXEC	BIT(2)
4665137432SJens Wiklander #define DUMP_MAP_SECURE	BIT(3)
4765137432SJens Wiklander #define DUMP_MAP_EPHEM	BIT(4)
4865137432SJens Wiklander #define DUMP_MAP_LDELF	BIT(7)
4965137432SJens Wiklander 
5065137432SJens Wiklander /*
519aed8c32SJerome Forissier  * struct dump_entry_arg - argument for ldelf_arg::dump_entry()
5265137432SJens Wiklander  */
5365137432SJens Wiklander struct dump_entry_arg {
5465137432SJens Wiklander 	union {
5565137432SJens Wiklander 		struct {
5665137432SJens Wiklander 			uint32_t regs[16];
5765137432SJens Wiklander 		} arm32;
5865137432SJens Wiklander 		struct {
5965137432SJens Wiklander 			uint64_t fp;
6065137432SJens Wiklander 			uint64_t sp;
6165137432SJens Wiklander 			uint64_t pc;
6265137432SJens Wiklander 		} arm64;
63*74f6dd9bSMarouene Boubakri 		struct {
64*74f6dd9bSMarouene Boubakri 			unsigned long fp;
65*74f6dd9bSMarouene Boubakri 			unsigned long sp;
66*74f6dd9bSMarouene Boubakri 			unsigned long pc;
67*74f6dd9bSMarouene Boubakri 		} rv;
6865137432SJens Wiklander 	};
69cb5f271cSMarouene Boubakri 	bool is_32bit;
7065137432SJens Wiklander 	size_t num_maps;
7165137432SJens Wiklander 	struct dump_map {
7265137432SJens Wiklander 		vaddr_t va;
7365137432SJens Wiklander 		paddr_t pa;
7465137432SJens Wiklander 		size_t sz;
7565137432SJens Wiklander 		uint32_t flags;
7665137432SJens Wiklander 	} maps[];
777509ff7cSJens Wiklander };
787509ff7cSJens Wiklander 
797509ff7cSJens Wiklander /*
80ebef121cSJerome Forissier  * struct dl_entry_arg - argument for ldelf_arg::dl_entry()
81ebef121cSJerome Forissier  */
82ebef121cSJerome Forissier struct dl_entry_arg {
83ebef121cSJerome Forissier 	uint32_t cmd;
84ebef121cSJerome Forissier 	TEE_Result ret;
85ebef121cSJerome Forissier 	union {
86ebef121cSJerome Forissier 		struct {
87ebef121cSJerome Forissier 			TEE_UUID uuid;	/* in */
88ebef121cSJerome Forissier 			uint32_t flags;	/* in */
89ebef121cSJerome Forissier 		} dlopen;
90ebef121cSJerome Forissier 		struct {
91ebef121cSJerome Forissier 			TEE_UUID uuid;	/* in */
92ebef121cSJerome Forissier 			vaddr_t val;	/* out */
93ebef121cSJerome Forissier 			char symbol[];	/* in */
94ebef121cSJerome Forissier 		} dlsym;
95ebef121cSJerome Forissier 	};
96ebef121cSJerome Forissier };
97ebef121cSJerome Forissier 
98ebef121cSJerome Forissier /*
99ebef121cSJerome Forissier  * Values for dl_entry_arg::cmd
100ebef121cSJerome Forissier  */
101ebef121cSJerome Forissier #define LDELF_DL_ENTRY_DLOPEN	0
102ebef121cSJerome Forissier #define LDELF_DL_ENTRY_DLSYM	1
103ebef121cSJerome Forissier 
104ebef121cSJerome Forissier /*
105ebef121cSJerome Forissier  * Values for dl_entry_arg::dlopen::flags
106ebef121cSJerome Forissier  */
107ebef121cSJerome Forissier #define RTLD_NOW	2
108ebef121cSJerome Forissier #define RTLD_GLOBAL	0x100
109ebef121cSJerome Forissier #define RTLD_NODELETE	0x1000
110ebef121cSJerome Forissier 
111baa5161dSBalint Dobszay #define LDELF_MAP_FLAG_SHAREABLE	BIT32(0)
112baa5161dSBalint Dobszay #define LDELF_MAP_FLAG_WRITEABLE	BIT32(1)
113baa5161dSBalint Dobszay #define LDELF_MAP_FLAG_EXECUTABLE	BIT32(2)
1140d482f82SRuchika Gupta #define LDELF_MAP_FLAG_BTI		BIT32(3)
115baa5161dSBalint Dobszay 
116baa5161dSBalint Dobszay #endif /*!__ASSEMBLER__*/
117baa5161dSBalint Dobszay 
118baa5161dSBalint Dobszay #define LDELF_RETURN		0
119baa5161dSBalint Dobszay #define LDELF_LOG		1
120baa5161dSBalint Dobszay #define LDELF_PANIC		2
121baa5161dSBalint Dobszay #define LDELF_MAP_ZI		3
122baa5161dSBalint Dobszay #define LDELF_UNMAP		4
123baa5161dSBalint Dobszay #define LDELF_OPEN_BIN		5
124baa5161dSBalint Dobszay #define LDELF_CLOSE_BIN		6
125baa5161dSBalint Dobszay #define LDELF_MAP_BIN		7
126baa5161dSBalint Dobszay #define LDELF_CP_FROM_BIN	8
127baa5161dSBalint Dobszay #define LDELF_SET_PROT		9
128baa5161dSBalint Dobszay #define LDELF_REMAP		10
129baa5161dSBalint Dobszay #define LDELF_GEN_RND_NUM	11
130baa5161dSBalint Dobszay 
131baa5161dSBalint Dobszay #define LDELF_SCN_MAX		11
132baa5161dSBalint Dobszay 
133ebef121cSJerome Forissier /*
1347509ff7cSJens Wiklander  * ldelf is loaded into memory by TEE Core. BSS is initialized and a
1357509ff7cSJens Wiklander  * stack is allocated and supplied in SP register. A struct ldelf_arg
1367509ff7cSJens Wiklander  * is placed in the stack and a pointer to the struct is provided in
137*74f6dd9bSMarouene Boubakri  * r0/x0 on ARM and in a0/x10 on RISC-V.
1387509ff7cSJens Wiklander  *
1397509ff7cSJens Wiklander  * ldelf relocates itself to the address where it is loaded before the main
1407509ff7cSJens Wiklander  * C routine is called.
1417509ff7cSJens Wiklander  *
1427509ff7cSJens Wiklander  * In the main C routine the TA is loaded using the PTA System interface.
1437509ff7cSJens Wiklander  */
1447509ff7cSJens Wiklander 
1457509ff7cSJens Wiklander #endif /*__LDELF_H*/
146