1 /*
2  * tc_ns_client.h
3  *
4  * data structure declaration for nonsecure world
5  *
6  * Copyright (C) 2022 Huawei Technologies Co., Ltd.
7  *
8  * This software is licensed under the terms of the GNU General Public
9  * License version 2, as published by the Free Software Foundation, and
10  * may be copied, distributed, and modified under those terms.
11  *
12  * This program is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15  * GNU General Public License for more details.
16  */
17 #ifndef TC_NS_CLIENT_H
18 #define TC_NS_CLIENT_H
19 
20 #include <linux/types.h>
21 #include <linux/version.h>
22 
23 #define UUID_LEN			16
24 #define PARAM_NUM			4
25 #define ADDR_TRANS_NUM		32
26 
27 #define teec_param_types(param0_type, param1_type, param2_type, param3_type) \
28 	((param3_type) << 12 | (param2_type) << 8 | \
29 	(param1_type) << 4 | (param0_type))
30 
31 #define teec_param_type_get(param_types, index) \
32 	(((param_types) >> ((index) << 2)) & 0x0F)
33 
34 #ifndef ZERO_SIZE_PTR
35 #define ZERO_SIZE_PTR ((void *)16)
36 #define ZERO_OR_NULL_PTR(x) ((unsigned long)(x) <= (unsigned long)ZERO_SIZE_PTR)
37 #endif
38 
39 #if (KERNEL_VERSION(5, 10, 0) <= LINUX_VERSION_CODE)
40 #define mm_sem_lock(mm) (mm)->mmap_lock
41 #else
42 #define mm_sem_lock(mm) (mm)->mmap_sem
43 #endif
44 
45 struct tc_ns_client_login {
46 	__u32 method;
47 	__u32 mdata;
48 };
49 
50 union tc_ns_client_param {
51 	struct {
52 		__u32 buffer;
53 		__u32 buffer_h_addr;
54 		__u32 offset;
55 		__u32 h_offset;
56 		__u32 size_addr;
57 		__u32 size_h_addr;
58 	} memref;
59 	struct {
60 		__u32 a_addr;
61 		__u32 a_h_addr;
62 		__u32 b_addr;
63 		__u32 b_h_addr;
64 	} value;
65 };
66 
67 struct tc_ns_client_return {
68 	int code;
69 	__u32 origin;
70 };
71 
72 struct tc_ns_client_context {
73 	unsigned char uuid[UUID_LEN];
74 	__u32 session_id;
75 	__u32 cmd_id;
76 	struct tc_ns_client_return returns;
77 	struct tc_ns_client_login login;
78 	union tc_ns_client_param params[PARAM_NUM];
79 	__u32 param_types;
80 	__u8 started;
81 	__u32 calling_pid;
82 	unsigned int file_size;
83 	union {
84 		char *file_buffer;
85 		struct {
86 			uint32_t file_addr;
87 			uint32_t file_h_addr;
88 		} memref;
89 	};
90 };
91 
92 struct tc_ns_client_time {
93 	uint32_t seconds;
94 	uint32_t millis;
95 };
96 
97 enum secfile_type_t {
98 	LOAD_TA = 0,
99 	LOAD_SERVICE,
100 	LOAD_LIB,
101 	LOAD_DYNAMIC_DRV,
102 	LOAD_PATCH,
103 	LOAD_TYPE_MAX,
104 };
105 
106 struct sec_file_info {
107 	enum secfile_type_t secfile_type;
108 	uint32_t file_size;
109 	int32_t sec_load_err;
110 };
111 
112 struct load_secfile_ioctl_struct {
113 	struct sec_file_info sec_file_info;
114 	unsigned char uuid[UUID_LEN];
115 	union {
116 		char *file_buffer;
117 		struct {
118 			uint32_t file_addr;
119 			uint32_t file_h_addr;
120 		} memref;
121 	};
122 }__attribute__((packed));
123 
124 struct agent_ioctl_args {
125 	uint32_t id;
126 	uint32_t buffer_size;
127 	union {
128 		void *buffer;
129 		unsigned long long addr;
130 	};
131 };
132 
133 struct tc_ns_client_crl {
134 	union {
135 		uint8_t *buffer;
136 		struct {
137 			uint32_t buffer_addr;
138 			uint32_t buffer_h_addr;
139 		} memref;
140 	};
141 	uint32_t size;
142 };
143 
144 #ifdef CONFIG_LOG_POOL_ENABLE
145 struct tc_ns_log_pool {
146 	uint64_t addr;
147 	uint64_t size;
148 };
149 #endif
150 
151 #define MAX_SHA_256_SZ 32
152 
153 #define TC_NS_CLIENT_IOCTL_SES_OPEN_REQ \
154 	 _IOW(TC_NS_CLIENT_IOC_MAGIC, 1, struct tc_ns_client_context)
155 #define TC_NS_CLIENT_IOCTL_SES_CLOSE_REQ \
156 	_IOWR(TC_NS_CLIENT_IOC_MAGIC, 2, struct tc_ns_client_context)
157 #define TC_NS_CLIENT_IOCTL_SEND_CMD_REQ \
158 	_IOWR(TC_NS_CLIENT_IOC_MAGIC, 3, struct tc_ns_client_context)
159 #define TC_NS_CLIENT_IOCTL_SHRD_MEM_RELEASE \
160 	_IOWR(TC_NS_CLIENT_IOC_MAGIC, 4, unsigned int)
161 #define TC_NS_CLIENT_IOCTL_WAIT_EVENT \
162 	_IOWR(TC_NS_CLIENT_IOC_MAGIC, 5, unsigned int)
163 #define TC_NS_CLIENT_IOCTL_SEND_EVENT_RESPONSE \
164 	_IOWR(TC_NS_CLIENT_IOC_MAGIC, 6, unsigned int)
165 #define TC_NS_CLIENT_IOCTL_REGISTER_AGENT \
166 	_IOWR(TC_NS_CLIENT_IOC_MAGIC, 7, struct agent_ioctl_args)
167 #define TC_NS_CLIENT_IOCTL_UNREGISTER_AGENT \
168 	_IOWR(TC_NS_CLIENT_IOC_MAGIC, 8, unsigned int)
169 #define TC_NS_CLIENT_IOCTL_LOAD_APP_REQ \
170 	_IOWR(TC_NS_CLIENT_IOC_MAGIC, 9, struct load_secfile_ioctl_struct)
171 #define TC_NS_CLIENT_IOCTL_NEED_LOAD_APP \
172 	_IOWR(TC_NS_CLIENT_IOC_MAGIC, 10, struct tc_ns_client_context)
173 #define TC_NS_CLIENT_IOCTL_ALLOC_EXCEPTING_MEM \
174 	_IOWR(TC_NS_CLIENT_IOC_MAGIC, 12, unsigned int)
175 #define TC_NS_CLIENT_IOCTL_CANCEL_CMD_REQ \
176 	_IOWR(TC_NS_CLIENT_IOC_MAGIC, 13, struct tc_ns_client_context)
177 #define TC_NS_CLIENT_IOCTL_LOGIN \
178 	_IOWR(TC_NS_CLIENT_IOC_MAGIC, 14, int)
179 #define TC_NS_CLIENT_IOCTL_TUI_EVENT \
180 	_IOWR(TC_NS_CLIENT_IOC_MAGIC, 16, int)
181 #define TC_NS_CLIENT_IOCTL_SYC_SYS_TIME \
182 	_IOWR(TC_NS_CLIENT_IOC_MAGIC, 17, struct tc_ns_client_time)
183 #define TC_NS_CLIENT_IOCTL_SET_NATIVECA_IDENTITY \
184 	_IOWR(TC_NS_CLIENT_IOC_MAGIC, 18, int)
185 #define TC_NS_CLIENT_IOCTL_LOAD_TTF_FILE_AND_NOTCH_HEIGHT \
186 	_IOWR(TC_NS_CLIENT_IOC_MAGIC, 19, unsigned int)
187 #define TC_NS_CLIENT_IOCTL_LATEINIT \
188 	_IOWR(TC_NS_CLIENT_IOC_MAGIC, 20, unsigned int)
189 #define TC_NS_CLIENT_IOCTL_GET_TEE_VERSION \
190 	_IOWR(TC_NS_CLIENT_IOC_MAGIC, 21, unsigned int)
191 #define TC_NS_CLIENT_IOCTL_UPDATE_TA_CRL \
192 	_IOWR(TC_NS_CLIENT_IOC_MAGIC, 22, struct tc_ns_client_crl)
193 #ifdef CONFIG_LOG_POOL_ENABLE
194 #define TC_NS_CLIENT_IOCTL_GET_LOG_POOL \
195 	_IOWR(TC_NS_CLIENT_IOC_MAGIC, 23, struct tc_ns_log_pool)
196 #endif
197 #endif
198