xref: /rk3399_rockchip-uboot/lib/optee_clientApi/OpteeClientInterface.c (revision 095e2a82368f85b21ba902ec00863919dfd7bd89)
1ae8ec5e1SHisping Lin /*
2ae8ec5e1SHisping Lin  * Copyright 2017, Rockchip Electronics Co., Ltd
3ae8ec5e1SHisping Lin  * hisping lin, <hisping.lin@rock-chips.com>
4ae8ec5e1SHisping Lin  *
5ae8ec5e1SHisping Lin  * SPDX-License-Identifier:	GPL-2.0+
6ae8ec5e1SHisping Lin  */
7ae8ec5e1SHisping Lin 
8ae8ec5e1SHisping Lin #include <common.h>
9ae8ec5e1SHisping Lin #include <optee_include/OpteeClientApiLib.h>
10ae8ec5e1SHisping Lin #include <optee_include/tee_client_api.h>
11ae8ec5e1SHisping Lin 
12ae8ec5e1SHisping Lin void test_optee(void)
13ae8ec5e1SHisping Lin {
14ae8ec5e1SHisping Lin 	TEEC_Result TeecResult;
15ae8ec5e1SHisping Lin 	TEEC_Context TeecContext;
16ae8ec5e1SHisping Lin 	TEEC_Session TeecSession;
17ae8ec5e1SHisping Lin 	uint32_t ErrorOrigin;
18ae8ec5e1SHisping Lin 	TEEC_UUID tempuuid = { 0x1b484ea5, 0x698b, 0x4142,
19ae8ec5e1SHisping Lin 		{ 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } };
20ae8ec5e1SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
21ae8ec5e1SHisping Lin 	TEEC_Operation TeecOperation = {0};
22ae8ec5e1SHisping Lin 
23ae8ec5e1SHisping Lin 	debug("testmm start\n");
24ae8ec5e1SHisping Lin 	OpteeClientApiLibInitialize();
25ae8ec5e1SHisping Lin 
26ae8ec5e1SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
27ae8ec5e1SHisping Lin 
28ae8ec5e1SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
29ae8ec5e1SHisping Lin 				&TeecSession,
30ae8ec5e1SHisping Lin 				TeecUuid,
31ae8ec5e1SHisping Lin 				TEEC_LOGIN_PUBLIC,
32ae8ec5e1SHisping Lin 				NULL,
33ae8ec5e1SHisping Lin 				NULL,
34ae8ec5e1SHisping Lin 				&ErrorOrigin);
35ae8ec5e1SHisping Lin 
36ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem0 = {0};
37ae8ec5e1SHisping Lin 
38ae8ec5e1SHisping Lin 	SharedMem0.size = sizeof("filename_test");
39ae8ec5e1SHisping Lin 	SharedMem0.flags = 0;
40ae8ec5e1SHisping Lin 
41ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
42ae8ec5e1SHisping Lin 
43ae8ec5e1SHisping Lin 	memcpy(SharedMem0.buffer, "filename_test", SharedMem0.size);
44ae8ec5e1SHisping Lin 
45ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem1 = {0};
46ae8ec5e1SHisping Lin 
47ae8ec5e1SHisping Lin 	SharedMem1.size = 32;
48ae8ec5e1SHisping Lin 	SharedMem1.flags = 0;
49ae8ec5e1SHisping Lin 
50ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1);
51ae8ec5e1SHisping Lin 
52ae8ec5e1SHisping Lin 	memset(SharedMem1.buffer, 'a', SharedMem1.size);
53ae8ec5e1SHisping Lin 
54ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
55ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
56ae8ec5e1SHisping Lin 
57ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer;
58ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.size = SharedMem1.size;
59ae8ec5e1SHisping Lin 
60ae8ec5e1SHisping Lin 
61ae8ec5e1SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
62ae8ec5e1SHisping Lin 						TEEC_MEMREF_TEMP_INOUT,
63ae8ec5e1SHisping Lin 						TEEC_NONE,
64ae8ec5e1SHisping Lin 						TEEC_NONE);
65ae8ec5e1SHisping Lin 
66ae8ec5e1SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
67ae8ec5e1SHisping Lin 					1,
68ae8ec5e1SHisping Lin 					&TeecOperation,
69ae8ec5e1SHisping Lin 					&ErrorOrigin);
70ae8ec5e1SHisping Lin 
71ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem0);
72ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem1);
73ae8ec5e1SHisping Lin 
74ae8ec5e1SHisping Lin 	TEEC_CloseSession(&TeecSession);
75ae8ec5e1SHisping Lin 
7646b2a054SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
77ae8ec5e1SHisping Lin 
78ae8ec5e1SHisping Lin 	debug("testmm end\n");
79ae8ec5e1SHisping Lin 	debug("TeecResult %x\n", TeecResult);
80ae8ec5e1SHisping Lin }
81ae8ec5e1SHisping Lin 
82ae8ec5e1SHisping Lin static uint8_t b2hs_add_base(uint8_t in)
83ae8ec5e1SHisping Lin {
84ae8ec5e1SHisping Lin 	if (in > 9)
85ae8ec5e1SHisping Lin 		return in + 55;
86ae8ec5e1SHisping Lin 	else
87ae8ec5e1SHisping Lin 		return in + 48;
88ae8ec5e1SHisping Lin }
89ae8ec5e1SHisping Lin 
90ae8ec5e1SHisping Lin uint32_t b2hs(uint8_t *b, uint8_t *hs, uint32_t blen, uint32_t hslen)
91ae8ec5e1SHisping Lin {
92ae8ec5e1SHisping Lin 	uint32_t i = 0;
93ae8ec5e1SHisping Lin 
94ae8ec5e1SHisping Lin 	if (blen * 2 + 1 > hslen)
95ae8ec5e1SHisping Lin 		return 0;
96ae8ec5e1SHisping Lin 
97ae8ec5e1SHisping Lin 	for (; i < blen; i++) {
98ae8ec5e1SHisping Lin 		hs[i * 2 + 1] = b2hs_add_base(b[i] & 0xf);
99ae8ec5e1SHisping Lin 		hs[i * 2] = b2hs_add_base(b[i] >> 4);
100ae8ec5e1SHisping Lin 	}
101ae8ec5e1SHisping Lin 	hs[blen * 2] = 0;
102ae8ec5e1SHisping Lin 
103ae8ec5e1SHisping Lin 	return blen * 2;
104ae8ec5e1SHisping Lin }
105ae8ec5e1SHisping Lin 
106ae8ec5e1SHisping Lin 
107ae8ec5e1SHisping Lin uint32_t trusty_read_rollback_index(uint32_t slot, uint64_t *value)
108ae8ec5e1SHisping Lin {
109ae8ec5e1SHisping Lin 	TEEC_Result TeecResult;
110ae8ec5e1SHisping Lin 	TEEC_Context TeecContext;
111ae8ec5e1SHisping Lin 	TEEC_Session TeecSession;
112ae8ec5e1SHisping Lin 	uint32_t ErrorOrigin;
113ae8ec5e1SHisping Lin 	TEEC_UUID tempuuid = { 0x1b484ea5, 0x698b, 0x4142,
114ae8ec5e1SHisping Lin 			{ 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } };
115ae8ec5e1SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
116ae8ec5e1SHisping Lin 	TEEC_Operation TeecOperation = {0};
117ae8ec5e1SHisping Lin 	uint8_t hs[9];
118ae8ec5e1SHisping Lin 
119ae8ec5e1SHisping Lin 	b2hs((uint8_t *)&slot, hs, 4, 9);
120ae8ec5e1SHisping Lin 	debug("testmm start\n");
121ae8ec5e1SHisping Lin 	OpteeClientApiLibInitialize();
122ae8ec5e1SHisping Lin 
123ae8ec5e1SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
124ae8ec5e1SHisping Lin 
125ae8ec5e1SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
126ae8ec5e1SHisping Lin 				&TeecSession,
127ae8ec5e1SHisping Lin 				TeecUuid,
128ae8ec5e1SHisping Lin 				TEEC_LOGIN_PUBLIC,
129ae8ec5e1SHisping Lin 				NULL,
130ae8ec5e1SHisping Lin 				NULL,
131ae8ec5e1SHisping Lin 				&ErrorOrigin);
132ae8ec5e1SHisping Lin 
133ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem0 = {0};
134ae8ec5e1SHisping Lin 
135ae8ec5e1SHisping Lin 	SharedMem0.size = 8;
136ae8ec5e1SHisping Lin 	SharedMem0.flags = 0;
137ae8ec5e1SHisping Lin 
138ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
139ae8ec5e1SHisping Lin 
140ae8ec5e1SHisping Lin 	memcpy(SharedMem0.buffer, hs, SharedMem0.size);
141ae8ec5e1SHisping Lin 
142ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem1 = {0};
143ae8ec5e1SHisping Lin 
144ae8ec5e1SHisping Lin 	SharedMem1.size = 8;
145ae8ec5e1SHisping Lin 	SharedMem1.flags = 0;
146ae8ec5e1SHisping Lin 
147ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1);
148ae8ec5e1SHisping Lin 
149ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
150ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
151ae8ec5e1SHisping Lin 
152ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer;
153ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.size = SharedMem1.size;
154ae8ec5e1SHisping Lin 
155ae8ec5e1SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
156ae8ec5e1SHisping Lin 						TEEC_MEMREF_TEMP_INOUT,
157ae8ec5e1SHisping Lin 						TEEC_NONE,
158ae8ec5e1SHisping Lin 						TEEC_NONE);
159ae8ec5e1SHisping Lin 
160ae8ec5e1SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
161ae8ec5e1SHisping Lin 					0,
162ae8ec5e1SHisping Lin 					&TeecOperation,
163ae8ec5e1SHisping Lin 					&ErrorOrigin);
16446b2a054SHisping Lin 	if (TeecResult == TEEC_SUCCESS)
165ae8ec5e1SHisping Lin 		memcpy((char *)value, SharedMem1.buffer, SharedMem1.size);
166ae8ec5e1SHisping Lin 
167ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem0);
168ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem1);
169ae8ec5e1SHisping Lin 
170ae8ec5e1SHisping Lin 	TEEC_CloseSession(&TeecSession);
171ae8ec5e1SHisping Lin 
17246b2a054SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
173ae8ec5e1SHisping Lin 
174ae8ec5e1SHisping Lin 	debug("testmm end\n");
175ae8ec5e1SHisping Lin 	return TeecResult;
176ae8ec5e1SHisping Lin }
177ae8ec5e1SHisping Lin 
178ae8ec5e1SHisping Lin uint32_t trusty_write_rollback_index(uint32_t slot, uint64_t value)
179ae8ec5e1SHisping Lin {
180ae8ec5e1SHisping Lin 	TEEC_Result TeecResult;
181ae8ec5e1SHisping Lin 	TEEC_Context TeecContext;
182ae8ec5e1SHisping Lin 	TEEC_Session TeecSession;
183ae8ec5e1SHisping Lin 	uint32_t ErrorOrigin;
184ae8ec5e1SHisping Lin 	TEEC_UUID tempuuid = { 0x1b484ea5, 0x698b, 0x4142,
185ae8ec5e1SHisping Lin 		{ 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } };
186ae8ec5e1SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
187ae8ec5e1SHisping Lin 	TEEC_Operation TeecOperation = {0};
188ae8ec5e1SHisping Lin 	uint8_t hs[9];
189ae8ec5e1SHisping Lin 	b2hs((uint8_t *)&slot, hs, 4, 9);
190ae8ec5e1SHisping Lin 	OpteeClientApiLibInitialize();
191ae8ec5e1SHisping Lin 
192ae8ec5e1SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
193ae8ec5e1SHisping Lin 
194ae8ec5e1SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
195ae8ec5e1SHisping Lin 				&TeecSession,
196ae8ec5e1SHisping Lin 				TeecUuid,
197ae8ec5e1SHisping Lin 				TEEC_LOGIN_PUBLIC,
198ae8ec5e1SHisping Lin 				NULL,
199ae8ec5e1SHisping Lin 				NULL,
200ae8ec5e1SHisping Lin 				&ErrorOrigin);
201ae8ec5e1SHisping Lin 
202ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem0 = {0};
203ae8ec5e1SHisping Lin 
204ae8ec5e1SHisping Lin 	SharedMem0.size = 8;
205ae8ec5e1SHisping Lin 	SharedMem0.flags = 0;
206ae8ec5e1SHisping Lin 
207ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
208ae8ec5e1SHisping Lin 
209ae8ec5e1SHisping Lin 	memcpy(SharedMem0.buffer, hs, SharedMem0.size);
210ae8ec5e1SHisping Lin 
211ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem1 = {0};
212ae8ec5e1SHisping Lin 
213ae8ec5e1SHisping Lin 	SharedMem1.size = 8;
214ae8ec5e1SHisping Lin 	SharedMem1.flags = 0;
215ae8ec5e1SHisping Lin 
216ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1);
217ae8ec5e1SHisping Lin 
218ae8ec5e1SHisping Lin 	memcpy(SharedMem1.buffer, (char *)&value, SharedMem1.size);
219ae8ec5e1SHisping Lin 
220ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
221ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
222ae8ec5e1SHisping Lin 
223ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer;
224ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.size = SharedMem1.size;
225ae8ec5e1SHisping Lin 
226ae8ec5e1SHisping Lin 
227ae8ec5e1SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
228ae8ec5e1SHisping Lin 						TEEC_MEMREF_TEMP_INOUT,
229ae8ec5e1SHisping Lin 						TEEC_NONE,
230ae8ec5e1SHisping Lin 						TEEC_NONE);
231ae8ec5e1SHisping Lin 
232ae8ec5e1SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
233ae8ec5e1SHisping Lin 					1,
234ae8ec5e1SHisping Lin 					&TeecOperation,
235ae8ec5e1SHisping Lin 					&ErrorOrigin);
236ae8ec5e1SHisping Lin 
237ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem0);
238ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem1);
239ae8ec5e1SHisping Lin 
240ae8ec5e1SHisping Lin 	TEEC_CloseSession(&TeecSession);
241ae8ec5e1SHisping Lin 
24246b2a054SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
243ae8ec5e1SHisping Lin 
244ae8ec5e1SHisping Lin 	debug("testmm end\n");
245ae8ec5e1SHisping Lin 
246ae8ec5e1SHisping Lin 	return TeecResult;
247ae8ec5e1SHisping Lin }
248ae8ec5e1SHisping Lin 
249ae8ec5e1SHisping Lin uint32_t trusty_read_permanent_attributes(uint8_t *attributes, uint32_t size)
250ae8ec5e1SHisping Lin {
251ae8ec5e1SHisping Lin 	TEEC_Result TeecResult;
252ae8ec5e1SHisping Lin 	TEEC_Context TeecContext;
253ae8ec5e1SHisping Lin 	TEEC_Session TeecSession;
254ae8ec5e1SHisping Lin 	uint32_t ErrorOrigin;
25546b2a054SHisping Lin 	TEEC_UUID tempuuid = { 0x258be795, 0xf9ca, 0x40e6,
25646b2a054SHisping Lin 		{ 0xa8, 0x69, 0x9c, 0xe6, 0x88, 0x6c, 0x5d, 0x5d } };
257ae8ec5e1SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
258ae8ec5e1SHisping Lin 	TEEC_Operation TeecOperation = {0};
259ae8ec5e1SHisping Lin 
260ae8ec5e1SHisping Lin 	debug("testmm start\n");
261ae8ec5e1SHisping Lin 	OpteeClientApiLibInitialize();
262ae8ec5e1SHisping Lin 
263ae8ec5e1SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
264ae8ec5e1SHisping Lin 
265ae8ec5e1SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
266ae8ec5e1SHisping Lin 				&TeecSession,
267ae8ec5e1SHisping Lin 				TeecUuid,
268ae8ec5e1SHisping Lin 				TEEC_LOGIN_PUBLIC,
269ae8ec5e1SHisping Lin 				NULL,
270ae8ec5e1SHisping Lin 				NULL,
271ae8ec5e1SHisping Lin 				&ErrorOrigin);
272ae8ec5e1SHisping Lin 
273ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem0 = {0};
274ae8ec5e1SHisping Lin 
275ae8ec5e1SHisping Lin 	SharedMem0.size = sizeof("attributes");
276ae8ec5e1SHisping Lin 	SharedMem0.flags = 0;
277ae8ec5e1SHisping Lin 
278ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
279ae8ec5e1SHisping Lin 
280ae8ec5e1SHisping Lin 	memcpy(SharedMem0.buffer, "attributes", SharedMem0.size);
281ae8ec5e1SHisping Lin 
282ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem1 = {0};
283ae8ec5e1SHisping Lin 
284ae8ec5e1SHisping Lin 	SharedMem1.size = size;
285ae8ec5e1SHisping Lin 	SharedMem1.flags = 0;
286ae8ec5e1SHisping Lin 
287ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1);
288ae8ec5e1SHisping Lin 
289ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
290ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
291ae8ec5e1SHisping Lin 
292ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer;
293ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.size = SharedMem1.size;
294ae8ec5e1SHisping Lin 
295ae8ec5e1SHisping Lin 
296ae8ec5e1SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
297ae8ec5e1SHisping Lin 						TEEC_MEMREF_TEMP_INOUT,
298ae8ec5e1SHisping Lin 						TEEC_NONE,
299ae8ec5e1SHisping Lin 						TEEC_NONE);
300ae8ec5e1SHisping Lin 
301ae8ec5e1SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
30246b2a054SHisping Lin 					142,
303ae8ec5e1SHisping Lin 					&TeecOperation,
304ae8ec5e1SHisping Lin 					&ErrorOrigin);
30546b2a054SHisping Lin 	if (TeecResult == TEEC_SUCCESS)
306ae8ec5e1SHisping Lin 		memcpy(attributes, SharedMem1.buffer, SharedMem1.size);
307ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem0);
308ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem1);
309ae8ec5e1SHisping Lin 	TEEC_CloseSession(&TeecSession);
31046b2a054SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
311ae8ec5e1SHisping Lin 	debug("testmm end\n");
312ae8ec5e1SHisping Lin 
313ae8ec5e1SHisping Lin 	return TeecResult;
314ae8ec5e1SHisping Lin }
315ae8ec5e1SHisping Lin 
316ae8ec5e1SHisping Lin uint32_t trusty_write_permanent_attributes(uint8_t *attributes, uint32_t size)
317ae8ec5e1SHisping Lin {
318ae8ec5e1SHisping Lin 	TEEC_Result TeecResult;
319ae8ec5e1SHisping Lin 	TEEC_Context TeecContext;
320ae8ec5e1SHisping Lin 	TEEC_Session TeecSession;
321ae8ec5e1SHisping Lin 	uint32_t ErrorOrigin;
32246b2a054SHisping Lin 	TEEC_UUID tempuuid = { 0x258be795, 0xf9ca, 0x40e6,
32346b2a054SHisping Lin 		{ 0xa8, 0x69, 0x9c, 0xe6, 0x88, 0x6c, 0x5d, 0x5d } };
324ae8ec5e1SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
325ae8ec5e1SHisping Lin 	TEEC_Operation TeecOperation = {0};
326ae8ec5e1SHisping Lin 
327ae8ec5e1SHisping Lin 	debug("testmm start\n");
328ae8ec5e1SHisping Lin 	OpteeClientApiLibInitialize();
329ae8ec5e1SHisping Lin 
330ae8ec5e1SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
331ae8ec5e1SHisping Lin 
332ae8ec5e1SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
333ae8ec5e1SHisping Lin 				&TeecSession,
334ae8ec5e1SHisping Lin 				TeecUuid,
335ae8ec5e1SHisping Lin 				TEEC_LOGIN_PUBLIC,
336ae8ec5e1SHisping Lin 				NULL,
337ae8ec5e1SHisping Lin 				NULL,
338ae8ec5e1SHisping Lin 				&ErrorOrigin);
339ae8ec5e1SHisping Lin 
340ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem0 = {0};
341ae8ec5e1SHisping Lin 
342ae8ec5e1SHisping Lin 	SharedMem0.size = sizeof("attributes");
343ae8ec5e1SHisping Lin 	SharedMem0.flags = 0;
344ae8ec5e1SHisping Lin 
345ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
346ae8ec5e1SHisping Lin 
347ae8ec5e1SHisping Lin 	memcpy(SharedMem0.buffer, "attributes", SharedMem0.size);
348ae8ec5e1SHisping Lin 
349ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem1 = {0};
350ae8ec5e1SHisping Lin 
351ae8ec5e1SHisping Lin 	SharedMem1.size = size;
352ae8ec5e1SHisping Lin 	SharedMem1.flags = 0;
353ae8ec5e1SHisping Lin 
354ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1);
355ae8ec5e1SHisping Lin 
356ae8ec5e1SHisping Lin 	memcpy(SharedMem1.buffer, attributes, SharedMem1.size);
357ae8ec5e1SHisping Lin 
358ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
359ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
360ae8ec5e1SHisping Lin 
361ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer;
362ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.size = SharedMem1.size;
363ae8ec5e1SHisping Lin 
364ae8ec5e1SHisping Lin 
365ae8ec5e1SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
366ae8ec5e1SHisping Lin 						TEEC_MEMREF_TEMP_INOUT,
367ae8ec5e1SHisping Lin 						TEEC_NONE,
368ae8ec5e1SHisping Lin 						TEEC_NONE);
369ae8ec5e1SHisping Lin 
370ae8ec5e1SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
37146b2a054SHisping Lin 					141,
372ae8ec5e1SHisping Lin 					&TeecOperation,
373ae8ec5e1SHisping Lin 					&ErrorOrigin);
374ae8ec5e1SHisping Lin 
375ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem0);
376ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem1);
377ae8ec5e1SHisping Lin 	TEEC_CloseSession(&TeecSession);
37846b2a054SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
379ae8ec5e1SHisping Lin 	debug("testmm end\n");
380ae8ec5e1SHisping Lin 
381ae8ec5e1SHisping Lin 	return TeecResult;
382ae8ec5e1SHisping Lin }
383ae8ec5e1SHisping Lin 
384ae8ec5e1SHisping Lin uint32_t trusty_read_lock_state(uint8_t *lock_state)
385ae8ec5e1SHisping Lin {
386ae8ec5e1SHisping Lin 	TEEC_Result TeecResult;
387ae8ec5e1SHisping Lin 	TEEC_Context TeecContext;
388ae8ec5e1SHisping Lin 	TEEC_Session TeecSession;
389ae8ec5e1SHisping Lin 	uint32_t ErrorOrigin;
390ae8ec5e1SHisping Lin 	TEEC_UUID tempuuid = { 0x1b484ea5, 0x698b, 0x4142,
391ae8ec5e1SHisping Lin 		{ 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } };
392ae8ec5e1SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
393ae8ec5e1SHisping Lin 	TEEC_Operation TeecOperation = {0};
394ae8ec5e1SHisping Lin 
395ae8ec5e1SHisping Lin 	debug("testmm start\n");
396ae8ec5e1SHisping Lin 	OpteeClientApiLibInitialize();
397ae8ec5e1SHisping Lin 
398ae8ec5e1SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
399ae8ec5e1SHisping Lin 
400ae8ec5e1SHisping Lin 
401ae8ec5e1SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
402ae8ec5e1SHisping Lin 				&TeecSession,
403ae8ec5e1SHisping Lin 				TeecUuid,
404ae8ec5e1SHisping Lin 				TEEC_LOGIN_PUBLIC,
405ae8ec5e1SHisping Lin 				NULL,
406ae8ec5e1SHisping Lin 				NULL,
407ae8ec5e1SHisping Lin 				&ErrorOrigin);
408ae8ec5e1SHisping Lin 
409ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem0 = {0};
410ae8ec5e1SHisping Lin 
411ae8ec5e1SHisping Lin 	SharedMem0.size = sizeof("lock_state");
412ae8ec5e1SHisping Lin 	SharedMem0.flags = 0;
413ae8ec5e1SHisping Lin 
414ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
415ae8ec5e1SHisping Lin 
416ae8ec5e1SHisping Lin 	memcpy(SharedMem0.buffer, "lock_state", SharedMem0.size);
417ae8ec5e1SHisping Lin 
418ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem1 = {0};
419ae8ec5e1SHisping Lin 
420ae8ec5e1SHisping Lin 	SharedMem1.size = 1;
421ae8ec5e1SHisping Lin 	SharedMem1.flags = 0;
422ae8ec5e1SHisping Lin 
423ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1);
424ae8ec5e1SHisping Lin 
425ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
426ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
427ae8ec5e1SHisping Lin 
428ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer;
429ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.size = SharedMem1.size;
430ae8ec5e1SHisping Lin 
431ae8ec5e1SHisping Lin 
432ae8ec5e1SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
433ae8ec5e1SHisping Lin 						TEEC_MEMREF_TEMP_INOUT,
434ae8ec5e1SHisping Lin 						TEEC_NONE,
435ae8ec5e1SHisping Lin 						TEEC_NONE);
436ae8ec5e1SHisping Lin 
437ae8ec5e1SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
438ae8ec5e1SHisping Lin 					0,
439ae8ec5e1SHisping Lin 					&TeecOperation,
440ae8ec5e1SHisping Lin 					&ErrorOrigin);
44146b2a054SHisping Lin 	if (TeecResult == TEEC_SUCCESS)
442ae8ec5e1SHisping Lin 		memcpy(lock_state, SharedMem1.buffer, SharedMem1.size);
443ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem0);
444ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem1);
445ae8ec5e1SHisping Lin 	TEEC_CloseSession(&TeecSession);
44646b2a054SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
447ae8ec5e1SHisping Lin 	debug("testmm end\n");
448ae8ec5e1SHisping Lin 
449ae8ec5e1SHisping Lin 	return TeecResult;
450ae8ec5e1SHisping Lin }
451ae8ec5e1SHisping Lin 
452ae8ec5e1SHisping Lin uint32_t trusty_write_lock_state(uint8_t lock_state)
453ae8ec5e1SHisping Lin {
454ae8ec5e1SHisping Lin 	TEEC_Result TeecResult;
455ae8ec5e1SHisping Lin 	TEEC_Context TeecContext;
456ae8ec5e1SHisping Lin 	TEEC_Session TeecSession;
457ae8ec5e1SHisping Lin 	uint32_t ErrorOrigin;
458ae8ec5e1SHisping Lin 	TEEC_UUID  tempuuid = { 0x1b484ea5, 0x698b, 0x4142,
459ae8ec5e1SHisping Lin 		{ 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } };
460ae8ec5e1SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
461ae8ec5e1SHisping Lin 	TEEC_Operation TeecOperation = {0};
462ae8ec5e1SHisping Lin 
463ae8ec5e1SHisping Lin 	debug("testmm start\n");
464ae8ec5e1SHisping Lin 	OpteeClientApiLibInitialize();
465ae8ec5e1SHisping Lin 
466ae8ec5e1SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
467ae8ec5e1SHisping Lin 
468ae8ec5e1SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
469ae8ec5e1SHisping Lin 				&TeecSession,
470ae8ec5e1SHisping Lin 				TeecUuid,
471ae8ec5e1SHisping Lin 				TEEC_LOGIN_PUBLIC,
472ae8ec5e1SHisping Lin 				NULL,
473ae8ec5e1SHisping Lin 				NULL,
474ae8ec5e1SHisping Lin 				&ErrorOrigin);
475ae8ec5e1SHisping Lin 
476ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem0 = {0};
477ae8ec5e1SHisping Lin 
478ae8ec5e1SHisping Lin 	SharedMem0.size = sizeof("lock_state");
479ae8ec5e1SHisping Lin 	SharedMem0.flags = 0;
480ae8ec5e1SHisping Lin 
481ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
482ae8ec5e1SHisping Lin 
483ae8ec5e1SHisping Lin 	memcpy(SharedMem0.buffer, "lock_state", SharedMem0.size);
484ae8ec5e1SHisping Lin 
485ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem1 = {0};
486ae8ec5e1SHisping Lin 
487ae8ec5e1SHisping Lin 	SharedMem1.size = 1;
488ae8ec5e1SHisping Lin 	SharedMem1.flags = 0;
489ae8ec5e1SHisping Lin 
490ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1);
491ae8ec5e1SHisping Lin 
492ae8ec5e1SHisping Lin 	memcpy(SharedMem1.buffer, &lock_state, SharedMem1.size);
493ae8ec5e1SHisping Lin 
494ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
495ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
496ae8ec5e1SHisping Lin 
497ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer;
498ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.size = SharedMem1.size;
499ae8ec5e1SHisping Lin 
500ae8ec5e1SHisping Lin 
501ae8ec5e1SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
502ae8ec5e1SHisping Lin 						TEEC_MEMREF_TEMP_INOUT,
503ae8ec5e1SHisping Lin 						TEEC_NONE,
504ae8ec5e1SHisping Lin 						TEEC_NONE);
505ae8ec5e1SHisping Lin 
506ae8ec5e1SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
507ae8ec5e1SHisping Lin 					1,
508ae8ec5e1SHisping Lin 					&TeecOperation,
509ae8ec5e1SHisping Lin 					&ErrorOrigin);
510ae8ec5e1SHisping Lin 
511ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem0);
512ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem1);
513ae8ec5e1SHisping Lin 	TEEC_CloseSession(&TeecSession);
51446b2a054SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
515ae8ec5e1SHisping Lin 	debug("testmm end\n");
516ae8ec5e1SHisping Lin 
517ae8ec5e1SHisping Lin 	return TeecResult;
518ae8ec5e1SHisping Lin }
519ae8ec5e1SHisping Lin 
520ae8ec5e1SHisping Lin uint32_t trusty_read_flash_lock_state(uint8_t *flash_lock_state)
521ae8ec5e1SHisping Lin {
522ae8ec5e1SHisping Lin 	TEEC_Result TeecResult;
523ae8ec5e1SHisping Lin 	TEEC_Context TeecContext;
524ae8ec5e1SHisping Lin 	TEEC_Session TeecSession;
525ae8ec5e1SHisping Lin 	uint32_t ErrorOrigin;
526ae8ec5e1SHisping Lin 	TEEC_UUID tempuuid = { 0x1b484ea5, 0x698b, 0x4142,
527ae8ec5e1SHisping Lin 		{ 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } };
528ae8ec5e1SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
529ae8ec5e1SHisping Lin 	TEEC_Operation TeecOperation = {0};
530ae8ec5e1SHisping Lin 
531ae8ec5e1SHisping Lin 	debug("testmm start\n");
532ae8ec5e1SHisping Lin 	OpteeClientApiLibInitialize();
533ae8ec5e1SHisping Lin 
534ae8ec5e1SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
535ae8ec5e1SHisping Lin 
536ae8ec5e1SHisping Lin 
537ae8ec5e1SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
538ae8ec5e1SHisping Lin 				&TeecSession,
539ae8ec5e1SHisping Lin 				TeecUuid,
540ae8ec5e1SHisping Lin 				TEEC_LOGIN_PUBLIC,
541ae8ec5e1SHisping Lin 				NULL,
542ae8ec5e1SHisping Lin 				NULL,
543ae8ec5e1SHisping Lin 				&ErrorOrigin);
544ae8ec5e1SHisping Lin 
545ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem0 = {0};
546ae8ec5e1SHisping Lin 
547ae8ec5e1SHisping Lin 	SharedMem0.size = sizeof("flash_lock_state");
548ae8ec5e1SHisping Lin 	SharedMem0.flags = 0;
549ae8ec5e1SHisping Lin 
550ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
551ae8ec5e1SHisping Lin 
552ae8ec5e1SHisping Lin 	memcpy(SharedMem0.buffer, "flash_lock_state", SharedMem0.size);
553ae8ec5e1SHisping Lin 
554ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem1 = {0};
555ae8ec5e1SHisping Lin 
556ae8ec5e1SHisping Lin 	SharedMem1.size = 1;
557ae8ec5e1SHisping Lin 	SharedMem1.flags = 0;
558ae8ec5e1SHisping Lin 
559ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1);
560ae8ec5e1SHisping Lin 
561ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
562ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
563ae8ec5e1SHisping Lin 
564ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer;
565ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.size = SharedMem1.size;
566ae8ec5e1SHisping Lin 
567ae8ec5e1SHisping Lin 
568ae8ec5e1SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
569ae8ec5e1SHisping Lin 						TEEC_MEMREF_TEMP_INOUT,
570ae8ec5e1SHisping Lin 						TEEC_NONE,
571ae8ec5e1SHisping Lin 						TEEC_NONE);
572ae8ec5e1SHisping Lin 
573ae8ec5e1SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
574ae8ec5e1SHisping Lin 					0,
575ae8ec5e1SHisping Lin 					&TeecOperation,
576ae8ec5e1SHisping Lin 					&ErrorOrigin);
57746b2a054SHisping Lin 	if (TeecResult == TEEC_SUCCESS)
578ae8ec5e1SHisping Lin 		memcpy(flash_lock_state, SharedMem1.buffer, SharedMem1.size);
579ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem0);
580ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem1);
581ae8ec5e1SHisping Lin 	TEEC_CloseSession(&TeecSession);
58246b2a054SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
583ae8ec5e1SHisping Lin 	debug("testmm end\n");
584ae8ec5e1SHisping Lin 
585ae8ec5e1SHisping Lin 	return TeecResult;
586ae8ec5e1SHisping Lin }
587ae8ec5e1SHisping Lin 
588ae8ec5e1SHisping Lin 
589ae8ec5e1SHisping Lin uint32_t trusty_write_flash_lock_state(uint8_t flash_lock_state)
590ae8ec5e1SHisping Lin {
591ae8ec5e1SHisping Lin 	TEEC_Result TeecResult;
592ae8ec5e1SHisping Lin 	TEEC_Context TeecContext;
593ae8ec5e1SHisping Lin 	TEEC_Session TeecSession;
594ae8ec5e1SHisping Lin 	uint32_t ErrorOrigin;
595ae8ec5e1SHisping Lin 	TEEC_UUID  tempuuid = { 0x1b484ea5, 0x698b, 0x4142,
596ae8ec5e1SHisping Lin 		{ 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } };
597ae8ec5e1SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
598ae8ec5e1SHisping Lin 	TEEC_Operation TeecOperation = {0};
599ae8ec5e1SHisping Lin 
600ae8ec5e1SHisping Lin 	debug("testmm start\n");
601ae8ec5e1SHisping Lin 	OpteeClientApiLibInitialize();
602ae8ec5e1SHisping Lin 
603ae8ec5e1SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
604ae8ec5e1SHisping Lin 
605ae8ec5e1SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
606ae8ec5e1SHisping Lin 				&TeecSession,
607ae8ec5e1SHisping Lin 				TeecUuid,
608ae8ec5e1SHisping Lin 				TEEC_LOGIN_PUBLIC,
609ae8ec5e1SHisping Lin 				NULL,
610ae8ec5e1SHisping Lin 				NULL,
611ae8ec5e1SHisping Lin 				&ErrorOrigin);
612ae8ec5e1SHisping Lin 
613ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem0 = {0};
614ae8ec5e1SHisping Lin 
615ae8ec5e1SHisping Lin 	SharedMem0.size = sizeof("flash_lock_state");
616ae8ec5e1SHisping Lin 	SharedMem0.flags = 0;
617ae8ec5e1SHisping Lin 
618ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
619ae8ec5e1SHisping Lin 
620ae8ec5e1SHisping Lin 	memcpy(SharedMem0.buffer, "flash_lock_state", SharedMem0.size);
621ae8ec5e1SHisping Lin 
622ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem1 = {0};
623ae8ec5e1SHisping Lin 
624ae8ec5e1SHisping Lin 	SharedMem1.size = 1;
625ae8ec5e1SHisping Lin 	SharedMem1.flags = 0;
626ae8ec5e1SHisping Lin 
627ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1);
628ae8ec5e1SHisping Lin 
629ae8ec5e1SHisping Lin 	memcpy(SharedMem1.buffer, &flash_lock_state, SharedMem1.size);
630ae8ec5e1SHisping Lin 
631ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
632ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
633ae8ec5e1SHisping Lin 
634ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer;
635ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.size = SharedMem1.size;
636ae8ec5e1SHisping Lin 
637ae8ec5e1SHisping Lin 
638ae8ec5e1SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
639ae8ec5e1SHisping Lin 						TEEC_MEMREF_TEMP_INOUT,
640ae8ec5e1SHisping Lin 						TEEC_NONE,
641ae8ec5e1SHisping Lin 						TEEC_NONE);
642ae8ec5e1SHisping Lin 
643ae8ec5e1SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
644ae8ec5e1SHisping Lin 					1,
645ae8ec5e1SHisping Lin 					&TeecOperation,
646ae8ec5e1SHisping Lin 					&ErrorOrigin);
647ae8ec5e1SHisping Lin 
648ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem0);
649ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem1);
650ae8ec5e1SHisping Lin 	TEEC_CloseSession(&TeecSession);
65146b2a054SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
652ae8ec5e1SHisping Lin 	debug("testmm end\n");
653ae8ec5e1SHisping Lin 
654ae8ec5e1SHisping Lin 	return TeecResult;
655ae8ec5e1SHisping Lin }
656ae8ec5e1SHisping Lin 
657ae8ec5e1SHisping Lin uint32_t write_to_keymaster(uint8_t *filename,
658ae8ec5e1SHisping Lin 		uint32_t filename_size,
659ae8ec5e1SHisping Lin 		uint8_t *data,
660ae8ec5e1SHisping Lin 		uint32_t data_size)
661ae8ec5e1SHisping Lin {
662ae8ec5e1SHisping Lin 	TEEC_Result TeecResult;
663ae8ec5e1SHisping Lin 	TEEC_Context TeecContext;
664ae8ec5e1SHisping Lin 	TEEC_Session TeecSession;
665ae8ec5e1SHisping Lin 	uint32_t ErrorOrigin;
666ae8ec5e1SHisping Lin 
667ae8ec5e1SHisping Lin 	TEEC_UUID tempuuid = { 0x258be795, 0xf9ca, 0x40e6,
668ae8ec5e1SHisping Lin 		{ 0xa8, 0x69, 0x9c, 0xe6, 0x88, 0x6c, 0x5d, 0x5d } };
669ae8ec5e1SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
670ae8ec5e1SHisping Lin 	TEEC_Operation TeecOperation = {0};
671ae8ec5e1SHisping Lin 
672ae8ec5e1SHisping Lin 	debug("write_to_keymaster\n");
673ae8ec5e1SHisping Lin 	OpteeClientApiLibInitialize();
674ae8ec5e1SHisping Lin 
675ae8ec5e1SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
676ae8ec5e1SHisping Lin 
677ae8ec5e1SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
678ae8ec5e1SHisping Lin 				&TeecSession,
679ae8ec5e1SHisping Lin 				TeecUuid,
680ae8ec5e1SHisping Lin 				TEEC_LOGIN_PUBLIC,
681ae8ec5e1SHisping Lin 				NULL,
682ae8ec5e1SHisping Lin 				NULL,
683ae8ec5e1SHisping Lin 				&ErrorOrigin);
684ae8ec5e1SHisping Lin 
685ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem0 = {0};
686ae8ec5e1SHisping Lin 
687ae8ec5e1SHisping Lin 	SharedMem0.size = filename_size;
688ae8ec5e1SHisping Lin 	SharedMem0.flags = 0;
689ae8ec5e1SHisping Lin 
690ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
691ae8ec5e1SHisping Lin 
692ae8ec5e1SHisping Lin 	memcpy(SharedMem0.buffer, filename, SharedMem0.size);
693ae8ec5e1SHisping Lin 
694ae8ec5e1SHisping Lin 	TEEC_SharedMemory SharedMem1 = {0};
695ae8ec5e1SHisping Lin 
696ae8ec5e1SHisping Lin 	SharedMem1.size = data_size;
697ae8ec5e1SHisping Lin 	SharedMem1.flags = 0;
698ae8ec5e1SHisping Lin 
699ae8ec5e1SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1);
700ae8ec5e1SHisping Lin 
701ae8ec5e1SHisping Lin 	memcpy(SharedMem1.buffer, data, SharedMem1.size);
702ae8ec5e1SHisping Lin 
703ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
704ae8ec5e1SHisping Lin 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
705ae8ec5e1SHisping Lin 
706ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer;
707ae8ec5e1SHisping Lin 	TeecOperation.params[1].tmpref.size = SharedMem1.size;
708ae8ec5e1SHisping Lin 
709ae8ec5e1SHisping Lin 
710ae8ec5e1SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
711ae8ec5e1SHisping Lin 						TEEC_MEMREF_TEMP_INOUT,
712ae8ec5e1SHisping Lin 						TEEC_NONE,
713ae8ec5e1SHisping Lin 						TEEC_NONE);
714ae8ec5e1SHisping Lin 
715ae8ec5e1SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
716ae8ec5e1SHisping Lin 					139,
717ae8ec5e1SHisping Lin 					&TeecOperation,
718ae8ec5e1SHisping Lin 					&ErrorOrigin);
719ae8ec5e1SHisping Lin 
720ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem0);
721ae8ec5e1SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem1);
722ae8ec5e1SHisping Lin 	TEEC_CloseSession(&TeecSession);
72346b2a054SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
724ae8ec5e1SHisping Lin 	debug("testmm end\n");
725ae8ec5e1SHisping Lin 	debug("TeecResult %x\n", TeecResult);
726ae8ec5e1SHisping Lin 
727ae8ec5e1SHisping Lin 	return TeecResult;
728ae8ec5e1SHisping Lin }
7296ef445a4SHisping Lin 
7306ef445a4SHisping Lin uint32_t trusty_read_attribute_hash(uint32_t *buf, uint32_t length)
7316ef445a4SHisping Lin {
7326ef445a4SHisping Lin 	TEEC_Result TeecResult;
7336ef445a4SHisping Lin 	TEEC_Context TeecContext;
7346ef445a4SHisping Lin 	TEEC_Session TeecSession;
7356ef445a4SHisping Lin 	uint32_t ErrorOrigin;
7366ef445a4SHisping Lin 
7376ef445a4SHisping Lin 	TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8, \
7386ef445a4SHisping Lin 			{ 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } };
7396ef445a4SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
7406ef445a4SHisping Lin 	TEEC_Operation TeecOperation = {0};
7416ef445a4SHisping Lin 
7426ef445a4SHisping Lin 	OpteeClientApiLibInitialize();
7436ef445a4SHisping Lin 
7446ef445a4SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
7456ef445a4SHisping Lin 
7466ef445a4SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
7476ef445a4SHisping Lin 				&TeecSession,
7486ef445a4SHisping Lin 				TeecUuid,
7496ef445a4SHisping Lin 				TEEC_LOGIN_PUBLIC,
7506ef445a4SHisping Lin 				NULL,
7516ef445a4SHisping Lin 				NULL,
7526ef445a4SHisping Lin 				&ErrorOrigin);
7536ef445a4SHisping Lin 
7546ef445a4SHisping Lin 	TEEC_SharedMemory SharedMem0 = {0};
7556ef445a4SHisping Lin 
7566ef445a4SHisping Lin 	SharedMem0.size = length * sizeof(uint32_t);
7576ef445a4SHisping Lin 	SharedMem0.flags = 0;
7586ef445a4SHisping Lin 
7596ef445a4SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
7606ef445a4SHisping Lin 
7616ef445a4SHisping Lin 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
7626ef445a4SHisping Lin 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
7636ef445a4SHisping Lin 
7646ef445a4SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_OUTPUT,
7656ef445a4SHisping Lin 						TEEC_NONE,
7666ef445a4SHisping Lin 						TEEC_NONE,
7676ef445a4SHisping Lin 						TEEC_NONE);
7686ef445a4SHisping Lin 
7696ef445a4SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
7706ef445a4SHisping Lin 					0,
7716ef445a4SHisping Lin 					&TeecOperation,
7726ef445a4SHisping Lin 					&ErrorOrigin);
7736ef445a4SHisping Lin 
7746ef445a4SHisping Lin 	if (TeecResult == TEEC_SUCCESS)
7756ef445a4SHisping Lin 		memcpy(buf, SharedMem0.buffer, SharedMem0.size);
7766ef445a4SHisping Lin 
7776ef445a4SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem0);
7786ef445a4SHisping Lin 	TEEC_CloseSession(&TeecSession);
7796ef445a4SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
7806ef445a4SHisping Lin 
7816ef445a4SHisping Lin 	return TeecResult;
7826ef445a4SHisping Lin }
7836ef445a4SHisping Lin 
7846ef445a4SHisping Lin uint32_t trusty_write_attribute_hash(uint32_t *buf, uint32_t length)
7856ef445a4SHisping Lin {
7866ef445a4SHisping Lin 	TEEC_Result TeecResult;
7876ef445a4SHisping Lin 	TEEC_Context TeecContext;
7886ef445a4SHisping Lin 	TEEC_Session TeecSession;
7896ef445a4SHisping Lin 	uint32_t ErrorOrigin;
7906ef445a4SHisping Lin 
7916ef445a4SHisping Lin 	TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8, \
7926ef445a4SHisping Lin 			{ 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } };
7936ef445a4SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
7946ef445a4SHisping Lin 	TEEC_Operation TeecOperation = {0};
7956ef445a4SHisping Lin 
7966ef445a4SHisping Lin 	OpteeClientApiLibInitialize();
7976ef445a4SHisping Lin 
7986ef445a4SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
7996ef445a4SHisping Lin 
8006ef445a4SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
8016ef445a4SHisping Lin 				&TeecSession,
8026ef445a4SHisping Lin 				TeecUuid,
8036ef445a4SHisping Lin 				TEEC_LOGIN_PUBLIC,
8046ef445a4SHisping Lin 				NULL,
8056ef445a4SHisping Lin 				NULL,
8066ef445a4SHisping Lin 				&ErrorOrigin);
8076ef445a4SHisping Lin 
8086ef445a4SHisping Lin 	TEEC_SharedMemory SharedMem0 = {0};
8096ef445a4SHisping Lin 
8106ef445a4SHisping Lin 	SharedMem0.size = length * sizeof(uint32_t);
8116ef445a4SHisping Lin 	SharedMem0.flags = 0;
8126ef445a4SHisping Lin 
8136ef445a4SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
8146ef445a4SHisping Lin 
8156ef445a4SHisping Lin 	memcpy(SharedMem0.buffer, buf, SharedMem0.size);
8166ef445a4SHisping Lin 
8176ef445a4SHisping Lin 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
8186ef445a4SHisping Lin 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
8196ef445a4SHisping Lin 
8206ef445a4SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
8216ef445a4SHisping Lin 						TEEC_NONE,
8226ef445a4SHisping Lin 						TEEC_NONE,
8236ef445a4SHisping Lin 						TEEC_NONE);
8246ef445a4SHisping Lin 
8256ef445a4SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
8266ef445a4SHisping Lin 					1,
8276ef445a4SHisping Lin 					&TeecOperation,
8286ef445a4SHisping Lin 					&ErrorOrigin);
8296ef445a4SHisping Lin 
8306ef445a4SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem0);
8316ef445a4SHisping Lin 	TEEC_CloseSession(&TeecSession);
8326ef445a4SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
8336ef445a4SHisping Lin 
8346ef445a4SHisping Lin 	return TeecResult;
8356ef445a4SHisping Lin }
83616539616SHisping Lin 
83716539616SHisping Lin uint32_t notify_optee_rpmb_ta(void)
83816539616SHisping Lin {
83916539616SHisping Lin 	TEEC_Result TeecResult;
84016539616SHisping Lin 	TEEC_Context TeecContext;
84116539616SHisping Lin 	TEEC_Session TeecSession;
84216539616SHisping Lin 	uint32_t ErrorOrigin;
84316539616SHisping Lin 	TEEC_UUID  tempuuid = { 0x1b484ea5, 0x698b, 0x4142,
84416539616SHisping Lin 		{ 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } };
84516539616SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
84616539616SHisping Lin 	TEEC_Operation TeecOperation = {0};
84716539616SHisping Lin 
84816539616SHisping Lin 	OpteeClientApiLibInitialize();
84916539616SHisping Lin 
85016539616SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
85116539616SHisping Lin 
85216539616SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
85316539616SHisping Lin 				&TeecSession,
85416539616SHisping Lin 				TeecUuid,
85516539616SHisping Lin 				TEEC_LOGIN_PUBLIC,
85616539616SHisping Lin 				NULL,
85716539616SHisping Lin 				NULL,
85816539616SHisping Lin 				&ErrorOrigin);
85916539616SHisping Lin 
86016539616SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_NONE,
86116539616SHisping Lin 						TEEC_NONE,
86216539616SHisping Lin 						TEEC_NONE,
86316539616SHisping Lin 						TEEC_NONE);
86416539616SHisping Lin 
86516539616SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
86616539616SHisping Lin 					2,
86716539616SHisping Lin 					&TeecOperation,
86816539616SHisping Lin 					&ErrorOrigin);
86916539616SHisping Lin 
87016539616SHisping Lin 	TEEC_CloseSession(&TeecSession);
87116539616SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
87216539616SHisping Lin 
87316539616SHisping Lin 	return TeecResult;
87416539616SHisping Lin }
87516539616SHisping Lin 
87616539616SHisping Lin uint32_t notify_optee_efuse_ta(void)
87716539616SHisping Lin {
87816539616SHisping Lin 	TEEC_Result TeecResult;
87916539616SHisping Lin 	TEEC_Context TeecContext;
88016539616SHisping Lin 	TEEC_Session TeecSession;
88116539616SHisping Lin 	uint32_t ErrorOrigin;
88216539616SHisping Lin 	TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8, \
88316539616SHisping Lin 			{ 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } };
88416539616SHisping Lin 
88516539616SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
88616539616SHisping Lin 	TEEC_Operation TeecOperation = {0};
88716539616SHisping Lin 
88816539616SHisping Lin 	OpteeClientApiLibInitialize();
88916539616SHisping Lin 
89016539616SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
89116539616SHisping Lin 
89216539616SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
89316539616SHisping Lin 				&TeecSession,
89416539616SHisping Lin 				TeecUuid,
89516539616SHisping Lin 				TEEC_LOGIN_PUBLIC,
89616539616SHisping Lin 				NULL,
89716539616SHisping Lin 				NULL,
89816539616SHisping Lin 				&ErrorOrigin);
89916539616SHisping Lin 
90016539616SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_NONE,
90116539616SHisping Lin 						TEEC_NONE,
90216539616SHisping Lin 						TEEC_NONE,
90316539616SHisping Lin 						TEEC_NONE);
90416539616SHisping Lin 
90516539616SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
90616539616SHisping Lin 					2,
90716539616SHisping Lin 					&TeecOperation,
90816539616SHisping Lin 					&ErrorOrigin);
90916539616SHisping Lin 
91016539616SHisping Lin 	TEEC_CloseSession(&TeecSession);
91116539616SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
91216539616SHisping Lin 
91316539616SHisping Lin 	return TeecResult;
91416539616SHisping Lin }
91516539616SHisping Lin 
91616539616SHisping Lin uint32_t trusty_notify_optee_uboot_end(void)
91716539616SHisping Lin {
91816539616SHisping Lin 	TEEC_Result res;
91916539616SHisping Lin 	res = notify_optee_rpmb_ta();
92016539616SHisping Lin 	res |= notify_optee_efuse_ta();
92116539616SHisping Lin 	return res;
92216539616SHisping Lin }
9232cd27853SHisping Lin 
9242cd27853SHisping Lin uint32_t trusty_read_vbootkey_hash(uint32_t *buf, uint32_t length)
9252cd27853SHisping Lin {
9262cd27853SHisping Lin 	TEEC_Result TeecResult;
9272cd27853SHisping Lin 	TEEC_Context TeecContext;
9282cd27853SHisping Lin 	TEEC_Session TeecSession;
9292cd27853SHisping Lin 	uint32_t ErrorOrigin;
9302cd27853SHisping Lin 
9312cd27853SHisping Lin 	TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8, \
9322cd27853SHisping Lin 			{ 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } };
9332cd27853SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
9342cd27853SHisping Lin 	TEEC_Operation TeecOperation = {0};
9352cd27853SHisping Lin 
9362cd27853SHisping Lin 	OpteeClientApiLibInitialize();
9372cd27853SHisping Lin 
9382cd27853SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
9392cd27853SHisping Lin 
9402cd27853SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
9412cd27853SHisping Lin 				&TeecSession,
9422cd27853SHisping Lin 				TeecUuid,
9432cd27853SHisping Lin 				TEEC_LOGIN_PUBLIC,
9442cd27853SHisping Lin 				NULL,
9452cd27853SHisping Lin 				NULL,
9462cd27853SHisping Lin 				&ErrorOrigin);
9472cd27853SHisping Lin 
9482cd27853SHisping Lin 	TEEC_SharedMemory SharedMem0 = {0};
9492cd27853SHisping Lin 
9502cd27853SHisping Lin 	SharedMem0.size = length * sizeof(uint32_t);
9512cd27853SHisping Lin 	SharedMem0.flags = 0;
9522cd27853SHisping Lin 
9532cd27853SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
9542cd27853SHisping Lin 
9552cd27853SHisping Lin 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
9562cd27853SHisping Lin 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
9572cd27853SHisping Lin 
9582cd27853SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_OUTPUT,
9592cd27853SHisping Lin 						TEEC_NONE,
9602cd27853SHisping Lin 						TEEC_NONE,
9612cd27853SHisping Lin 						TEEC_NONE);
9622cd27853SHisping Lin 
9632cd27853SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
9642cd27853SHisping Lin 					3,
9652cd27853SHisping Lin 					&TeecOperation,
9662cd27853SHisping Lin 					&ErrorOrigin);
9672cd27853SHisping Lin 
9682cd27853SHisping Lin 	if (TeecResult == TEEC_SUCCESS)
9692cd27853SHisping Lin 		memcpy(buf, SharedMem0.buffer, SharedMem0.size);
9702cd27853SHisping Lin 
9712cd27853SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem0);
9722cd27853SHisping Lin 	TEEC_CloseSession(&TeecSession);
9732cd27853SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
9742cd27853SHisping Lin 
9752cd27853SHisping Lin 	return TeecResult;
9762cd27853SHisping Lin }
9772cd27853SHisping Lin uint32_t trusty_write_vbootkey_hash(uint32_t *buf, uint32_t length)
9782cd27853SHisping Lin {
9792cd27853SHisping Lin 	TEEC_Result TeecResult;
9802cd27853SHisping Lin 	TEEC_Context TeecContext;
9812cd27853SHisping Lin 	TEEC_Session TeecSession;
9822cd27853SHisping Lin 	uint32_t ErrorOrigin;
9832cd27853SHisping Lin 
9842cd27853SHisping Lin 	TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8, \
9852cd27853SHisping Lin 			{ 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } };
9862cd27853SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
9872cd27853SHisping Lin 	TEEC_Operation TeecOperation = {0};
9882cd27853SHisping Lin 
9892cd27853SHisping Lin 	OpteeClientApiLibInitialize();
9902cd27853SHisping Lin 
9912cd27853SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
9922cd27853SHisping Lin 
9932cd27853SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
9942cd27853SHisping Lin 				&TeecSession,
9952cd27853SHisping Lin 				TeecUuid,
9962cd27853SHisping Lin 				TEEC_LOGIN_PUBLIC,
9972cd27853SHisping Lin 				NULL,
9982cd27853SHisping Lin 				NULL,
9992cd27853SHisping Lin 				&ErrorOrigin);
10002cd27853SHisping Lin 
10012cd27853SHisping Lin 	TEEC_SharedMemory SharedMem0 = {0};
10022cd27853SHisping Lin 
10032cd27853SHisping Lin 	SharedMem0.size = length * sizeof(uint32_t);
10042cd27853SHisping Lin 	SharedMem0.flags = 0;
10052cd27853SHisping Lin 
10062cd27853SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
10072cd27853SHisping Lin 
10082cd27853SHisping Lin 	memcpy(SharedMem0.buffer, buf, SharedMem0.size);
10092cd27853SHisping Lin 
10102cd27853SHisping Lin 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
10112cd27853SHisping Lin 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
10122cd27853SHisping Lin 
10132cd27853SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
10142cd27853SHisping Lin 						TEEC_NONE,
10152cd27853SHisping Lin 						TEEC_NONE,
10162cd27853SHisping Lin 						TEEC_NONE);
10172cd27853SHisping Lin 
10182cd27853SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
10192cd27853SHisping Lin 					4,
10202cd27853SHisping Lin 					&TeecOperation,
10212cd27853SHisping Lin 					&ErrorOrigin);
10222cd27853SHisping Lin 
10232cd27853SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem0);
10242cd27853SHisping Lin 	TEEC_CloseSession(&TeecSession);
10252cd27853SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
10262cd27853SHisping Lin 
10272cd27853SHisping Lin 	return TeecResult;
10282cd27853SHisping Lin }
1029*095e2a82SHisping Lin 
1030*095e2a82SHisping Lin uint32_t trusty_read_permanent_attributes_flag(uint8_t *attributes)
1031*095e2a82SHisping Lin {
1032*095e2a82SHisping Lin 	TEEC_Result TeecResult;
1033*095e2a82SHisping Lin 	TEEC_Context TeecContext;
1034*095e2a82SHisping Lin 	TEEC_Session TeecSession;
1035*095e2a82SHisping Lin 	uint32_t ErrorOrigin;
1036*095e2a82SHisping Lin 	TEEC_UUID tempuuid = { 0x258be795, 0xf9ca, 0x40e6,
1037*095e2a82SHisping Lin 		{ 0xa8, 0x69, 0x9c, 0xe6, 0x88, 0x6c, 0x5d, 0x5d } };
1038*095e2a82SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
1039*095e2a82SHisping Lin 	TEEC_Operation TeecOperation = {0};
1040*095e2a82SHisping Lin 
1041*095e2a82SHisping Lin 	debug("testmm start\n");
1042*095e2a82SHisping Lin 	OpteeClientApiLibInitialize();
1043*095e2a82SHisping Lin 
1044*095e2a82SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
1045*095e2a82SHisping Lin 
1046*095e2a82SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
1047*095e2a82SHisping Lin 				&TeecSession,
1048*095e2a82SHisping Lin 				TeecUuid,
1049*095e2a82SHisping Lin 				TEEC_LOGIN_PUBLIC,
1050*095e2a82SHisping Lin 				NULL,
1051*095e2a82SHisping Lin 				NULL,
1052*095e2a82SHisping Lin 				&ErrorOrigin);
1053*095e2a82SHisping Lin 
1054*095e2a82SHisping Lin 	TEEC_SharedMemory SharedMem0 = {0};
1055*095e2a82SHisping Lin 
1056*095e2a82SHisping Lin 	SharedMem0.size = sizeof("attributes_flag");
1057*095e2a82SHisping Lin 	SharedMem0.flags = 0;
1058*095e2a82SHisping Lin 
1059*095e2a82SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
1060*095e2a82SHisping Lin 
1061*095e2a82SHisping Lin 	memcpy(SharedMem0.buffer, "attributes_flag", SharedMem0.size);
1062*095e2a82SHisping Lin 
1063*095e2a82SHisping Lin 	TEEC_SharedMemory SharedMem1 = {0};
1064*095e2a82SHisping Lin 
1065*095e2a82SHisping Lin 	SharedMem1.size = 1;
1066*095e2a82SHisping Lin 	SharedMem1.flags = 0;
1067*095e2a82SHisping Lin 
1068*095e2a82SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1);
1069*095e2a82SHisping Lin 
1070*095e2a82SHisping Lin 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
1071*095e2a82SHisping Lin 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
1072*095e2a82SHisping Lin 
1073*095e2a82SHisping Lin 	TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer;
1074*095e2a82SHisping Lin 	TeecOperation.params[1].tmpref.size = SharedMem1.size;
1075*095e2a82SHisping Lin 
1076*095e2a82SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
1077*095e2a82SHisping Lin 						TEEC_MEMREF_TEMP_INOUT,
1078*095e2a82SHisping Lin 						TEEC_NONE,
1079*095e2a82SHisping Lin 						TEEC_NONE);
1080*095e2a82SHisping Lin 
1081*095e2a82SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
1082*095e2a82SHisping Lin 					142,
1083*095e2a82SHisping Lin 					&TeecOperation,
1084*095e2a82SHisping Lin 					&ErrorOrigin);
1085*095e2a82SHisping Lin 	if (TeecResult == TEEC_SUCCESS)
1086*095e2a82SHisping Lin 		memcpy(attributes, SharedMem1.buffer, SharedMem1.size);
1087*095e2a82SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem0);
1088*095e2a82SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem1);
1089*095e2a82SHisping Lin 	TEEC_CloseSession(&TeecSession);
1090*095e2a82SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
1091*095e2a82SHisping Lin 	debug("testmm end\n");
1092*095e2a82SHisping Lin 
1093*095e2a82SHisping Lin 	return TeecResult;
1094*095e2a82SHisping Lin }
1095*095e2a82SHisping Lin 
1096*095e2a82SHisping Lin uint32_t trusty_write_permanent_attributes_flag(uint8_t attributes)
1097*095e2a82SHisping Lin {
1098*095e2a82SHisping Lin 	TEEC_Result TeecResult;
1099*095e2a82SHisping Lin 	TEEC_Context TeecContext;
1100*095e2a82SHisping Lin 	TEEC_Session TeecSession;
1101*095e2a82SHisping Lin 	uint32_t ErrorOrigin;
1102*095e2a82SHisping Lin 	TEEC_UUID tempuuid = { 0x258be795, 0xf9ca, 0x40e6,
1103*095e2a82SHisping Lin 		{ 0xa8, 0x69, 0x9c, 0xe6, 0x88, 0x6c, 0x5d, 0x5d } };
1104*095e2a82SHisping Lin 	TEEC_UUID *TeecUuid = &tempuuid;
1105*095e2a82SHisping Lin 	TEEC_Operation TeecOperation = {0};
1106*095e2a82SHisping Lin 
1107*095e2a82SHisping Lin 	debug("testmm start\n");
1108*095e2a82SHisping Lin 	OpteeClientApiLibInitialize();
1109*095e2a82SHisping Lin 
1110*095e2a82SHisping Lin 	TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
1111*095e2a82SHisping Lin 
1112*095e2a82SHisping Lin 	TeecResult = TEEC_OpenSession(&TeecContext,
1113*095e2a82SHisping Lin 				&TeecSession,
1114*095e2a82SHisping Lin 				TeecUuid,
1115*095e2a82SHisping Lin 				TEEC_LOGIN_PUBLIC,
1116*095e2a82SHisping Lin 				NULL,
1117*095e2a82SHisping Lin 				NULL,
1118*095e2a82SHisping Lin 				&ErrorOrigin);
1119*095e2a82SHisping Lin 
1120*095e2a82SHisping Lin 	TEEC_SharedMemory SharedMem0 = {0};
1121*095e2a82SHisping Lin 
1122*095e2a82SHisping Lin 	SharedMem0.size = sizeof("attributes_flag");
1123*095e2a82SHisping Lin 	SharedMem0.flags = 0;
1124*095e2a82SHisping Lin 
1125*095e2a82SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
1126*095e2a82SHisping Lin 
1127*095e2a82SHisping Lin 	memcpy(SharedMem0.buffer, "attributes_flag", SharedMem0.size);
1128*095e2a82SHisping Lin 
1129*095e2a82SHisping Lin 	TEEC_SharedMemory SharedMem1 = {0};
1130*095e2a82SHisping Lin 
1131*095e2a82SHisping Lin 	SharedMem1.size = 1;
1132*095e2a82SHisping Lin 	SharedMem1.flags = 0;
1133*095e2a82SHisping Lin 
1134*095e2a82SHisping Lin 	TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1);
1135*095e2a82SHisping Lin 
1136*095e2a82SHisping Lin 	memcpy(SharedMem1.buffer, (char *)&attributes, SharedMem1.size);
1137*095e2a82SHisping Lin 
1138*095e2a82SHisping Lin 	TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
1139*095e2a82SHisping Lin 	TeecOperation.params[0].tmpref.size = SharedMem0.size;
1140*095e2a82SHisping Lin 
1141*095e2a82SHisping Lin 	TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer;
1142*095e2a82SHisping Lin 	TeecOperation.params[1].tmpref.size = SharedMem1.size;
1143*095e2a82SHisping Lin 
1144*095e2a82SHisping Lin 	TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
1145*095e2a82SHisping Lin 						TEEC_MEMREF_TEMP_INOUT,
1146*095e2a82SHisping Lin 						TEEC_NONE,
1147*095e2a82SHisping Lin 						TEEC_NONE);
1148*095e2a82SHisping Lin 
1149*095e2a82SHisping Lin 	TeecResult = TEEC_InvokeCommand(&TeecSession,
1150*095e2a82SHisping Lin 					141,
1151*095e2a82SHisping Lin 					&TeecOperation,
1152*095e2a82SHisping Lin 					&ErrorOrigin);
1153*095e2a82SHisping Lin 
1154*095e2a82SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem0);
1155*095e2a82SHisping Lin 	TEEC_ReleaseSharedMemory(&SharedMem1);
1156*095e2a82SHisping Lin 	TEEC_CloseSession(&TeecSession);
1157*095e2a82SHisping Lin 	TEEC_FinalizeContext(&TeecContext);
1158*095e2a82SHisping Lin 	debug("testmm end\n");
1159*095e2a82SHisping Lin 
1160*095e2a82SHisping Lin 	return TeecResult;
1161*095e2a82SHisping Lin }
1162