1 // SPDX-License-Identifier: BSD-2-Clause
2 /*
3 * Copyright (c) 2014, STMicroelectronics International N.V.
4 * Copyright (c) 2022, Linaro Limited.
5 */
6 #include <compiler.h>
7 #include <tee_internal_api.h>
8
to_gp11_param(uint32_t pt,const TEE_Param params[TEE_NUM_PARAMS],__GP11_TEE_Param gp11_params[TEE_NUM_PARAMS])9 static void to_gp11_param(uint32_t pt, const TEE_Param params[TEE_NUM_PARAMS],
10 __GP11_TEE_Param gp11_params[TEE_NUM_PARAMS])
11 {
12 size_t n = 0;
13
14 for (n = 0; n < TEE_NUM_PARAMS; n++) {
15 switch (TEE_PARAM_TYPE_GET(pt, n)) {
16 case TEE_PARAM_TYPE_VALUE_INPUT:
17 case TEE_PARAM_TYPE_VALUE_OUTPUT:
18 case TEE_PARAM_TYPE_VALUE_INOUT:
19 gp11_params[n].value.a = params[n].value.a;
20 gp11_params[n].value.b = params[n].value.b;
21 break;
22 case TEE_PARAM_TYPE_MEMREF_INPUT:
23 case TEE_PARAM_TYPE_MEMREF_OUTPUT:
24 case TEE_PARAM_TYPE_MEMREF_INOUT:
25 gp11_params[n].memref.buffer = params[n].memref.buffer;
26 gp11_params[n].memref.size = params[n].memref.size;
27 break;
28 default:
29 break;
30 }
31 }
32 }
33
from_gp11_param(uint32_t pt,const __GP11_TEE_Param gp11_params[TEE_NUM_PARAMS],TEE_Param params[TEE_NUM_PARAMS])34 static void from_gp11_param(uint32_t pt,
35 const __GP11_TEE_Param gp11_params[TEE_NUM_PARAMS],
36 TEE_Param params[TEE_NUM_PARAMS])
37 {
38 size_t n = 0;
39
40 for (n = 0; n < TEE_NUM_PARAMS; n++) {
41 switch (TEE_PARAM_TYPE_GET(pt, n)) {
42 case TEE_PARAM_TYPE_VALUE_INPUT:
43 case TEE_PARAM_TYPE_VALUE_OUTPUT:
44 case TEE_PARAM_TYPE_VALUE_INOUT:
45 params[n].value.a = gp11_params[n].value.a;
46 params[n].value.b = gp11_params[n].value.b;
47 break;
48 case TEE_PARAM_TYPE_MEMREF_INPUT:
49 case TEE_PARAM_TYPE_MEMREF_OUTPUT:
50 case TEE_PARAM_TYPE_MEMREF_INOUT:
51 params[n].memref.buffer = gp11_params[n].memref.buffer;
52 params[n].memref.size = gp11_params[n].memref.size;
53 break;
54 default:
55 break;
56 }
57 }
58 }
59
60 /*
61 * Legacy TAs will due to macros define __GP11_TA_OpenSessionEntryPoint()
62 * instead so call that function instead.
63 */
64
__ta_open_sess(uint32_t pt,TEE_Param params[TEE_NUM_PARAMS],void ** sess_ctx,TEE_Result (* fp)(uint32_t,__GP11_TEE_Param[TEE_NUM_PARAMS],void **))65 TEE_Result __ta_open_sess(uint32_t pt, TEE_Param params[TEE_NUM_PARAMS],
66 void **sess_ctx,
67 TEE_Result (*fp)(uint32_t,
68 __GP11_TEE_Param [TEE_NUM_PARAMS],
69 void **))
70 {
71 __GP11_TEE_Param gp11_params[TEE_NUM_PARAMS] = { };
72 TEE_Result res = TEE_SUCCESS;
73
74 to_gp11_param(pt, params, gp11_params);
75 res = fp(pt, gp11_params, sess_ctx);
76 from_gp11_param(pt, gp11_params, params);
77
78 return res;
79 }
80
81 /*
82 * Legacy TAs will due to macros define __GP11_TA_InvokeCommandEntryPoint()
83 * instead so call that function instead.
84 */
85
__ta_invoke_cmd(void * sess_ctx,uint32_t cmd_id,uint32_t pt,TEE_Param params[TEE_NUM_PARAMS],TEE_Result (* fp)(void *,uint32_t,uint32_t,__GP11_TEE_Param[TEE_NUM_PARAMS]))86 TEE_Result __ta_invoke_cmd(void *sess_ctx, uint32_t cmd_id, uint32_t pt,
87 TEE_Param params[TEE_NUM_PARAMS],
88 TEE_Result (*fp)(void *, uint32_t, uint32_t,
89 __GP11_TEE_Param [TEE_NUM_PARAMS]))
90 {
91 __GP11_TEE_Param gp11_params[TEE_NUM_PARAMS] = { };
92 TEE_Result res = TEE_SUCCESS;
93
94 to_gp11_param(pt, params, gp11_params);
95 res = fp(sess_ctx, cmd_id, pt, gp11_params);
96 from_gp11_param(pt, gp11_params, params);
97
98 return res;
99 }
100