xref: /optee_os/lib/libutee/include/user_ta_header.h (revision b01047730e77127c23a36591643eeb8bb0487d68)
1 /*
2  * Copyright (c) 2014, STMicroelectronics International N.V.
3  * All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions are met:
7  *
8  * 1. Redistributions of source code must retain the above copyright notice,
9  * this list of conditions and the following disclaimer.
10  *
11  * 2. Redistributions in binary form must reproduce the above copyright notice,
12  * this list of conditions and the following disclaimer in the documentation
13  * and/or other materials provided with the distribution.
14  *
15  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
16  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
19  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
20  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
21  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
22  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
23  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
24  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
25  * POSSIBILITY OF SUCH DAMAGE.
26  */
27 
28 #ifndef USER_TA_HEADER_H
29 #define USER_TA_HEADER_H
30 
31 #include <tee_api_types.h>
32 
33 /*
34    signed_header
35    ta_head_t
36    ta_func_head_t (1)
37    ta_func_head_t (2)
38    ...
39    ta_func_head_t (N) N = ta_head(_t).nbr_func
40    func_1
41    func_1
42    ...
43    func_N
44    hash_1
45    hash_2
46    ...
47    hash_M
48 */
49 
50 struct user_ta_head {
51 	TEE_UUID uuid;
52 	uint32_t nbr_func;
53 	uint32_t ro_size;
54 	uint32_t rw_size;
55 	uint32_t zi_size;
56 	uint32_t got_size;
57 	uint32_t hash_type;
58 };
59 
60 #define USER_TA_HEAD_FLAG_USER_MODE 0x80000000UL
61 #define USER_TA_HEAD_FLAG_DDR_EXEC  0x40000000UL
62 
63 struct user_ta_func_head {
64 	uint32_t cmd_id;
65 	uint32_t start;		/* offset to start func */
66 };
67 
68 struct user_ta_sub_head {
69 	uint32_t flags;
70 	uint32_t spare;
71 	uint32_t heap_size;
72 	uint32_t stack_size;
73 };
74 
75 #define TA_FLAG_USER_MODE           (1 << 0)
76 #define TA_FLAG_EXEC_DDR            (1 << 1)
77 #define TA_FLAG_SINGLE_INSTANCE     (1 << 2)
78 #define TA_FLAG_MULTI_SESSION       (1 << 3)
79 #define TA_FLAG_INSTANCE_KEEP_ALIVE (1 << 4)
80 /*
81  * TEE Core will allow memrefs in some firewalled memory if this flag is
82  * set for a User TA.
83  */
84 #define TA_FLAG_UNSAFE_NW_PARAMS    (1 << 5)
85 
86 enum user_ta_prop_type {
87 	USER_TA_PROP_TYPE_BOOL,	/* bool */
88 	USER_TA_PROP_TYPE_U32,	/* uint32_t */
89 	USER_TA_PROP_TYPE_UUID,	/* TEE_UUID */
90 	USER_TA_PROP_TYPE_IDENTITY,	/* TEE_Identity */
91 	USER_TA_PROP_TYPE_STRING,	/* zero terminated string of char */
92 	USER_TA_PROP_TYPE_BINARY_BLOCK,	/* zero terminated base64 coded string */
93 };
94 
95 enum user_ta_core_service_id {
96 	USER_TA_CORE_ENTRY_MATH_INIT = 0x00000010,
97 	USER_TA_CORE_ENTRY_GARBAGE = 0x00000011,
98 	USER_TA_CORE_ENTRY_CLOSESESSION = 0x00000012,
99 };
100 
101 struct user_ta_property {
102 	const char *name;
103 	enum user_ta_prop_type type;
104 	const void *value;
105 };
106 
107 extern const struct user_ta_property ta_props[];
108 extern const size_t ta_num_props;
109 
110 /* Needed by TEE_CheckMemoryAccessRights() */
111 extern uint32_t ta_param_types;
112 extern TEE_Param ta_params[4];
113 
114 /* Trusted Application Function header */
115 typedef struct ta_func_head {
116 	uint32_t cmd_id;	/* Trusted Application Function ID */
117 	uint32_t start;		/* offset to start func */
118 } ta_func_head_t;
119 
120 typedef struct {
121 	/* Same Prefix as ta_head_t */
122 	TEE_UUID uuid;
123 	const char *name;
124 	uint32_t flags;
125 
126 	/* properties */
127 	uint32_t prop_datasize;
128 	uint32_t prop_stacksize;
129 	uint32_t prop_tracelevel;
130 
131 	const ta_func_head_t *funcs;
132 	uint32_t nbr_func;
133 	 TEE_Result(*create_entry_point) (void);
134 	void (*destroy_entry_point) (void);
135 	 TEE_Result(*open_session_entry_point) (uint32_t nParamTypes,
136 					     TEE_Param pParams[4],
137 					     void **ppSessionContext);
138 	void (*close_session_entry_point) (void *pSessionContext);
139 	 TEE_Result(*invoke_command_entry_point) (void *pSessionContext,
140 					       uint32_t nCommandID,
141 					       uint32_t nParamTypes,
142 					       TEE_Param pParams[4]);
143 	 TEE_Result(*core_entries) (uint32_t nServiceId, uint32_t nParamTypes,
144 				   TEE_Param pParam[4]);
145 } ta_static_head_t;
146 
147 int tahead_get_trace_level(void);
148 
149 #endif /* USER_TA_HEADER_H */
150