blob: 96d200faa786347439b773b85864d6e614b77ca5 [file] [log] [blame]
AnilKumar Chimata20c6b2f2017-04-07 12:18:46 -07001/* Copyright (c) 2014-2017, The Linux Foundation. All rights reserved.
2 *
3 * This program is free software; you can redistribute it and/or modify
4 * it under the terms of the GNU General Public License version 2 and
5 * only version 2 as published by the Free Software Foundation.
6 *
7 * This program is distributed in the hope that it will be useful,
8 * but WITHOUT ANY WARRANTY; without even the implied warranty of
9 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10 * GNU General Public License for more details.
11 *
12 */
13
14#include <linux/debugfs.h>
15#include <linux/uaccess.h>
16#include <linux/qseecom.h>
17#include <linux/compat.h>
18#include "compat_qseecom.h"
19
20static int compat_get_qseecom_register_listener_req(
21 struct compat_qseecom_register_listener_req __user *data32,
22 struct qseecom_register_listener_req __user *data)
23{
24 int err;
25 compat_ulong_t listener_id;
26 compat_long_t ifd_data_fd;
27 compat_uptr_t virt_sb_base;
28 compat_ulong_t sb_size;
29
30 err = get_user(listener_id, &data32->listener_id);
31 err |= put_user(listener_id, &data->listener_id);
32 err |= get_user(ifd_data_fd, &data32->ifd_data_fd);
33 err |= put_user(ifd_data_fd, &data->ifd_data_fd);
34
35 err |= get_user(virt_sb_base, &data32->virt_sb_base);
36 /* upper bits won't get set, zero them */
37 err |= put_user(NULL, &data->virt_sb_base);
38 err |= put_user(virt_sb_base, (compat_uptr_t *)&data->virt_sb_base);
39
40 err |= get_user(sb_size, &data32->sb_size);
41 err |= put_user(sb_size, &data->sb_size);
42 return err;
43}
44
45static int compat_get_qseecom_load_img_req(
46 struct compat_qseecom_load_img_req __user *data32,
47 struct qseecom_load_img_req __user *data)
48{
49 int err;
50 compat_ulong_t mdt_len;
51 compat_ulong_t img_len;
52 compat_long_t ifd_data_fd;
53 compat_ulong_t app_arch;
54 compat_uint_t app_id;
55
56 err = get_user(mdt_len, &data32->mdt_len);
57 err |= put_user(mdt_len, &data->mdt_len);
58 err |= get_user(img_len, &data32->img_len);
59 err |= put_user(img_len, &data->img_len);
60 err |= get_user(ifd_data_fd, &data32->ifd_data_fd);
61 err |= put_user(ifd_data_fd, &data->ifd_data_fd);
62 err |= copy_in_user(data->img_name, data32->img_name,
63 MAX_APP_NAME_SIZE);
64 err |= get_user(app_arch, &data32->app_arch);
65 err |= put_user(app_arch, &data->app_arch);
66 err |= get_user(app_id, &data32->app_id);
67 err |= put_user(app_id, &data->app_id);
68 return err;
69}
70
71static int compat_get_qseecom_send_cmd_req(
72 struct compat_qseecom_send_cmd_req __user *data32,
73 struct qseecom_send_cmd_req __user *data)
74{
75 int err;
76 compat_uptr_t cmd_req_buf;
77 compat_uint_t cmd_req_len;
78 compat_uptr_t resp_buf;
79 compat_uint_t resp_len;
80
81 err = get_user(cmd_req_buf, &data32->cmd_req_buf);
82 err |= put_user(NULL, &data->cmd_req_buf);
83 err |= put_user(cmd_req_buf, (compat_uptr_t *)&data->cmd_req_buf);
84 err |= get_user(cmd_req_len, &data32->cmd_req_len);
85 err |= put_user(cmd_req_len, &data->cmd_req_len);
86
87 err |= get_user(resp_buf, &data32->resp_buf);
88 err |= put_user(NULL, &data->resp_buf);
89 err |= put_user(resp_buf, (compat_uptr_t *)&data->resp_buf);
90 err |= get_user(resp_len, &data32->resp_len);
91 err |= put_user(resp_len, &data->resp_len);
92 return err;
93}
94
95static int compat_get_qseecom_send_modfd_cmd_req(
96 struct compat_qseecom_send_modfd_cmd_req __user *data32,
97 struct qseecom_send_modfd_cmd_req __user *data)
98{
99 int err;
100 unsigned int i;
101 compat_uptr_t cmd_req_buf;
102 compat_uint_t cmd_req_len;
103 compat_uptr_t resp_buf;
104 compat_uint_t resp_len;
105 compat_long_t fd;
106 compat_ulong_t cmd_buf_offset;
107
108 err = get_user(cmd_req_buf, &data32->cmd_req_buf);
109 err |= put_user(NULL, &data->cmd_req_buf);
110 err |= put_user(cmd_req_buf, (compat_uptr_t *)&data->cmd_req_buf);
111 err |= get_user(cmd_req_len, &data32->cmd_req_len);
112 err |= put_user(cmd_req_len, &data->cmd_req_len);
113 err |= get_user(resp_buf, &data32->resp_buf);
114 err |= put_user(NULL, &data->resp_buf);
115 err |= put_user(resp_buf, (compat_uptr_t *)&data->resp_buf);
116 err |= get_user(resp_len, &data32->resp_len);
117 err |= put_user(resp_len, &data->resp_len);
118 for (i = 0; i < MAX_ION_FD; i++) {
119 err |= get_user(fd, &data32->ifd_data[i].fd);
120 err |= put_user(fd, &data->ifd_data[i].fd);
121 err |= get_user(cmd_buf_offset,
122 &data32->ifd_data[i].cmd_buf_offset);
123 err |= put_user(cmd_buf_offset,
124 &data->ifd_data[i].cmd_buf_offset);
125 }
126 return err;
127}
128
129static int compat_get_qseecom_set_sb_mem_param_req(
130 struct compat_qseecom_set_sb_mem_param_req __user *data32,
131 struct qseecom_set_sb_mem_param_req __user *data)
132{
133 int err;
134 compat_long_t ifd_data_fd;
135 compat_uptr_t virt_sb_base;
136 compat_ulong_t sb_len;
137
138 err = get_user(ifd_data_fd, &data32->ifd_data_fd);
139 err |= put_user(ifd_data_fd, &data->ifd_data_fd);
140 err |= get_user(virt_sb_base, &data32->virt_sb_base);
141 err |= put_user(NULL, &data->virt_sb_base);
142 err |= put_user(virt_sb_base, (compat_uptr_t *)&data->virt_sb_base);
143 err |= get_user(sb_len, &data32->sb_len);
144 err |= put_user(sb_len, &data->sb_len);
145 return err;
146}
147
148static int compat_get_qseecom_qseos_version_req(
149 struct compat_qseecom_qseos_version_req __user *data32,
150 struct qseecom_qseos_version_req __user *data)
151{
152 int err;
153 compat_uint_t qseos_version;
154
155 err = get_user(qseos_version, &data32->qseos_version);
156 err |= put_user(qseos_version, &data->qseos_version);
157 return err;
158}
159
160static int compat_get_qseecom_qseos_app_load_query(
161 struct compat_qseecom_qseos_app_load_query __user *data32,
162 struct qseecom_qseos_app_load_query __user *data)
163{
164 int err = 0;
165 unsigned int i;
166 compat_uint_t app_id;
167 char app_name;
168 compat_ulong_t app_arch;
169
170 for (i = 0; i < MAX_APP_NAME_SIZE; i++) {
171 err |= get_user(app_name, &(data32->app_name[i]));
172 err |= put_user(app_name, &(data->app_name[i]));
173 }
174 err |= get_user(app_id, &data32->app_id);
175 err |= put_user(app_id, &data->app_id);
176 err |= get_user(app_arch, &data32->app_arch);
177 err |= put_user(app_arch, &data->app_arch);
178 return err;
179}
180
181static int compat_get_qseecom_send_svc_cmd_req(
182 struct compat_qseecom_send_svc_cmd_req __user *data32,
183 struct qseecom_send_svc_cmd_req __user *data)
184{
185 int err;
186 compat_ulong_t cmd_id;
187 compat_uptr_t cmd_req_buf;
188 compat_uint_t cmd_req_len;
189 compat_uptr_t resp_buf;
190 compat_uint_t resp_len;
191
192 err = get_user(cmd_id, &data32->cmd_id);
193 err |= put_user(cmd_id, &data->cmd_id);
194 err |= get_user(cmd_req_buf, &data32->cmd_req_buf);
195 err |= put_user(NULL, &data->cmd_req_buf);
196 err |= put_user(cmd_req_buf, (compat_uptr_t *)&data->cmd_req_buf);
197 err |= get_user(cmd_req_len, &data32->cmd_req_len);
198 err |= put_user(cmd_req_len, &data->cmd_req_len);
199 err |= get_user(resp_buf, &data32->resp_buf);
200 err |= put_user(NULL, &data->resp_buf);
201 err |= put_user(resp_buf, (compat_uptr_t *)&data->resp_buf);
202 err |= get_user(resp_len, &data32->resp_len);
203 err |= put_user(resp_len, &data->resp_len);
204 return err;
205}
206
207static int compat_get_qseecom_create_key_req(
208 struct compat_qseecom_create_key_req __user *data32,
209 struct qseecom_create_key_req __user *data)
210{
211 int err;
212 compat_uint_t usage;
213
214 err = copy_in_user(data->hash32, data32->hash32, QSEECOM_HASH_SIZE);
215 err |= get_user(usage, &data32->usage);
216 err |= put_user(usage, &data->usage);
217
218 return err;
219}
220
221static int compat_get_qseecom_wipe_key_req(
222 struct compat_qseecom_wipe_key_req __user *data32,
223 struct qseecom_wipe_key_req __user *data)
224{
225 int err;
226 compat_uint_t usage;
227 compat_int_t wipe_key_flag;
228
229 err = get_user(usage, &data32->usage);
230 err |= put_user(usage, &data->usage);
231 err |= get_user(wipe_key_flag, &data32->wipe_key_flag);
232 err |= put_user(wipe_key_flag, &data->wipe_key_flag);
233
234 return err;
235}
236
237static int compat_get_qseecom_update_key_userinfo_req(
238 struct compat_qseecom_update_key_userinfo_req __user *data32,
239 struct qseecom_update_key_userinfo_req __user *data)
240{
241 int err = 0;
242 compat_uint_t usage;
243
244 err = copy_in_user(data->current_hash32, data32->current_hash32,
245 QSEECOM_HASH_SIZE);
246 err |= copy_in_user(data->new_hash32, data32->new_hash32,
247 QSEECOM_HASH_SIZE);
248 err |= get_user(usage, &data32->usage);
249 err |= put_user(usage, &data->usage);
250
251 return err;
252}
253
254static int compat_get_qseecom_save_partition_hash_req(
255 struct compat_qseecom_save_partition_hash_req __user *data32,
256 struct qseecom_save_partition_hash_req __user *data)
257{
258 int err;
259 compat_int_t partition_id;
260
261 err = get_user(partition_id, &data32->partition_id);
262 err |= put_user(partition_id, &data->partition_id);
263 err |= copy_in_user(data->digest, data32->digest,
264 SHA256_DIGEST_LENGTH);
265 return err;
266}
267
268static int compat_get_qseecom_is_es_activated_req(
269 struct compat_qseecom_is_es_activated_req __user *data32,
270 struct qseecom_is_es_activated_req __user *data)
271{
272 compat_int_t is_activated;
273 int err;
274
275 err = get_user(is_activated, &data32->is_activated);
276 err |= put_user(is_activated, &data->is_activated);
277 return err;
278}
279
280static int compat_get_qseecom_mdtp_cipher_dip_req(
281 struct compat_qseecom_mdtp_cipher_dip_req __user *data32,
282 struct qseecom_mdtp_cipher_dip_req __user *data)
283{
284 int err;
285 compat_int_t in_buf_size;
286 compat_uptr_t in_buf;
287 compat_int_t out_buf_size;
288 compat_uptr_t out_buf;
289 compat_int_t direction;
290
291 err = get_user(in_buf_size, &data32->in_buf_size);
292 err |= put_user(in_buf_size, &data->in_buf_size);
293 err |= get_user(out_buf_size, &data32->out_buf_size);
294 err |= put_user(out_buf_size, &data->out_buf_size);
295 err |= get_user(direction, &data32->direction);
296 err |= put_user(direction, &data->direction);
297 err |= get_user(in_buf, &data32->in_buf);
298 err |= put_user(NULL, &data->in_buf);
299 err |= put_user(in_buf, (compat_uptr_t *)&data->in_buf);
300 err |= get_user(out_buf, &data32->out_buf);
301 err |= put_user(NULL, &data->out_buf);
302 err |= put_user(out_buf, (compat_uptr_t *)&data->out_buf);
303
304 return err;
305}
306
307static int compat_get_qseecom_send_modfd_listener_resp(
308 struct compat_qseecom_send_modfd_listener_resp __user *data32,
309 struct qseecom_send_modfd_listener_resp __user *data)
310{
311 int err;
312 unsigned int i;
313 compat_uptr_t resp_buf_ptr;
314 compat_uint_t resp_len;
315 compat_long_t fd;
316 compat_ulong_t cmd_buf_offset;
317
318 err = get_user(resp_buf_ptr, &data32->resp_buf_ptr);
319 err |= put_user(NULL, &data->resp_buf_ptr);
320 err |= put_user(resp_buf_ptr, (compat_uptr_t *)&data->resp_buf_ptr);
321 err |= get_user(resp_len, &data32->resp_len);
322 err |= put_user(resp_len, &data->resp_len);
323
324 for (i = 0; i < MAX_ION_FD; i++) {
325 err |= get_user(fd, &data32->ifd_data[i].fd);
326 err |= put_user(fd, &data->ifd_data[i].fd);
327 err |= get_user(cmd_buf_offset,
328 &data32->ifd_data[i].cmd_buf_offset);
329 err |= put_user(cmd_buf_offset,
330 &data->ifd_data[i].cmd_buf_offset);
331 }
332 return err;
333}
334
335
336static int compat_get_qseecom_qteec_req(
337 struct compat_qseecom_qteec_req __user *data32,
338 struct qseecom_qteec_req __user *data)
339{
340 compat_uptr_t req_ptr;
341 compat_ulong_t req_len;
342 compat_uptr_t resp_ptr;
343 compat_ulong_t resp_len;
344 int err;
345
346 err = get_user(req_ptr, &data32->req_ptr);
347 err |= put_user(NULL, &data->req_ptr);
348 err |= put_user(req_ptr, (compat_uptr_t *)&data->req_ptr);
349 err |= get_user(req_len, &data32->req_len);
350 err |= put_user(req_len, &data->req_len);
351
352 err |= get_user(resp_ptr, &data32->resp_ptr);
353 err |= put_user(NULL, &data->resp_ptr);
354 err |= put_user(resp_ptr, (compat_uptr_t *)&data->resp_ptr);
355 err |= get_user(resp_len, &data32->resp_len);
356 err |= put_user(resp_len, &data->resp_len);
357 return err;
358}
359
360static int compat_get_qseecom_qteec_modfd_req(
361 struct compat_qseecom_qteec_modfd_req __user *data32,
362 struct qseecom_qteec_modfd_req __user *data)
363{
364 compat_uptr_t req_ptr;
365 compat_ulong_t req_len;
366 compat_uptr_t resp_ptr;
367 compat_ulong_t resp_len;
368 compat_long_t fd;
369 compat_ulong_t cmd_buf_offset;
370 int err, i;
371
372 err = get_user(req_ptr, &data32->req_ptr);
373 err |= put_user(NULL, &data->req_ptr);
374 err |= put_user(req_ptr, (compat_uptr_t *)&data->req_ptr);
375 err |= get_user(req_len, &data32->req_len);
376 err |= put_user(req_len, &data->req_len);
377
378 err |= get_user(resp_ptr, &data32->resp_ptr);
379 err |= put_user(NULL, &data->resp_ptr);
380 err |= put_user(resp_ptr, (compat_uptr_t *)&data->resp_ptr);
381 err |= get_user(resp_len, &data32->resp_len);
382 err |= put_user(resp_len, &data->resp_len);
383
384 for (i = 0; i < MAX_ION_FD; i++) {
385 err |= get_user(fd, &data32->ifd_data[i].fd);
386 err |= put_user(fd, &data->ifd_data[i].fd);
387 err |= get_user(cmd_buf_offset,
388 &data32->ifd_data[i].cmd_buf_offset);
389 err |= put_user(cmd_buf_offset,
390 &data->ifd_data[i].cmd_buf_offset);
391 }
392 return err;
393}
394
395static int compat_get_int(compat_int_t __user *data32,
396 int __user *data)
397{
398 compat_int_t x;
399 int err;
400
401 err = get_user(x, data32);
402 err |= put_user(x, data);
403 return err;
404}
405
406static int compat_put_qseecom_load_img_req(
407 struct compat_qseecom_load_img_req __user *data32,
408 struct qseecom_load_img_req __user *data)
409{
410 int err;
411 compat_ulong_t mdt_len;
412 compat_ulong_t img_len;
413 compat_long_t ifd_data_fd;
414 compat_ulong_t app_arch;
415 compat_int_t app_id;
416
417 err = get_user(mdt_len, &data->mdt_len);
418 err |= put_user(mdt_len, &data32->mdt_len);
419 err |= get_user(img_len, &data->img_len);
420 err |= put_user(img_len, &data32->img_len);
421 err |= get_user(ifd_data_fd, &data->ifd_data_fd);
422 err |= put_user(ifd_data_fd, &data32->ifd_data_fd);
423 err |= copy_in_user(data32->img_name, data->img_name,
424 MAX_APP_NAME_SIZE);
425 err |= get_user(app_arch, &data->app_arch);
426 err |= put_user(app_arch, &data32->app_arch);
427 err |= get_user(app_id, &data->app_id);
428 err |= put_user(app_id, &data32->app_id);
429 return err;
430}
431
432static int compat_put_qseecom_qseos_version_req(
433 struct compat_qseecom_qseos_version_req __user *data32,
434 struct qseecom_qseos_version_req __user *data)
435{
436 compat_uint_t qseos_version;
437 int err;
438
439 err = get_user(qseos_version, &data->qseos_version);
440 err |= put_user(qseos_version, &data32->qseos_version);
441 return err;
442}
443
444static int compat_put_qseecom_qseos_app_load_query(
445 struct compat_qseecom_qseos_app_load_query __user *data32,
446 struct qseecom_qseos_app_load_query __user *data)
447{
448 int err = 0;
449 unsigned int i;
450 compat_int_t app_id;
451 compat_ulong_t app_arch;
452 char app_name;
453
454 for (i = 0; i < MAX_APP_NAME_SIZE; i++) {
455 err |= get_user(app_name, &(data->app_name[i]));
456 err |= put_user(app_name, &(data32->app_name[i]));
457 }
458 err |= get_user(app_id, &data->app_id);
459 err |= put_user(app_id, &data32->app_id);
460 err |= get_user(app_arch, &data->app_arch);
461 err |= put_user(app_arch, &data32->app_arch);
462
463 return err;
464}
465
466static int compat_put_qseecom_is_es_activated_req(
467 struct compat_qseecom_is_es_activated_req __user *data32,
468 struct qseecom_is_es_activated_req __user *data)
469{
470 compat_int_t is_activated;
471 int err;
472
473 err = get_user(is_activated, &data->is_activated);
474 err |= put_user(is_activated, &data32->is_activated);
475 return err;
476}
477
478static unsigned int convert_cmd(unsigned int cmd)
479{
480 switch (cmd) {
481 case COMPAT_QSEECOM_IOCTL_REGISTER_LISTENER_REQ:
482 return QSEECOM_IOCTL_REGISTER_LISTENER_REQ;
483 case COMPAT_QSEECOM_IOCTL_UNREGISTER_LISTENER_REQ:
484 return QSEECOM_IOCTL_UNREGISTER_LISTENER_REQ;
485 case COMPAT_QSEECOM_IOCTL_LOAD_APP_REQ:
486 return QSEECOM_IOCTL_LOAD_APP_REQ;
487 case COMPAT_QSEECOM_IOCTL_RECEIVE_REQ:
488 return QSEECOM_IOCTL_RECEIVE_REQ;
489 case COMPAT_QSEECOM_IOCTL_SEND_RESP_REQ:
490 return QSEECOM_IOCTL_SEND_RESP_REQ;
491 case COMPAT_QSEECOM_IOCTL_UNLOAD_APP_REQ:
492 return QSEECOM_IOCTL_UNLOAD_APP_REQ;
493 case COMPAT_QSEECOM_IOCTL_PERF_ENABLE_REQ:
494 return QSEECOM_IOCTL_PERF_ENABLE_REQ;
495 case COMPAT_QSEECOM_IOCTL_PERF_DISABLE_REQ:
496 return QSEECOM_IOCTL_PERF_DISABLE_REQ;
497 case COMPAT_QSEECOM_IOCTL_UNLOAD_EXTERNAL_ELF_REQ:
498 return QSEECOM_IOCTL_UNLOAD_EXTERNAL_ELF_REQ;
499 case COMPAT_QSEECOM_IOCTL_SET_BUS_SCALING_REQ:
500 return QSEECOM_IOCTL_SET_BUS_SCALING_REQ;
501 case COMPAT_QSEECOM_IOCTL_SEND_CMD_REQ:
502 return QSEECOM_IOCTL_SEND_CMD_REQ;
503 case COMPAT_QSEECOM_IOCTL_SEND_MODFD_CMD_REQ:
504 return QSEECOM_IOCTL_SEND_MODFD_CMD_REQ;
505 case COMPAT_QSEECOM_IOCTL_SET_MEM_PARAM_REQ:
506 return QSEECOM_IOCTL_SET_MEM_PARAM_REQ;
507 case COMPAT_QSEECOM_IOCTL_GET_QSEOS_VERSION_REQ:
508 return QSEECOM_IOCTL_GET_QSEOS_VERSION_REQ;
509 case COMPAT_QSEECOM_IOCTL_LOAD_EXTERNAL_ELF_REQ:
510 return QSEECOM_IOCTL_LOAD_EXTERNAL_ELF_REQ;
511 case COMPAT_QSEECOM_IOCTL_APP_LOADED_QUERY_REQ:
512 return QSEECOM_IOCTL_APP_LOADED_QUERY_REQ;
513 case COMPAT_QSEECOM_IOCTL_SEND_CMD_SERVICE_REQ:
514 return QSEECOM_IOCTL_SEND_CMD_SERVICE_REQ;
515 case COMPAT_QSEECOM_IOCTL_CREATE_KEY_REQ:
516 return QSEECOM_IOCTL_CREATE_KEY_REQ;
517 case COMPAT_QSEECOM_IOCTL_WIPE_KEY_REQ:
518 return QSEECOM_IOCTL_WIPE_KEY_REQ;
519 case COMPAT_QSEECOM_IOCTL_UPDATE_KEY_USER_INFO_REQ:
520 return QSEECOM_IOCTL_UPDATE_KEY_USER_INFO_REQ;
521 case COMPAT_QSEECOM_IOCTL_SAVE_PARTITION_HASH_REQ:
522 return QSEECOM_IOCTL_SAVE_PARTITION_HASH_REQ;
523 case COMPAT_QSEECOM_IOCTL_IS_ES_ACTIVATED_REQ:
524 return QSEECOM_IOCTL_IS_ES_ACTIVATED_REQ;
525 case COMPAT_QSEECOM_IOCTL_SEND_MODFD_RESP:
526 return QSEECOM_IOCTL_SEND_MODFD_RESP;
527 case COMPAT_QSEECOM_QTEEC_IOCTL_OPEN_SESSION_REQ:
528 return QSEECOM_QTEEC_IOCTL_OPEN_SESSION_REQ;
529 case COMPAT_QSEECOM_QTEEC_IOCTL_CLOSE_SESSION_REQ:
530 return QSEECOM_QTEEC_IOCTL_CLOSE_SESSION_REQ;
531 case COMPAT_QSEECOM_QTEEC_IOCTL_INVOKE_MODFD_CMD_REQ:
532 return QSEECOM_QTEEC_IOCTL_INVOKE_MODFD_CMD_REQ;
533 case COMPAT_QSEECOM_QTEEC_IOCTL_REQUEST_CANCELLATION_REQ:
534 return QSEECOM_QTEEC_IOCTL_REQUEST_CANCELLATION_REQ;
535 case COMPAT_QSEECOM_IOCTL_MDTP_CIPHER_DIP_REQ:
536 return QSEECOM_IOCTL_MDTP_CIPHER_DIP_REQ;
537 case COMPAT_QSEECOM_IOCTL_SEND_MODFD_CMD_64_REQ:
538 return QSEECOM_IOCTL_SEND_MODFD_CMD_64_REQ;
539 case COMPAT_QSEECOM_IOCTL_SEND_MODFD_RESP_64:
540 return QSEECOM_IOCTL_SEND_MODFD_RESP_64;
541
542 default:
543 return cmd;
544 }
545}
546
547long compat_qseecom_ioctl(struct file *file,
548 unsigned int cmd, unsigned long arg)
549{
550 long ret;
551
552 switch (cmd) {
553
554 case COMPAT_QSEECOM_IOCTL_UNREGISTER_LISTENER_REQ:
555 case COMPAT_QSEECOM_IOCTL_RECEIVE_REQ:
556 case COMPAT_QSEECOM_IOCTL_SEND_RESP_REQ:
557 case COMPAT_QSEECOM_IOCTL_UNLOAD_APP_REQ:
558 case COMPAT_QSEECOM_IOCTL_PERF_ENABLE_REQ:
559 case COMPAT_QSEECOM_IOCTL_PERF_DISABLE_REQ:
560 case COMPAT_QSEECOM_IOCTL_UNLOAD_EXTERNAL_ELF_REQ: {
561 return qseecom_ioctl(file, convert_cmd(cmd), 0);
562 }
563 break;
564 case COMPAT_QSEECOM_IOCTL_REGISTER_LISTENER_REQ: {
565 struct compat_qseecom_register_listener_req __user *data32;
566 struct qseecom_register_listener_req __user *data;
567 int err;
568
569 data32 = compat_ptr(arg);
570 data = compat_alloc_user_space(sizeof(*data));
571 if (data == NULL)
572 return -EFAULT;
573
574 err = compat_get_qseecom_register_listener_req(data32, data);
575 if (err)
576 return err;
577
578 return qseecom_ioctl(file, convert_cmd(cmd),
579 (unsigned long)data);
580 }
581 break;
582 case COMPAT_QSEECOM_IOCTL_LOAD_APP_REQ: {
583 struct compat_qseecom_load_img_req __user *data32;
584 struct qseecom_load_img_req __user *data;
585 int err;
586
587 data32 = compat_ptr(arg);
588 data = compat_alloc_user_space(sizeof(*data));
589 if (data == NULL)
590 return -EFAULT;
591
592 err = compat_get_qseecom_load_img_req(data32, data);
593 if (err)
594 return err;
595
596 ret = qseecom_ioctl(file, convert_cmd(cmd),
597 (unsigned long)data);
598 err = compat_put_qseecom_load_img_req(data32, data);
599 return ret ? ret : err;
600 }
601 break;
602 case COMPAT_QSEECOM_IOCTL_SEND_CMD_REQ: {
603 struct compat_qseecom_send_cmd_req __user *data32;
604 struct qseecom_send_cmd_req __user *data;
605 int err;
606
607 data32 = compat_ptr(arg);
608 data = compat_alloc_user_space(sizeof(*data));
609 if (data == NULL)
610 return -EFAULT;
611
612 err = compat_get_qseecom_send_cmd_req(data32, data);
613 if (err)
614 return err;
615
616 return qseecom_ioctl(file, convert_cmd(cmd),
617 (unsigned long)data);
618 }
619 break;
620 case COMPAT_QSEECOM_IOCTL_SEND_MODFD_CMD_REQ:
621 case COMPAT_QSEECOM_IOCTL_SEND_MODFD_CMD_64_REQ: {
622 struct compat_qseecom_send_modfd_cmd_req __user *data32;
623 struct qseecom_send_modfd_cmd_req __user *data;
624 int err;
625
626 data32 = compat_ptr(arg);
627 data = compat_alloc_user_space(sizeof(*data));
628 if (data == NULL)
629 return -EFAULT;
630
631 err = compat_get_qseecom_send_modfd_cmd_req(data32, data);
632 if (err)
633 return err;
634
635 return qseecom_ioctl(file, convert_cmd(cmd),
636 (unsigned long)data);
637 }
638 break;
639 case COMPAT_QSEECOM_IOCTL_SET_MEM_PARAM_REQ: {
640 struct compat_qseecom_set_sb_mem_param_req __user *data32;
641 struct qseecom_set_sb_mem_param_req __user *data;
642 int err;
643
644 data32 = compat_ptr(arg);
645 data = compat_alloc_user_space(sizeof(*data));
646 if (data == NULL)
647 return -EFAULT;
648
649 err = compat_get_qseecom_set_sb_mem_param_req(data32, data);
650 if (err)
651 return err;
652
653 return qseecom_ioctl(file, convert_cmd(cmd),
654 (unsigned long)data);
655 }
656 break;
657 case COMPAT_QSEECOM_IOCTL_GET_QSEOS_VERSION_REQ: {
658 struct compat_qseecom_qseos_version_req __user *data32;
659 struct qseecom_qseos_version_req __user *data;
660 int err;
661
662 data32 = compat_ptr(arg);
663 data = compat_alloc_user_space(sizeof(*data));
664 if (data == NULL)
665 return -EFAULT;
666
667 err = compat_get_qseecom_qseos_version_req(data32, data);
668 if (err)
669 return err;
670
671 ret = qseecom_ioctl(file, convert_cmd(cmd),
672 (unsigned long)data);
673 err = compat_put_qseecom_qseos_version_req(data32, data);
674
675 return ret ? ret : err;
676 }
677 break;
678 case COMPAT_QSEECOM_IOCTL_SET_BUS_SCALING_REQ: {
679 compat_int_t __user *data32;
680 int __user *data;
681 int err;
682
683 data32 = compat_ptr(arg);
684 data = compat_alloc_user_space(sizeof(*data));
685 if (data == NULL)
686 return -EFAULT;
687 err = compat_get_int(data32, data);
688 if (err)
689 return err;
690 return qseecom_ioctl(file, convert_cmd(cmd),
691 (unsigned long)data);
692 }
693 break;
694 case COMPAT_QSEECOM_IOCTL_LOAD_EXTERNAL_ELF_REQ: {
695 struct compat_qseecom_load_img_req __user *data32;
696 struct qseecom_load_img_req __user *data;
697 int err;
698
699 data32 = compat_ptr(arg);
700 data = compat_alloc_user_space(sizeof(*data));
701 if (data == NULL)
702 return -EFAULT;
703
704 err = compat_get_qseecom_load_img_req(data32, data);
705 if (err)
706 return err;
707
708 return qseecom_ioctl(file, convert_cmd(cmd),
709 (unsigned long)data);
710 }
711 break;
712 case COMPAT_QSEECOM_IOCTL_APP_LOADED_QUERY_REQ: {
713 struct compat_qseecom_qseos_app_load_query __user *data32;
714 struct qseecom_qseos_app_load_query __user *data;
715 int err;
716
717 data32 = compat_ptr(arg);
718 data = compat_alloc_user_space(sizeof(*data));
719 if (data == NULL)
720 return -EFAULT;
721
722 err = compat_get_qseecom_qseos_app_load_query(data32, data);
723 if (err)
724 return err;
725
726 ret = qseecom_ioctl(file, convert_cmd(cmd),
727 (unsigned long)data);
728 err = compat_put_qseecom_qseos_app_load_query(data32, data);
729 return ret ? ret : err;
730 }
731 break;
732 case COMPAT_QSEECOM_IOCTL_SEND_CMD_SERVICE_REQ: {
733 struct compat_qseecom_send_svc_cmd_req __user *data32;
734 struct qseecom_send_svc_cmd_req __user *data;
735 int err;
736
737 data32 = compat_ptr(arg);
738 data = compat_alloc_user_space(sizeof(*data));
739 if (data == NULL)
740 return -EFAULT;
741
742 err = compat_get_qseecom_send_svc_cmd_req(data32, data);
743 if (err)
744 return err;
745
746 return qseecom_ioctl(file, convert_cmd(cmd),
747 (unsigned long)data);
748 }
749 break;
750 case COMPAT_QSEECOM_IOCTL_CREATE_KEY_REQ: {
751 struct compat_qseecom_create_key_req __user *data32;
752 struct qseecom_create_key_req __user *data;
753 int err;
754
755 data32 = compat_ptr(arg);
756 data = compat_alloc_user_space(sizeof(*data));
757 if (data == NULL)
758 return -EFAULT;
759
760 err = compat_get_qseecom_create_key_req(data32, data);
761 if (err)
762 return err;
763
764 return qseecom_ioctl(file, convert_cmd(cmd),
765 (unsigned long)data);
766 }
767 break;
768 case COMPAT_QSEECOM_IOCTL_WIPE_KEY_REQ: {
769 struct compat_qseecom_wipe_key_req __user *data32;
770 struct qseecom_wipe_key_req __user *data;
771 int err;
772
773 data32 = compat_ptr(arg);
774 data = compat_alloc_user_space(sizeof(*data));
775 if (data == NULL)
776 return -EFAULT;
777
778 err = compat_get_qseecom_wipe_key_req(data32, data);
779 if (err)
780 return err;
781
782 return qseecom_ioctl(file, convert_cmd(cmd),
783 (unsigned long)data);
784 }
785 break;
786 case COMPAT_QSEECOM_IOCTL_UPDATE_KEY_USER_INFO_REQ: {
787 struct compat_qseecom_update_key_userinfo_req __user *data32;
788 struct qseecom_update_key_userinfo_req __user *data;
789 int err;
790
791 data32 = compat_ptr(arg);
792 data = compat_alloc_user_space(sizeof(*data));
793 if (data == NULL)
794 return -EFAULT;
795
796 err = compat_get_qseecom_update_key_userinfo_req(data32, data);
797 if (err)
798 return err;
799
800 return qseecom_ioctl(file, convert_cmd(cmd),
801 (unsigned long)data);
802 }
803 break;
804 case COMPAT_QSEECOM_IOCTL_SAVE_PARTITION_HASH_REQ: {
805 struct compat_qseecom_save_partition_hash_req __user *data32;
806 struct qseecom_save_partition_hash_req __user *data;
807 int err;
808
809 data32 = compat_ptr(arg);
810 data = compat_alloc_user_space(sizeof(*data));
811 if (data == NULL)
812 return -EFAULT;
813
814 err = compat_get_qseecom_save_partition_hash_req(data32, data);
815 if (err)
816 return err;
817
818 return qseecom_ioctl(file, convert_cmd(cmd),
819 (unsigned long)data);
820 }
821 break;
822 case COMPAT_QSEECOM_IOCTL_IS_ES_ACTIVATED_REQ: {
823 struct compat_qseecom_is_es_activated_req __user *data32;
824 struct qseecom_is_es_activated_req __user *data;
825 int err;
826
827 data32 = compat_ptr(arg);
828 data = compat_alloc_user_space(sizeof(*data));
829 if (data == NULL)
830 return -EFAULT;
831
832 err = compat_get_qseecom_is_es_activated_req(data32, data);
833 if (err)
834 return err;
835
836 ret = qseecom_ioctl(file, convert_cmd(cmd),
837 (unsigned long)data);
838 err = compat_put_qseecom_is_es_activated_req(data32, data);
839 return ret ? ret : err;
840 }
841 break;
842 case COMPAT_QSEECOM_IOCTL_MDTP_CIPHER_DIP_REQ: {
843 struct compat_qseecom_mdtp_cipher_dip_req __user *data32;
844 struct qseecom_mdtp_cipher_dip_req __user *data;
845 int err;
846
847 data32 = compat_ptr(arg);
848 data = compat_alloc_user_space(sizeof(*data));
849 if (data == NULL)
850 return -EFAULT;
851
852 err = compat_get_qseecom_mdtp_cipher_dip_req(data32, data);
853 if (err)
854 return err;
855
856 return qseecom_ioctl(file, convert_cmd(cmd),
857 (unsigned long)data);
858 }
859 break;
860 case COMPAT_QSEECOM_IOCTL_SEND_MODFD_RESP:
861 case COMPAT_QSEECOM_IOCTL_SEND_MODFD_RESP_64: {
862 struct compat_qseecom_send_modfd_listener_resp __user *data32;
863 struct qseecom_send_modfd_listener_resp __user *data;
864 int err;
865
866 data32 = compat_ptr(arg);
867 data = compat_alloc_user_space(sizeof(*data));
868 if (data == NULL)
869 return -EFAULT;
870
871 err = compat_get_qseecom_send_modfd_listener_resp(data32, data);
872 if (err)
873 return err;
874
875 return qseecom_ioctl(file, convert_cmd(cmd),
876 (unsigned long)data);
877 }
878 break;
879 case COMPAT_QSEECOM_QTEEC_IOCTL_CLOSE_SESSION_REQ: {
880 struct compat_qseecom_qteec_req __user *data32;
881 struct qseecom_qteec_req __user *data;
882 int err;
883
884 data32 = compat_ptr(arg);
885 data = compat_alloc_user_space(sizeof(*data));
886 if (data == NULL)
887 return -EFAULT;
888
889 err = compat_get_qseecom_qteec_req(data32, data);
890 if (err)
891 return err;
892
893 return qseecom_ioctl(file, convert_cmd(cmd),
894 (unsigned long)data);
895 }
896 break;
897 case COMPAT_QSEECOM_QTEEC_IOCTL_OPEN_SESSION_REQ:
898 case COMPAT_QSEECOM_QTEEC_IOCTL_INVOKE_MODFD_CMD_REQ:
899 case COMPAT_QSEECOM_QTEEC_IOCTL_REQUEST_CANCELLATION_REQ: {
900 struct compat_qseecom_qteec_modfd_req __user *data32;
901 struct qseecom_qteec_modfd_req __user *data;
902 int err;
903
904 data32 = compat_ptr(arg);
905 data = compat_alloc_user_space(sizeof(*data));
906 if (data == NULL)
907 return -EFAULT;
908
909 err = compat_get_qseecom_qteec_modfd_req(data32, data);
910 if (err)
911 return err;
912
913 return qseecom_ioctl(file, convert_cmd(cmd),
914 (unsigned long)data);
915 }
916 break;
917 default:
918 return -ENOIOCTLCMD;
919 break;
920 }
921 return 0;
922}