File: ldelf.h

package info (click to toggle)
optee-os 4.8.0-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 31,960 kB
  • sloc: ansic: 444,388; asm: 12,922; python: 3,719; makefile: 1,681; sh: 238
file content (146 lines) | stat: -rw-r--r-- 3,234 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
/* SPDX-License-Identifier: BSD-2-Clause */
/*
 * Copyright (c) 2019, Linaro Limited
 * Copyright (c) 2020-2023, Arm Limited
 * Copyright 2022-2023 NXP
 */

#ifndef __LDELF_H
#define __LDELF_H

#ifndef __ASSEMBLER__
#include <types_ext.h>
#include <tee_api_types.h>
#include <user_ta_header.h>

/* Size of stack for TEE Core to allocate */
#define LDELF_STACK_SIZE	(4096 * 2)

/*
 * struct ldelf_arg - argument for ldelf
 * @uuid:	  [in] UUID of TA to load
 * @is_32bit:	  [out] 1 if a 32bit TA or 0 if a 64bit TA
 * @flags:	  [out] Flags field of TA header
 * @entry_func:	  [out] TA entry function
 * @stack_ptr:	  [out] TA stack pointer
 * @dump_entry:	  [out] Dump TA mappings and stack trace
 * @ftrace_entry: [out] Dump TA mappings and ftrace buffer
 * @fbuf:         [out] ftrace buffer pointer
 * @dl_entry:     [out] Dynamic linking interface (for libdl)
 */
struct ldelf_arg {
	TEE_UUID uuid;
	uint32_t is_32bit;
	uint32_t flags;
	uint64_t entry_func;
	uint64_t load_addr;
	uint64_t stack_ptr;
	uint64_t dump_entry;
	uint64_t ftrace_entry;
	uint64_t dl_entry;
	struct ftrace_buf *fbuf;
};

#define DUMP_MAP_READ	BIT(0)
#define DUMP_MAP_WRITE	BIT(1)
#define DUMP_MAP_EXEC	BIT(2)
#define DUMP_MAP_SECURE	BIT(3)
#define DUMP_MAP_EPHEM	BIT(4)
#define DUMP_MAP_LDELF	BIT(7)

/*
 * struct dump_entry_arg - argument for ldelf_arg::dump_entry()
 */
struct dump_entry_arg {
	union {
		struct {
			uint32_t regs[16];
		} arm32;
		struct {
			uint64_t fp;
			uint64_t sp;
			uint64_t pc;
		} arm64;
		struct {
			unsigned long fp;
			unsigned long sp;
			unsigned long pc;
		} rv;
	};
	bool is_32bit;
	size_t num_maps;
	struct dump_map {
		vaddr_t va;
		paddr_t pa;
		size_t sz;
		uint32_t flags;
	} maps[];
};

/*
 * struct dl_entry_arg - argument for ldelf_arg::dl_entry()
 */
struct dl_entry_arg {
	uint32_t cmd;
	TEE_Result ret;
	union {
		struct {
			TEE_UUID uuid;	/* in */
			uint32_t flags;	/* in */
		} dlopen;
		struct {
			TEE_UUID uuid;	/* in */
			vaddr_t val;	/* out */
			char symbol[];	/* in */
		} dlsym;
	};
};

/*
 * Values for dl_entry_arg::cmd
 */
#define LDELF_DL_ENTRY_DLOPEN	0
#define LDELF_DL_ENTRY_DLSYM	1

/*
 * Values for dl_entry_arg::dlopen::flags
 */
#define RTLD_NOW	2
#define RTLD_GLOBAL	0x100
#define RTLD_NODELETE	0x1000

#define LDELF_MAP_FLAG_SHAREABLE	BIT32(0)
#define LDELF_MAP_FLAG_WRITEABLE	BIT32(1)
#define LDELF_MAP_FLAG_EXECUTABLE	BIT32(2)
#define LDELF_MAP_FLAG_BTI		BIT32(3)

#endif /*!__ASSEMBLER__*/

#define LDELF_RETURN		0
#define LDELF_LOG		1
#define LDELF_PANIC		2
#define LDELF_MAP_ZI		3
#define LDELF_UNMAP		4
#define LDELF_OPEN_BIN		5
#define LDELF_CLOSE_BIN		6
#define LDELF_MAP_BIN		7
#define LDELF_CP_FROM_BIN	8
#define LDELF_SET_PROT		9
#define LDELF_REMAP		10
#define LDELF_GEN_RND_NUM	11

#define LDELF_SCN_MAX		11

/*
 * ldelf is loaded into memory by TEE Core. BSS is initialized and a
 * stack is allocated and supplied in SP register. A struct ldelf_arg
 * is placed in the stack and a pointer to the struct is provided in
 * r0/x0 on ARM and in a0/x10 on RISC-V.
 *
 * ldelf relocates itself to the address where it is loaded before the main
 * C routine is called.
 *
 * In the main C routine the TA is loaded using the PTA System interface.
 */

#endif /*__LDELF_H*/