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