xref: /rk3399_rockchip-uboot/lib/optee_clientApi/OpteeClientInterface.c (revision ae8ec5e1394c5d98dfa1830d00daa005945fdb8e)
1*ae8ec5e1SHisping Lin /*
2*ae8ec5e1SHisping Lin  * Copyright 2017, Rockchip Electronics Co., Ltd
3*ae8ec5e1SHisping Lin  * hisping lin, <hisping.lin@rock-chips.com>
4*ae8ec5e1SHisping Lin  *
5*ae8ec5e1SHisping Lin  * SPDX-License-Identifier:	GPL-2.0+
6*ae8ec5e1SHisping Lin  */
7*ae8ec5e1SHisping Lin 
8*ae8ec5e1SHisping Lin #include <common.h>
9*ae8ec5e1SHisping Lin #include <optee_include/OpteeClientApiLib.h>
10*ae8ec5e1SHisping Lin #include <optee_include/tee_client_api.h>
11*ae8ec5e1SHisping Lin 
12*ae8ec5e1SHisping Lin void test_optee(void)
13*ae8ec5e1SHisping Lin {
14*ae8ec5e1SHisping Lin 	TEEC_Result TeecResult;
15*ae8ec5e1SHisping Lin 	TEEC_Context TeecContext;
16*ae8ec5e1SHisping Lin 	TEEC_Session TeecSession;
17*ae8ec5e1SHisping Lin 	uint32_t ErrorOrigin;
18*ae8ec5e1SHisping Lin 	TEEC_UUID tempuuid = { 0x1b484ea5, 0x698b, 0x4142,
19*ae8ec5e1SHisping Lin 		{ 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } };
20*ae8ec5e1SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
21*ae8ec5e1SHisping Lin 	TEEC_Operation TeecOperation = {0};
22*ae8ec5e1SHisping Lin 
23*ae8ec5e1SHisping Lin 	debug("testmm start\n");
24*ae8ec5e1SHisping Lin 	OpteeClientApiLibInitialize();
25*ae8ec5e1SHisping Lin 
26*ae8ec5e1SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
27*ae8ec5e1SHisping Lin 
28*ae8ec5e1SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
29*ae8ec5e1SHisping Lin 				&TeecSession,
30*ae8ec5e1SHisping Lin 				TeecUuid,
31*ae8ec5e1SHisping Lin 				TEEC_LOGIN_PUBLIC,
32*ae8ec5e1SHisping Lin 				NULL,
33*ae8ec5e1SHisping Lin 				NULL,
34*ae8ec5e1SHisping Lin 				&ErrorOrigin);
35*ae8ec5e1SHisping Lin 
36*ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem0 = {0};
37*ae8ec5e1SHisping Lin 
38*ae8ec5e1SHisping Lin 	SharedMem0.size = sizeof("filename_test");
39*ae8ec5e1SHisping Lin 	SharedMem0.flags = 0;
40*ae8ec5e1SHisping Lin 
41*ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
42*ae8ec5e1SHisping Lin 
43*ae8ec5e1SHisping Lin 	memcpy(SharedMem0.buffer, "filename_test", SharedMem0.size);
44*ae8ec5e1SHisping Lin 
45*ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem1 = {0};
46*ae8ec5e1SHisping Lin 
47*ae8ec5e1SHisping Lin 	SharedMem1.size = 32;
48*ae8ec5e1SHisping Lin 	SharedMem1.flags = 0;
49*ae8ec5e1SHisping Lin 
50*ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1);
51*ae8ec5e1SHisping Lin 
52*ae8ec5e1SHisping Lin 	memset(SharedMem1.buffer, 'a', SharedMem1.size);
53*ae8ec5e1SHisping Lin 
54*ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
55*ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
56*ae8ec5e1SHisping Lin 
57*ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer;
58*ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.size = SharedMem1.size;
59*ae8ec5e1SHisping Lin 
60*ae8ec5e1SHisping Lin 
61*ae8ec5e1SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
62*ae8ec5e1SHisping Lin 						TEEC_MEMREF_TEMP_INOUT,
63*ae8ec5e1SHisping Lin 						TEEC_NONE,
64*ae8ec5e1SHisping Lin 						TEEC_NONE);
65*ae8ec5e1SHisping Lin 
66*ae8ec5e1SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
67*ae8ec5e1SHisping Lin 					1,
68*ae8ec5e1SHisping Lin 					&TeecOperation,
69*ae8ec5e1SHisping Lin 					&ErrorOrigin);
70*ae8ec5e1SHisping Lin 
71*ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem0);
72*ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem1);
73*ae8ec5e1SHisping Lin 
74*ae8ec5e1SHisping Lin 	TEEC_CloseSession(&TeecSession);
75*ae8ec5e1SHisping Lin 
76*ae8ec5e1SHisping Lin 	TeecResult = TEEC_FinalizeContext(&TeecContext);
77*ae8ec5e1SHisping Lin 
78*ae8ec5e1SHisping Lin 	debug("testmm end\n");
79*ae8ec5e1SHisping Lin 	debug("TeecResult %x\n", TeecResult);
80*ae8ec5e1SHisping Lin }
81*ae8ec5e1SHisping Lin 
82*ae8ec5e1SHisping Lin 
83*ae8ec5e1SHisping Lin static uint8_t b2hs_add_base(uint8_t in)
84*ae8ec5e1SHisping Lin {
85*ae8ec5e1SHisping Lin 	if (in > 9)
86*ae8ec5e1SHisping Lin 		return in + 55;
87*ae8ec5e1SHisping Lin 	else
88*ae8ec5e1SHisping Lin 		return in + 48;
89*ae8ec5e1SHisping Lin }
90*ae8ec5e1SHisping Lin 
91*ae8ec5e1SHisping Lin uint32_t b2hs(uint8_t *b, uint8_t *hs, uint32_t blen, uint32_t hslen)
92*ae8ec5e1SHisping Lin {
93*ae8ec5e1SHisping Lin 	uint32_t i = 0;
94*ae8ec5e1SHisping Lin 
95*ae8ec5e1SHisping Lin 	if (blen * 2 + 1 > hslen)
96*ae8ec5e1SHisping Lin 		return 0;
97*ae8ec5e1SHisping Lin 
98*ae8ec5e1SHisping Lin 	for (; i < blen; i++) {
99*ae8ec5e1SHisping Lin 		hs[i * 2 + 1] = b2hs_add_base(b[i] & 0xf);
100*ae8ec5e1SHisping Lin 		hs[i * 2] = b2hs_add_base(b[i] >> 4);
101*ae8ec5e1SHisping Lin 	}
102*ae8ec5e1SHisping Lin 	hs[blen * 2] = 0;
103*ae8ec5e1SHisping Lin 
104*ae8ec5e1SHisping Lin 	return blen * 2;
105*ae8ec5e1SHisping Lin }
106*ae8ec5e1SHisping Lin 
107*ae8ec5e1SHisping Lin 
108*ae8ec5e1SHisping Lin uint32_t trusty_read_rollback_index(uint32_t slot, uint64_t *value)
109*ae8ec5e1SHisping Lin {
110*ae8ec5e1SHisping Lin 	TEEC_Result TeecResult;
111*ae8ec5e1SHisping Lin 	TEEC_Context TeecContext;
112*ae8ec5e1SHisping Lin 	TEEC_Session TeecSession;
113*ae8ec5e1SHisping Lin 	uint32_t ErrorOrigin;
114*ae8ec5e1SHisping Lin 	TEEC_UUID tempuuid = { 0x1b484ea5, 0x698b, 0x4142,
115*ae8ec5e1SHisping Lin 			{ 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } };
116*ae8ec5e1SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
117*ae8ec5e1SHisping Lin 	TEEC_Operation TeecOperation = {0};
118*ae8ec5e1SHisping Lin 	uint8_t hs[9];
119*ae8ec5e1SHisping Lin 
120*ae8ec5e1SHisping Lin 	b2hs((uint8_t *)&slot, hs, 4, 9);
121*ae8ec5e1SHisping Lin 	debug("testmm start\n");
122*ae8ec5e1SHisping Lin 	OpteeClientApiLibInitialize();
123*ae8ec5e1SHisping Lin 
124*ae8ec5e1SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
125*ae8ec5e1SHisping Lin 
126*ae8ec5e1SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
127*ae8ec5e1SHisping Lin 				&TeecSession,
128*ae8ec5e1SHisping Lin 				TeecUuid,
129*ae8ec5e1SHisping Lin 				TEEC_LOGIN_PUBLIC,
130*ae8ec5e1SHisping Lin 				NULL,
131*ae8ec5e1SHisping Lin 				NULL,
132*ae8ec5e1SHisping Lin 				&ErrorOrigin);
133*ae8ec5e1SHisping Lin 
134*ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem0 = {0};
135*ae8ec5e1SHisping Lin 
136*ae8ec5e1SHisping Lin 	SharedMem0.size = 8;
137*ae8ec5e1SHisping Lin 	SharedMem0.flags = 0;
138*ae8ec5e1SHisping Lin 
139*ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
140*ae8ec5e1SHisping Lin 
141*ae8ec5e1SHisping Lin 	memcpy(SharedMem0.buffer, hs, SharedMem0.size);
142*ae8ec5e1SHisping Lin 
143*ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem1 = {0};
144*ae8ec5e1SHisping Lin 
145*ae8ec5e1SHisping Lin 	SharedMem1.size = 8;
146*ae8ec5e1SHisping Lin 	SharedMem1.flags = 0;
147*ae8ec5e1SHisping Lin 
148*ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1);
149*ae8ec5e1SHisping Lin 
150*ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
151*ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
152*ae8ec5e1SHisping Lin 
153*ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer;
154*ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.size = SharedMem1.size;
155*ae8ec5e1SHisping Lin 
156*ae8ec5e1SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
157*ae8ec5e1SHisping Lin 						TEEC_MEMREF_TEMP_INOUT,
158*ae8ec5e1SHisping Lin 						TEEC_NONE,
159*ae8ec5e1SHisping Lin 						TEEC_NONE);
160*ae8ec5e1SHisping Lin 
161*ae8ec5e1SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
162*ae8ec5e1SHisping Lin 					0,
163*ae8ec5e1SHisping Lin 					&TeecOperation,
164*ae8ec5e1SHisping Lin 					&ErrorOrigin);
165*ae8ec5e1SHisping Lin 
166*ae8ec5e1SHisping Lin 	memcpy((char *)value, SharedMem1.buffer, SharedMem1.size);
167*ae8ec5e1SHisping Lin 
168*ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem0);
169*ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem1);
170*ae8ec5e1SHisping Lin 
171*ae8ec5e1SHisping Lin 	TEEC_CloseSession(&TeecSession);
172*ae8ec5e1SHisping Lin 
173*ae8ec5e1SHisping Lin 	TeecResult = TEEC_FinalizeContext(&TeecContext);
174*ae8ec5e1SHisping Lin 
175*ae8ec5e1SHisping Lin 	debug("testmm end\n");
176*ae8ec5e1SHisping Lin 	return TeecResult;
177*ae8ec5e1SHisping Lin }
178*ae8ec5e1SHisping Lin 
179*ae8ec5e1SHisping Lin uint32_t trusty_write_rollback_index(uint32_t slot, uint64_t value)
180*ae8ec5e1SHisping Lin {
181*ae8ec5e1SHisping Lin 	TEEC_Result TeecResult;
182*ae8ec5e1SHisping Lin 	TEEC_Context TeecContext;
183*ae8ec5e1SHisping Lin 	TEEC_Session TeecSession;
184*ae8ec5e1SHisping Lin 	uint32_t ErrorOrigin;
185*ae8ec5e1SHisping Lin 	TEEC_UUID tempuuid = { 0x1b484ea5, 0x698b, 0x4142,
186*ae8ec5e1SHisping Lin 		{ 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } };
187*ae8ec5e1SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
188*ae8ec5e1SHisping Lin 	TEEC_Operation TeecOperation = {0};
189*ae8ec5e1SHisping Lin 	uint8_t hs[9];
190*ae8ec5e1SHisping Lin 	b2hs((uint8_t *)&slot, hs, 4, 9);
191*ae8ec5e1SHisping Lin 	OpteeClientApiLibInitialize();
192*ae8ec5e1SHisping Lin 
193*ae8ec5e1SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
194*ae8ec5e1SHisping Lin 
195*ae8ec5e1SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
196*ae8ec5e1SHisping Lin 				&TeecSession,
197*ae8ec5e1SHisping Lin 				TeecUuid,
198*ae8ec5e1SHisping Lin 				TEEC_LOGIN_PUBLIC,
199*ae8ec5e1SHisping Lin 				NULL,
200*ae8ec5e1SHisping Lin 				NULL,
201*ae8ec5e1SHisping Lin 				&ErrorOrigin);
202*ae8ec5e1SHisping Lin 
203*ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem0 = {0};
204*ae8ec5e1SHisping Lin 
205*ae8ec5e1SHisping Lin 	SharedMem0.size = 8;
206*ae8ec5e1SHisping Lin 	SharedMem0.flags = 0;
207*ae8ec5e1SHisping Lin 
208*ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
209*ae8ec5e1SHisping Lin 
210*ae8ec5e1SHisping Lin 	memcpy(SharedMem0.buffer, hs, SharedMem0.size);
211*ae8ec5e1SHisping Lin 
212*ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem1 = {0};
213*ae8ec5e1SHisping Lin 
214*ae8ec5e1SHisping Lin 	SharedMem1.size = 8;
215*ae8ec5e1SHisping Lin 	SharedMem1.flags = 0;
216*ae8ec5e1SHisping Lin 
217*ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1);
218*ae8ec5e1SHisping Lin 
219*ae8ec5e1SHisping Lin 	memcpy(SharedMem1.buffer, (char *)&value, SharedMem1.size);
220*ae8ec5e1SHisping Lin 
221*ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
222*ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
223*ae8ec5e1SHisping Lin 
224*ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer;
225*ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.size = SharedMem1.size;
226*ae8ec5e1SHisping Lin 
227*ae8ec5e1SHisping Lin 
228*ae8ec5e1SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
229*ae8ec5e1SHisping Lin 						TEEC_MEMREF_TEMP_INOUT,
230*ae8ec5e1SHisping Lin 						TEEC_NONE,
231*ae8ec5e1SHisping Lin 						TEEC_NONE);
232*ae8ec5e1SHisping Lin 
233*ae8ec5e1SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
234*ae8ec5e1SHisping Lin 					1,
235*ae8ec5e1SHisping Lin 					&TeecOperation,
236*ae8ec5e1SHisping Lin 					&ErrorOrigin);
237*ae8ec5e1SHisping Lin 
238*ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem0);
239*ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem1);
240*ae8ec5e1SHisping Lin 
241*ae8ec5e1SHisping Lin 	TEEC_CloseSession(&TeecSession);
242*ae8ec5e1SHisping Lin 
243*ae8ec5e1SHisping Lin 	TeecResult = TEEC_FinalizeContext(&TeecContext);
244*ae8ec5e1SHisping Lin 
245*ae8ec5e1SHisping Lin 	debug("testmm end\n");
246*ae8ec5e1SHisping Lin 
247*ae8ec5e1SHisping Lin 	return TeecResult;
248*ae8ec5e1SHisping Lin }
249*ae8ec5e1SHisping Lin 
250*ae8ec5e1SHisping Lin uint32_t trusty_read_permanent_attributes(uint8_t *attributes, uint32_t size)
251*ae8ec5e1SHisping Lin {
252*ae8ec5e1SHisping Lin 	TEEC_Result TeecResult;
253*ae8ec5e1SHisping Lin 	TEEC_Context TeecContext;
254*ae8ec5e1SHisping Lin 	TEEC_Session TeecSession;
255*ae8ec5e1SHisping Lin 	uint32_t ErrorOrigin;
256*ae8ec5e1SHisping Lin 	TEEC_UUID tempuuid = { 0x1b484ea5, 0x698b, 0x4142,
257*ae8ec5e1SHisping Lin 		{ 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } };
258*ae8ec5e1SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
259*ae8ec5e1SHisping Lin 	TEEC_Operation TeecOperation = {0};
260*ae8ec5e1SHisping Lin 
261*ae8ec5e1SHisping Lin 	debug("testmm start\n");
262*ae8ec5e1SHisping Lin 	OpteeClientApiLibInitialize();
263*ae8ec5e1SHisping Lin 
264*ae8ec5e1SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
265*ae8ec5e1SHisping Lin 
266*ae8ec5e1SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
267*ae8ec5e1SHisping Lin 				&TeecSession,
268*ae8ec5e1SHisping Lin 				TeecUuid,
269*ae8ec5e1SHisping Lin 				TEEC_LOGIN_PUBLIC,
270*ae8ec5e1SHisping Lin 				NULL,
271*ae8ec5e1SHisping Lin 				NULL,
272*ae8ec5e1SHisping Lin 				&ErrorOrigin);
273*ae8ec5e1SHisping Lin 
274*ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem0 = {0};
275*ae8ec5e1SHisping Lin 
276*ae8ec5e1SHisping Lin 	SharedMem0.size = sizeof("attributes");
277*ae8ec5e1SHisping Lin 	SharedMem0.flags = 0;
278*ae8ec5e1SHisping Lin 
279*ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
280*ae8ec5e1SHisping Lin 
281*ae8ec5e1SHisping Lin 	memcpy(SharedMem0.buffer, "attributes", SharedMem0.size);
282*ae8ec5e1SHisping Lin 
283*ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem1 = {0};
284*ae8ec5e1SHisping Lin 
285*ae8ec5e1SHisping Lin 	SharedMem1.size = size;
286*ae8ec5e1SHisping Lin 	SharedMem1.flags = 0;
287*ae8ec5e1SHisping Lin 
288*ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1);
289*ae8ec5e1SHisping Lin 
290*ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
291*ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
292*ae8ec5e1SHisping Lin 
293*ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer;
294*ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.size = SharedMem1.size;
295*ae8ec5e1SHisping Lin 
296*ae8ec5e1SHisping Lin 
297*ae8ec5e1SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
298*ae8ec5e1SHisping Lin 						TEEC_MEMREF_TEMP_INOUT,
299*ae8ec5e1SHisping Lin 						TEEC_NONE,
300*ae8ec5e1SHisping Lin 						TEEC_NONE);
301*ae8ec5e1SHisping Lin 
302*ae8ec5e1SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
303*ae8ec5e1SHisping Lin 					0,
304*ae8ec5e1SHisping Lin 					&TeecOperation,
305*ae8ec5e1SHisping Lin 					&ErrorOrigin);
306*ae8ec5e1SHisping Lin 
307*ae8ec5e1SHisping Lin 	memcpy(attributes, SharedMem1.buffer, SharedMem1.size);
308*ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem0);
309*ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem1);
310*ae8ec5e1SHisping Lin 	TEEC_CloseSession(&TeecSession);
311*ae8ec5e1SHisping Lin 	TeecResult = TEEC_FinalizeContext(&TeecContext);
312*ae8ec5e1SHisping Lin 	debug("testmm end\n");
313*ae8ec5e1SHisping Lin 
314*ae8ec5e1SHisping Lin 	return TeecResult;
315*ae8ec5e1SHisping Lin }
316*ae8ec5e1SHisping Lin 
317*ae8ec5e1SHisping Lin uint32_t trusty_write_permanent_attributes(uint8_t *attributes, uint32_t size)
318*ae8ec5e1SHisping Lin {
319*ae8ec5e1SHisping Lin 	TEEC_Result TeecResult;
320*ae8ec5e1SHisping Lin 	TEEC_Context TeecContext;
321*ae8ec5e1SHisping Lin 	TEEC_Session TeecSession;
322*ae8ec5e1SHisping Lin 	uint32_t ErrorOrigin;
323*ae8ec5e1SHisping Lin 	TEEC_UUID tempuuid = { 0x1b484ea5, 0x698b, 0x4142,
324*ae8ec5e1SHisping Lin 		{ 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } };
325*ae8ec5e1SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
326*ae8ec5e1SHisping Lin 	TEEC_Operation TeecOperation = {0};
327*ae8ec5e1SHisping Lin 
328*ae8ec5e1SHisping Lin 	debug("testmm start\n");
329*ae8ec5e1SHisping Lin 	OpteeClientApiLibInitialize();
330*ae8ec5e1SHisping Lin 
331*ae8ec5e1SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
332*ae8ec5e1SHisping Lin 
333*ae8ec5e1SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
334*ae8ec5e1SHisping Lin 				&TeecSession,
335*ae8ec5e1SHisping Lin 				TeecUuid,
336*ae8ec5e1SHisping Lin 				TEEC_LOGIN_PUBLIC,
337*ae8ec5e1SHisping Lin 				NULL,
338*ae8ec5e1SHisping Lin 				NULL,
339*ae8ec5e1SHisping Lin 				&ErrorOrigin);
340*ae8ec5e1SHisping Lin 
341*ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem0 = {0};
342*ae8ec5e1SHisping Lin 
343*ae8ec5e1SHisping Lin 	SharedMem0.size = sizeof("attributes");
344*ae8ec5e1SHisping Lin 	SharedMem0.flags = 0;
345*ae8ec5e1SHisping Lin 
346*ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
347*ae8ec5e1SHisping Lin 
348*ae8ec5e1SHisping Lin 	memcpy(SharedMem0.buffer, "attributes", SharedMem0.size);
349*ae8ec5e1SHisping Lin 
350*ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem1 = {0};
351*ae8ec5e1SHisping Lin 
352*ae8ec5e1SHisping Lin 	SharedMem1.size = size;
353*ae8ec5e1SHisping Lin 	SharedMem1.flags = 0;
354*ae8ec5e1SHisping Lin 
355*ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1);
356*ae8ec5e1SHisping Lin 
357*ae8ec5e1SHisping Lin 	memcpy(SharedMem1.buffer, attributes, SharedMem1.size);
358*ae8ec5e1SHisping Lin 
359*ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
360*ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
361*ae8ec5e1SHisping Lin 
362*ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer;
363*ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.size = SharedMem1.size;
364*ae8ec5e1SHisping Lin 
365*ae8ec5e1SHisping Lin 
366*ae8ec5e1SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
367*ae8ec5e1SHisping Lin 						TEEC_MEMREF_TEMP_INOUT,
368*ae8ec5e1SHisping Lin 						TEEC_NONE,
369*ae8ec5e1SHisping Lin 						TEEC_NONE);
370*ae8ec5e1SHisping Lin 
371*ae8ec5e1SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
372*ae8ec5e1SHisping Lin 					1,
373*ae8ec5e1SHisping Lin 					&TeecOperation,
374*ae8ec5e1SHisping Lin 					&ErrorOrigin);
375*ae8ec5e1SHisping Lin 
376*ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem0);
377*ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem1);
378*ae8ec5e1SHisping Lin 	TEEC_CloseSession(&TeecSession);
379*ae8ec5e1SHisping Lin 	TeecResult = TEEC_FinalizeContext(&TeecContext);
380*ae8ec5e1SHisping Lin 	debug("testmm end\n");
381*ae8ec5e1SHisping Lin 
382*ae8ec5e1SHisping Lin 	return TeecResult;
383*ae8ec5e1SHisping Lin }
384*ae8ec5e1SHisping Lin 
385*ae8ec5e1SHisping Lin uint32_t trusty_read_lock_state(uint8_t *lock_state)
386*ae8ec5e1SHisping Lin {
387*ae8ec5e1SHisping Lin 	TEEC_Result TeecResult;
388*ae8ec5e1SHisping Lin 	TEEC_Context TeecContext;
389*ae8ec5e1SHisping Lin 	TEEC_Session TeecSession;
390*ae8ec5e1SHisping Lin 	uint32_t ErrorOrigin;
391*ae8ec5e1SHisping Lin 	TEEC_UUID tempuuid = { 0x1b484ea5, 0x698b, 0x4142,
392*ae8ec5e1SHisping Lin 		{ 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } };
393*ae8ec5e1SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
394*ae8ec5e1SHisping Lin 	TEEC_Operation TeecOperation = {0};
395*ae8ec5e1SHisping Lin 
396*ae8ec5e1SHisping Lin 	debug("testmm start\n");
397*ae8ec5e1SHisping Lin 	OpteeClientApiLibInitialize();
398*ae8ec5e1SHisping Lin 
399*ae8ec5e1SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
400*ae8ec5e1SHisping Lin 
401*ae8ec5e1SHisping Lin 
402*ae8ec5e1SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
403*ae8ec5e1SHisping Lin 				&TeecSession,
404*ae8ec5e1SHisping Lin 				TeecUuid,
405*ae8ec5e1SHisping Lin 				TEEC_LOGIN_PUBLIC,
406*ae8ec5e1SHisping Lin 				NULL,
407*ae8ec5e1SHisping Lin 				NULL,
408*ae8ec5e1SHisping Lin 				&ErrorOrigin);
409*ae8ec5e1SHisping Lin 
410*ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem0 = {0};
411*ae8ec5e1SHisping Lin 
412*ae8ec5e1SHisping Lin 	SharedMem0.size = sizeof("lock_state");
413*ae8ec5e1SHisping Lin 	SharedMem0.flags = 0;
414*ae8ec5e1SHisping Lin 
415*ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
416*ae8ec5e1SHisping Lin 
417*ae8ec5e1SHisping Lin 	memcpy(SharedMem0.buffer, "lock_state", SharedMem0.size);
418*ae8ec5e1SHisping Lin 
419*ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem1 = {0};
420*ae8ec5e1SHisping Lin 
421*ae8ec5e1SHisping Lin 	SharedMem1.size = 1;
422*ae8ec5e1SHisping Lin 	SharedMem1.flags = 0;
423*ae8ec5e1SHisping Lin 
424*ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1);
425*ae8ec5e1SHisping Lin 
426*ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
427*ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
428*ae8ec5e1SHisping Lin 
429*ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer;
430*ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.size = SharedMem1.size;
431*ae8ec5e1SHisping Lin 
432*ae8ec5e1SHisping Lin 
433*ae8ec5e1SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
434*ae8ec5e1SHisping Lin 						TEEC_MEMREF_TEMP_INOUT,
435*ae8ec5e1SHisping Lin 						TEEC_NONE,
436*ae8ec5e1SHisping Lin 						TEEC_NONE);
437*ae8ec5e1SHisping Lin 
438*ae8ec5e1SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
439*ae8ec5e1SHisping Lin 					0,
440*ae8ec5e1SHisping Lin 					&TeecOperation,
441*ae8ec5e1SHisping Lin 					&ErrorOrigin);
442*ae8ec5e1SHisping Lin 
443*ae8ec5e1SHisping Lin 	memcpy(lock_state, SharedMem1.buffer, SharedMem1.size);
444*ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem0);
445*ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem1);
446*ae8ec5e1SHisping Lin 	TEEC_CloseSession(&TeecSession);
447*ae8ec5e1SHisping Lin 	TeecResult = TEEC_FinalizeContext(&TeecContext);
448*ae8ec5e1SHisping Lin 	debug("testmm end\n");
449*ae8ec5e1SHisping Lin 
450*ae8ec5e1SHisping Lin 	return TeecResult;
451*ae8ec5e1SHisping Lin }
452*ae8ec5e1SHisping Lin 
453*ae8ec5e1SHisping Lin uint32_t trusty_write_lock_state(uint8_t lock_state)
454*ae8ec5e1SHisping Lin {
455*ae8ec5e1SHisping Lin 	TEEC_Result TeecResult;
456*ae8ec5e1SHisping Lin 	TEEC_Context TeecContext;
457*ae8ec5e1SHisping Lin 	TEEC_Session TeecSession;
458*ae8ec5e1SHisping Lin 	uint32_t ErrorOrigin;
459*ae8ec5e1SHisping Lin 	TEEC_UUID  tempuuid = { 0x1b484ea5, 0x698b, 0x4142,
460*ae8ec5e1SHisping Lin 		{ 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } };
461*ae8ec5e1SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
462*ae8ec5e1SHisping Lin 	TEEC_Operation TeecOperation = {0};
463*ae8ec5e1SHisping Lin 
464*ae8ec5e1SHisping Lin 	debug("testmm start\n");
465*ae8ec5e1SHisping Lin 	OpteeClientApiLibInitialize();
466*ae8ec5e1SHisping Lin 
467*ae8ec5e1SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
468*ae8ec5e1SHisping Lin 
469*ae8ec5e1SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
470*ae8ec5e1SHisping Lin 				&TeecSession,
471*ae8ec5e1SHisping Lin 				TeecUuid,
472*ae8ec5e1SHisping Lin 				TEEC_LOGIN_PUBLIC,
473*ae8ec5e1SHisping Lin 				NULL,
474*ae8ec5e1SHisping Lin 				NULL,
475*ae8ec5e1SHisping Lin 				&ErrorOrigin);
476*ae8ec5e1SHisping Lin 
477*ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem0 = {0};
478*ae8ec5e1SHisping Lin 
479*ae8ec5e1SHisping Lin 	SharedMem0.size = sizeof("lock_state");
480*ae8ec5e1SHisping Lin 	SharedMem0.flags = 0;
481*ae8ec5e1SHisping Lin 
482*ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
483*ae8ec5e1SHisping Lin 
484*ae8ec5e1SHisping Lin 	memcpy(SharedMem0.buffer, "lock_state", SharedMem0.size);
485*ae8ec5e1SHisping Lin 
486*ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem1 = {0};
487*ae8ec5e1SHisping Lin 
488*ae8ec5e1SHisping Lin 	SharedMem1.size = 1;
489*ae8ec5e1SHisping Lin 	SharedMem1.flags = 0;
490*ae8ec5e1SHisping Lin 
491*ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1);
492*ae8ec5e1SHisping Lin 
493*ae8ec5e1SHisping Lin 	memcpy(SharedMem1.buffer, &lock_state, SharedMem1.size);
494*ae8ec5e1SHisping Lin 
495*ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
496*ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
497*ae8ec5e1SHisping Lin 
498*ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer;
499*ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.size = SharedMem1.size;
500*ae8ec5e1SHisping Lin 
501*ae8ec5e1SHisping Lin 
502*ae8ec5e1SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
503*ae8ec5e1SHisping Lin 						TEEC_MEMREF_TEMP_INOUT,
504*ae8ec5e1SHisping Lin 						TEEC_NONE,
505*ae8ec5e1SHisping Lin 						TEEC_NONE);
506*ae8ec5e1SHisping Lin 
507*ae8ec5e1SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
508*ae8ec5e1SHisping Lin 					1,
509*ae8ec5e1SHisping Lin 					&TeecOperation,
510*ae8ec5e1SHisping Lin 					&ErrorOrigin);
511*ae8ec5e1SHisping Lin 
512*ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem0);
513*ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem1);
514*ae8ec5e1SHisping Lin 	TEEC_CloseSession(&TeecSession);
515*ae8ec5e1SHisping Lin 	TeecResult = TEEC_FinalizeContext(&TeecContext);
516*ae8ec5e1SHisping Lin 	debug("testmm end\n");
517*ae8ec5e1SHisping Lin 
518*ae8ec5e1SHisping Lin 	return TeecResult;
519*ae8ec5e1SHisping Lin }
520*ae8ec5e1SHisping Lin 
521*ae8ec5e1SHisping Lin uint32_t trusty_read_flash_lock_state(uint8_t *flash_lock_state)
522*ae8ec5e1SHisping Lin {
523*ae8ec5e1SHisping Lin 	TEEC_Result TeecResult;
524*ae8ec5e1SHisping Lin 	TEEC_Context TeecContext;
525*ae8ec5e1SHisping Lin 	TEEC_Session TeecSession;
526*ae8ec5e1SHisping Lin 	uint32_t ErrorOrigin;
527*ae8ec5e1SHisping Lin 	TEEC_UUID tempuuid = { 0x1b484ea5, 0x698b, 0x4142,
528*ae8ec5e1SHisping Lin 		{ 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } };
529*ae8ec5e1SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
530*ae8ec5e1SHisping Lin 	TEEC_Operation TeecOperation = {0};
531*ae8ec5e1SHisping Lin 
532*ae8ec5e1SHisping Lin 	debug("testmm start\n");
533*ae8ec5e1SHisping Lin 	OpteeClientApiLibInitialize();
534*ae8ec5e1SHisping Lin 
535*ae8ec5e1SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
536*ae8ec5e1SHisping Lin 
537*ae8ec5e1SHisping Lin 
538*ae8ec5e1SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
539*ae8ec5e1SHisping Lin 				&TeecSession,
540*ae8ec5e1SHisping Lin 				TeecUuid,
541*ae8ec5e1SHisping Lin 				TEEC_LOGIN_PUBLIC,
542*ae8ec5e1SHisping Lin 				NULL,
543*ae8ec5e1SHisping Lin 				NULL,
544*ae8ec5e1SHisping Lin 				&ErrorOrigin);
545*ae8ec5e1SHisping Lin 
546*ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem0 = {0};
547*ae8ec5e1SHisping Lin 
548*ae8ec5e1SHisping Lin 	SharedMem0.size = sizeof("flash_lock_state");
549*ae8ec5e1SHisping Lin 	SharedMem0.flags = 0;
550*ae8ec5e1SHisping Lin 
551*ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
552*ae8ec5e1SHisping Lin 
553*ae8ec5e1SHisping Lin 	memcpy(SharedMem0.buffer, "flash_lock_state", SharedMem0.size);
554*ae8ec5e1SHisping Lin 
555*ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem1 = {0};
556*ae8ec5e1SHisping Lin 
557*ae8ec5e1SHisping Lin 	SharedMem1.size = 1;
558*ae8ec5e1SHisping Lin 	SharedMem1.flags = 0;
559*ae8ec5e1SHisping Lin 
560*ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1);
561*ae8ec5e1SHisping Lin 
562*ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
563*ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
564*ae8ec5e1SHisping Lin 
565*ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer;
566*ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.size = SharedMem1.size;
567*ae8ec5e1SHisping Lin 
568*ae8ec5e1SHisping Lin 
569*ae8ec5e1SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
570*ae8ec5e1SHisping Lin 						TEEC_MEMREF_TEMP_INOUT,
571*ae8ec5e1SHisping Lin 						TEEC_NONE,
572*ae8ec5e1SHisping Lin 						TEEC_NONE);
573*ae8ec5e1SHisping Lin 
574*ae8ec5e1SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
575*ae8ec5e1SHisping Lin 					0,
576*ae8ec5e1SHisping Lin 					&TeecOperation,
577*ae8ec5e1SHisping Lin 					&ErrorOrigin);
578*ae8ec5e1SHisping Lin 
579*ae8ec5e1SHisping Lin 	memcpy(flash_lock_state, SharedMem1.buffer, SharedMem1.size);
580*ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem0);
581*ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem1);
582*ae8ec5e1SHisping Lin 	TEEC_CloseSession(&TeecSession);
583*ae8ec5e1SHisping Lin 	TeecResult = TEEC_FinalizeContext(&TeecContext);
584*ae8ec5e1SHisping Lin 	debug("testmm end\n");
585*ae8ec5e1SHisping Lin 
586*ae8ec5e1SHisping Lin 	return TeecResult;
587*ae8ec5e1SHisping Lin }
588*ae8ec5e1SHisping Lin 
589*ae8ec5e1SHisping Lin 
590*ae8ec5e1SHisping Lin uint32_t trusty_write_flash_lock_state(uint8_t flash_lock_state)
591*ae8ec5e1SHisping Lin {
592*ae8ec5e1SHisping Lin 	TEEC_Result TeecResult;
593*ae8ec5e1SHisping Lin 	TEEC_Context TeecContext;
594*ae8ec5e1SHisping Lin 	TEEC_Session TeecSession;
595*ae8ec5e1SHisping Lin 	uint32_t ErrorOrigin;
596*ae8ec5e1SHisping Lin 	TEEC_UUID  tempuuid = { 0x1b484ea5, 0x698b, 0x4142,
597*ae8ec5e1SHisping Lin 		{ 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } };
598*ae8ec5e1SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
599*ae8ec5e1SHisping Lin 	TEEC_Operation TeecOperation = {0};
600*ae8ec5e1SHisping Lin 
601*ae8ec5e1SHisping Lin 	debug("testmm start\n");
602*ae8ec5e1SHisping Lin 	OpteeClientApiLibInitialize();
603*ae8ec5e1SHisping Lin 
604*ae8ec5e1SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
605*ae8ec5e1SHisping Lin 
606*ae8ec5e1SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
607*ae8ec5e1SHisping Lin 				&TeecSession,
608*ae8ec5e1SHisping Lin 				TeecUuid,
609*ae8ec5e1SHisping Lin 				TEEC_LOGIN_PUBLIC,
610*ae8ec5e1SHisping Lin 				NULL,
611*ae8ec5e1SHisping Lin 				NULL,
612*ae8ec5e1SHisping Lin 				&ErrorOrigin);
613*ae8ec5e1SHisping Lin 
614*ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem0 = {0};
615*ae8ec5e1SHisping Lin 
616*ae8ec5e1SHisping Lin 	SharedMem0.size = sizeof("flash_lock_state");
617*ae8ec5e1SHisping Lin 	SharedMem0.flags = 0;
618*ae8ec5e1SHisping Lin 
619*ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
620*ae8ec5e1SHisping Lin 
621*ae8ec5e1SHisping Lin 	memcpy(SharedMem0.buffer, "flash_lock_state", SharedMem0.size);
622*ae8ec5e1SHisping Lin 
623*ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem1 = {0};
624*ae8ec5e1SHisping Lin 
625*ae8ec5e1SHisping Lin 	SharedMem1.size = 1;
626*ae8ec5e1SHisping Lin 	SharedMem1.flags = 0;
627*ae8ec5e1SHisping Lin 
628*ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1);
629*ae8ec5e1SHisping Lin 
630*ae8ec5e1SHisping Lin 	memcpy(SharedMem1.buffer, &flash_lock_state, SharedMem1.size);
631*ae8ec5e1SHisping Lin 
632*ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
633*ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
634*ae8ec5e1SHisping Lin 
635*ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer;
636*ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.size = SharedMem1.size;
637*ae8ec5e1SHisping Lin 
638*ae8ec5e1SHisping Lin 
639*ae8ec5e1SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
640*ae8ec5e1SHisping Lin 						TEEC_MEMREF_TEMP_INOUT,
641*ae8ec5e1SHisping Lin 						TEEC_NONE,
642*ae8ec5e1SHisping Lin 						TEEC_NONE);
643*ae8ec5e1SHisping Lin 
644*ae8ec5e1SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
645*ae8ec5e1SHisping Lin 					1,
646*ae8ec5e1SHisping Lin 					&TeecOperation,
647*ae8ec5e1SHisping Lin 					&ErrorOrigin);
648*ae8ec5e1SHisping Lin 
649*ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem0);
650*ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem1);
651*ae8ec5e1SHisping Lin 	TEEC_CloseSession(&TeecSession);
652*ae8ec5e1SHisping Lin 	TeecResult = TEEC_FinalizeContext(&TeecContext);
653*ae8ec5e1SHisping Lin 	debug("testmm end\n");
654*ae8ec5e1SHisping Lin 
655*ae8ec5e1SHisping Lin 	return TeecResult;
656*ae8ec5e1SHisping Lin }
657*ae8ec5e1SHisping Lin 
658*ae8ec5e1SHisping Lin uint32_t write_to_keymaster(uint8_t *filename,
659*ae8ec5e1SHisping Lin 		uint32_t filename_size,
660*ae8ec5e1SHisping Lin 		uint8_t *data,
661*ae8ec5e1SHisping Lin 		uint32_t data_size)
662*ae8ec5e1SHisping Lin {
663*ae8ec5e1SHisping Lin 	TEEC_Result TeecResult;
664*ae8ec5e1SHisping Lin 	TEEC_Context TeecContext;
665*ae8ec5e1SHisping Lin 	TEEC_Session TeecSession;
666*ae8ec5e1SHisping Lin 	uint32_t ErrorOrigin;
667*ae8ec5e1SHisping Lin 
668*ae8ec5e1SHisping Lin 	TEEC_UUID tempuuid = { 0x258be795, 0xf9ca, 0x40e6,
669*ae8ec5e1SHisping Lin 		{ 0xa8, 0x69, 0x9c, 0xe6, 0x88, 0x6c, 0x5d, 0x5d } };
670*ae8ec5e1SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
671*ae8ec5e1SHisping Lin 	TEEC_Operation TeecOperation = {0};
672*ae8ec5e1SHisping Lin 
673*ae8ec5e1SHisping Lin 	debug("write_to_keymaster\n");
674*ae8ec5e1SHisping Lin 	OpteeClientApiLibInitialize();
675*ae8ec5e1SHisping Lin 
676*ae8ec5e1SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
677*ae8ec5e1SHisping Lin 
678*ae8ec5e1SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
679*ae8ec5e1SHisping Lin 				&TeecSession,
680*ae8ec5e1SHisping Lin 				TeecUuid,
681*ae8ec5e1SHisping Lin 				TEEC_LOGIN_PUBLIC,
682*ae8ec5e1SHisping Lin 				NULL,
683*ae8ec5e1SHisping Lin 				NULL,
684*ae8ec5e1SHisping Lin 				&ErrorOrigin);
685*ae8ec5e1SHisping Lin 
686*ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem0 = {0};
687*ae8ec5e1SHisping Lin 
688*ae8ec5e1SHisping Lin 	SharedMem0.size = filename_size;
689*ae8ec5e1SHisping Lin 	SharedMem0.flags = 0;
690*ae8ec5e1SHisping Lin 
691*ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
692*ae8ec5e1SHisping Lin 
693*ae8ec5e1SHisping Lin 	memcpy(SharedMem0.buffer, filename, SharedMem0.size);
694*ae8ec5e1SHisping Lin 
695*ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem1 = {0};
696*ae8ec5e1SHisping Lin 
697*ae8ec5e1SHisping Lin 	SharedMem1.size = data_size;
698*ae8ec5e1SHisping Lin 	SharedMem1.flags = 0;
699*ae8ec5e1SHisping Lin 
700*ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1);
701*ae8ec5e1SHisping Lin 
702*ae8ec5e1SHisping Lin 	memcpy(SharedMem1.buffer, data, SharedMem1.size);
703*ae8ec5e1SHisping Lin 
704*ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
705*ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
706*ae8ec5e1SHisping Lin 
707*ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer;
708*ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.size = SharedMem1.size;
709*ae8ec5e1SHisping Lin 
710*ae8ec5e1SHisping Lin 
711*ae8ec5e1SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
712*ae8ec5e1SHisping Lin 						TEEC_MEMREF_TEMP_INOUT,
713*ae8ec5e1SHisping Lin 						TEEC_NONE,
714*ae8ec5e1SHisping Lin 						TEEC_NONE);
715*ae8ec5e1SHisping Lin 
716*ae8ec5e1SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
717*ae8ec5e1SHisping Lin 					139,
718*ae8ec5e1SHisping Lin 					&TeecOperation,
719*ae8ec5e1SHisping Lin 					&ErrorOrigin);
720*ae8ec5e1SHisping Lin 
721*ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem0);
722*ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem1);
723*ae8ec5e1SHisping Lin 	TEEC_CloseSession(&TeecSession);
724*ae8ec5e1SHisping Lin 	TeecResult = TEEC_FinalizeContext(&TeecContext);
725*ae8ec5e1SHisping Lin 	debug("testmm end\n");
726*ae8ec5e1SHisping Lin 	debug("TeecResult %x\n", TeecResult);
727*ae8ec5e1SHisping Lin 
728*ae8ec5e1SHisping Lin 	return TeecResult;
729*ae8ec5e1SHisping Lin }
730