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
45struct tc_ns_client_login {
46	__u32 method;
47	__u32 mdata;
48};
49
50union 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
67struct tc_ns_client_return {
68	int code;
69	__u32 origin;
70};
71
72struct 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
92struct tc_ns_client_time {
93	uint32_t seconds;
94	uint32_t millis;
95};
96
97enum 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
106struct sec_file_info {
107	enum secfile_type_t secfile_type;
108	uint32_t file_size;
109	int32_t sec_load_err;
110};
111
112struct 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
124struct 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
133struct 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
145struct 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