xref: /optee_os/ta/avb/entry.c (revision 9c3a1069cc73ef90fefefdca9daf435f6672cdaa)
1b29b4195SJens Wiklander // SPDX-License-Identifier: BSD-2-Clause
2b29b4195SJens Wiklander /* Copyright (c) 2018, Linaro Limited */
3b29b4195SJens Wiklander 
4b29b4195SJens Wiklander #include <ta_avb.h>
5b29b4195SJens Wiklander #include <tee_internal_api.h>
6b29b4195SJens Wiklander #include <tee_internal_api_extensions.h>
7b29b4195SJens Wiklander 
8275d9d31SIgor Opaniuk #include <string.h>
9275d9d31SIgor Opaniuk #include <util.h>
10275d9d31SIgor Opaniuk 
11b29b4195SJens Wiklander #define DEFAULT_LOCK_STATE	0
12b29b4195SJens Wiklander 
13b29b4195SJens Wiklander static const uint32_t storageid = TEE_STORAGE_PRIVATE_RPMB;
14275d9d31SIgor Opaniuk static const char rb_obj_name[] = "rb_state";
15275d9d31SIgor Opaniuk static const char *named_value_prefix = "named_value_";
16b29b4195SJens Wiklander 
17b29b4195SJens Wiklander static TEE_Result get_slot_offset(size_t slot, size_t *offset)
18b29b4195SJens Wiklander {
19b29b4195SJens Wiklander 	if (slot >= TA_AVB_MAX_ROLLBACK_LOCATIONS)
20b29b4195SJens Wiklander 		return TEE_ERROR_BAD_PARAMETERS;
21b29b4195SJens Wiklander 
22b29b4195SJens Wiklander 	*offset = sizeof(uint32_t) /* lock_state */ + slot * sizeof(uint64_t);
23b29b4195SJens Wiklander 	return TEE_SUCCESS;
24b29b4195SJens Wiklander }
25b29b4195SJens Wiklander 
26275d9d31SIgor Opaniuk static TEE_Result create_rb_state(uint32_t lock_state, TEE_ObjectHandle *h)
27b29b4195SJens Wiklander {
28b29b4195SJens Wiklander 	const uint32_t flags = TEE_DATA_FLAG_ACCESS_READ |
29b29b4195SJens Wiklander 			       TEE_DATA_FLAG_ACCESS_WRITE |
30b29b4195SJens Wiklander 			       TEE_DATA_FLAG_OVERWRITE;
31b29b4195SJens Wiklander 
32275d9d31SIgor Opaniuk 	return TEE_CreatePersistentObject(storageid, rb_obj_name,
33275d9d31SIgor Opaniuk 					  sizeof(rb_obj_name), flags, NULL,
34275d9d31SIgor Opaniuk 					  &lock_state, sizeof(lock_state), h);
35b29b4195SJens Wiklander }
36b29b4195SJens Wiklander 
37275d9d31SIgor Opaniuk static TEE_Result open_rb_state(uint32_t default_lock_state,
38275d9d31SIgor Opaniuk 				TEE_ObjectHandle *h)
39b29b4195SJens Wiklander {
40275d9d31SIgor Opaniuk 	uint32_t flags = TEE_DATA_FLAG_ACCESS_READ |
41275d9d31SIgor Opaniuk 			 TEE_DATA_FLAG_ACCESS_WRITE;
42b29b4195SJens Wiklander 	TEE_Result res;
43b29b4195SJens Wiklander 
44275d9d31SIgor Opaniuk 	res = TEE_OpenPersistentObject(storageid, rb_obj_name,
45275d9d31SIgor Opaniuk 				       sizeof(rb_obj_name), flags, h);
46b29b4195SJens Wiklander 	if (!res)
47b29b4195SJens Wiklander 		return TEE_SUCCESS;
48b29b4195SJens Wiklander 
49275d9d31SIgor Opaniuk 	return create_rb_state(default_lock_state, h);
50275d9d31SIgor Opaniuk }
51275d9d31SIgor Opaniuk 
52275d9d31SIgor Opaniuk static TEE_Result get_named_object_name(char *name_orig,
53275d9d31SIgor Opaniuk 					uint32_t name_orig_size,
54275d9d31SIgor Opaniuk 					char *name, uint32_t *name_size)
55275d9d31SIgor Opaniuk {
56275d9d31SIgor Opaniuk 	size_t pref_len = strlen(named_value_prefix);
57275d9d31SIgor Opaniuk 
58275d9d31SIgor Opaniuk 	if (name_orig_size + pref_len >
59275d9d31SIgor Opaniuk 	    TEE_OBJECT_ID_MAX_LEN)
60275d9d31SIgor Opaniuk 		return TEE_ERROR_BAD_PARAMETERS;
61275d9d31SIgor Opaniuk 
62275d9d31SIgor Opaniuk 	/* Start with prefix */
63275d9d31SIgor Opaniuk 	TEE_MemMove(name, named_value_prefix, pref_len);
64275d9d31SIgor Opaniuk 
65275d9d31SIgor Opaniuk 	/* Concatenate provided object name */
66275d9d31SIgor Opaniuk 	TEE_MemMove(name + pref_len, name_orig, name_orig_size);
67275d9d31SIgor Opaniuk 
68275d9d31SIgor Opaniuk 	*name_size = name_orig_size + pref_len;
69275d9d31SIgor Opaniuk 
70275d9d31SIgor Opaniuk 	return TEE_SUCCESS;
71b29b4195SJens Wiklander }
72b29b4195SJens Wiklander 
73b29b4195SJens Wiklander static TEE_Result read_rb_idx(uint32_t pt, TEE_Param params[TEE_NUM_PARAMS])
74b29b4195SJens Wiklander {
75b29b4195SJens Wiklander 	const uint32_t exp_pt = TEE_PARAM_TYPES(TEE_PARAM_TYPE_VALUE_INPUT,
76b29b4195SJens Wiklander 						TEE_PARAM_TYPE_VALUE_OUTPUT,
77b29b4195SJens Wiklander 						TEE_PARAM_TYPE_NONE,
78b29b4195SJens Wiklander 						TEE_PARAM_TYPE_NONE);
79b29b4195SJens Wiklander 	size_t slot_offset;
80b29b4195SJens Wiklander 	uint64_t idx;
81b29b4195SJens Wiklander 	uint32_t count;
82b29b4195SJens Wiklander 	TEE_Result res;
83b29b4195SJens Wiklander 	TEE_ObjectHandle h;
84b29b4195SJens Wiklander 
85b29b4195SJens Wiklander 	if (pt != exp_pt)
86b29b4195SJens Wiklander 		return TEE_ERROR_BAD_PARAMETERS;
87b29b4195SJens Wiklander 
88b29b4195SJens Wiklander 	res = get_slot_offset(params[0].value.a, &slot_offset);
89b29b4195SJens Wiklander 	if (res)
90b29b4195SJens Wiklander 		return res;
91b29b4195SJens Wiklander 
92275d9d31SIgor Opaniuk 	res = open_rb_state(DEFAULT_LOCK_STATE, &h);
93b29b4195SJens Wiklander 	if (res)
94b29b4195SJens Wiklander 		return res;
95b29b4195SJens Wiklander 
96b29b4195SJens Wiklander 	res = TEE_SeekObjectData(h, slot_offset, TEE_DATA_SEEK_SET);
97b29b4195SJens Wiklander 	if (res)
98b29b4195SJens Wiklander 		goto out;
99b29b4195SJens Wiklander 
100b29b4195SJens Wiklander 	res =  TEE_ReadObjectData(h, &idx, sizeof(idx), &count);
101b29b4195SJens Wiklander 	if (res)
102b29b4195SJens Wiklander 		goto out;
103b29b4195SJens Wiklander 	if (count != sizeof(idx)) {
104b29b4195SJens Wiklander 		idx = 0; /* Not yet written slots are reported as 0 */
105b29b4195SJens Wiklander 
106b29b4195SJens Wiklander 		if (count) {
107b29b4195SJens Wiklander 			/*
108b29b4195SJens Wiklander 			 * Somehow the file didn't even hold a complete
109b29b4195SJens Wiklander 			 * slot index entry.  Write it as 0.
110b29b4195SJens Wiklander 			 */
111b29b4195SJens Wiklander 			res = TEE_SeekObjectData(h, slot_offset,
112b29b4195SJens Wiklander 						 TEE_DATA_SEEK_SET);
113b29b4195SJens Wiklander 			if (res)
114b29b4195SJens Wiklander 				goto out;
115b29b4195SJens Wiklander 			res = TEE_WriteObjectData(h, &idx, sizeof(idx));
116b29b4195SJens Wiklander 			if (res)
117b29b4195SJens Wiklander 				goto out;
118b29b4195SJens Wiklander 		}
119b29b4195SJens Wiklander 	}
120b29b4195SJens Wiklander 
121b29b4195SJens Wiklander 	params[1].value.a = idx >> 32;
122b29b4195SJens Wiklander 	params[1].value.b = idx;
123b29b4195SJens Wiklander out:
124b29b4195SJens Wiklander 	TEE_CloseObject(h);
125b29b4195SJens Wiklander 	return res;
126b29b4195SJens Wiklander }
127b29b4195SJens Wiklander 
128b29b4195SJens Wiklander static TEE_Result write_rb_idx(uint32_t pt, TEE_Param params[TEE_NUM_PARAMS])
129b29b4195SJens Wiklander {
130b29b4195SJens Wiklander 	const uint32_t exp_pt = TEE_PARAM_TYPES(TEE_PARAM_TYPE_VALUE_INPUT,
131b29b4195SJens Wiklander 						TEE_PARAM_TYPE_VALUE_INPUT,
132b29b4195SJens Wiklander 						TEE_PARAM_TYPE_NONE,
133b29b4195SJens Wiklander 						TEE_PARAM_TYPE_NONE);
134b29b4195SJens Wiklander 	size_t slot_offset;
135b29b4195SJens Wiklander 	uint64_t widx;
136b29b4195SJens Wiklander 	uint64_t idx;
137b29b4195SJens Wiklander 	uint32_t count;
138b29b4195SJens Wiklander 	TEE_Result res;
139b29b4195SJens Wiklander 	TEE_ObjectHandle h;
140b29b4195SJens Wiklander 
141b29b4195SJens Wiklander 	if (pt != exp_pt)
142b29b4195SJens Wiklander 		return TEE_ERROR_BAD_PARAMETERS;
143b29b4195SJens Wiklander 
144b29b4195SJens Wiklander 	res = get_slot_offset(params[0].value.a, &slot_offset);
145b29b4195SJens Wiklander 	if (res)
146b29b4195SJens Wiklander 		return res;
147b29b4195SJens Wiklander 	widx = ((uint64_t)params[1].value.a << 32) | params[1].value.b;
148b29b4195SJens Wiklander 
149275d9d31SIgor Opaniuk 	res = open_rb_state(DEFAULT_LOCK_STATE, &h);
150b29b4195SJens Wiklander 	if (res)
151b29b4195SJens Wiklander 		return res;
152b29b4195SJens Wiklander 
153b29b4195SJens Wiklander 	res = TEE_SeekObjectData(h, slot_offset, TEE_DATA_SEEK_SET);
154b29b4195SJens Wiklander 	if (res)
155b29b4195SJens Wiklander 		goto out;
156b29b4195SJens Wiklander 
157b29b4195SJens Wiklander 	res =  TEE_ReadObjectData(h, &idx, sizeof(idx), &count);
158b29b4195SJens Wiklander 	if (res)
159b29b4195SJens Wiklander 		goto out;
160b29b4195SJens Wiklander 	if (count != sizeof(idx))
161b29b4195SJens Wiklander 		idx = 0; /* Not yet written slots are reported as 0 */
162b29b4195SJens Wiklander 
163b29b4195SJens Wiklander 	if (widx < idx) {
164b29b4195SJens Wiklander 		res = TEE_ERROR_SECURITY;
165b29b4195SJens Wiklander 		goto out;
166b29b4195SJens Wiklander 	}
167b29b4195SJens Wiklander 
168b29b4195SJens Wiklander 	res = TEE_SeekObjectData(h, slot_offset, TEE_DATA_SEEK_SET);
169b29b4195SJens Wiklander 	if (res)
170b29b4195SJens Wiklander 		goto out;
171b29b4195SJens Wiklander 
172b29b4195SJens Wiklander 	res = TEE_WriteObjectData(h, &widx, sizeof(widx));
173b29b4195SJens Wiklander out:
174b29b4195SJens Wiklander 	TEE_CloseObject(h);
175b29b4195SJens Wiklander 	return res;
176b29b4195SJens Wiklander }
177b29b4195SJens Wiklander 
178b29b4195SJens Wiklander static TEE_Result read_lock_state(uint32_t pt, TEE_Param params[TEE_NUM_PARAMS])
179b29b4195SJens Wiklander {
180b29b4195SJens Wiklander 	const uint32_t exp_pt = TEE_PARAM_TYPES(TEE_PARAM_TYPE_VALUE_OUTPUT,
181b29b4195SJens Wiklander 						TEE_PARAM_TYPE_NONE,
182b29b4195SJens Wiklander 						TEE_PARAM_TYPE_NONE,
183b29b4195SJens Wiklander 						TEE_PARAM_TYPE_NONE);
184b29b4195SJens Wiklander 	uint32_t lock_state;
185b29b4195SJens Wiklander 	uint32_t count;
186b29b4195SJens Wiklander 	TEE_Result res;
187b29b4195SJens Wiklander 	TEE_ObjectHandle h;
188b29b4195SJens Wiklander 
189b29b4195SJens Wiklander 	if (pt != exp_pt)
190b29b4195SJens Wiklander 		return TEE_ERROR_BAD_PARAMETERS;
191b29b4195SJens Wiklander 
192275d9d31SIgor Opaniuk 	res = open_rb_state(DEFAULT_LOCK_STATE, &h);
193b29b4195SJens Wiklander 	if (res)
194b29b4195SJens Wiklander 		return res;
195b29b4195SJens Wiklander 
196b29b4195SJens Wiklander 	res =  TEE_ReadObjectData(h, &lock_state, sizeof(lock_state), &count);
197b29b4195SJens Wiklander 	if (res)
198b29b4195SJens Wiklander 		goto out;
199b29b4195SJens Wiklander 	if (count != sizeof(lock_state)) {
200b29b4195SJens Wiklander 		/*
201b29b4195SJens Wiklander 		 * Client need write the lock state to recover, this can
202b29b4195SJens Wiklander 		 * normally not happen.
203b29b4195SJens Wiklander 		 */
204b29b4195SJens Wiklander 		res = TEE_ERROR_CORRUPT_OBJECT;
205b29b4195SJens Wiklander 		goto out;
206b29b4195SJens Wiklander 	}
207b29b4195SJens Wiklander 
208b29b4195SJens Wiklander 	params[0].value.a = lock_state;
209b29b4195SJens Wiklander out:
210b29b4195SJens Wiklander 	TEE_CloseObject(h);
211b29b4195SJens Wiklander 	return res;
212b29b4195SJens Wiklander }
213b29b4195SJens Wiklander 
214b29b4195SJens Wiklander static TEE_Result write_lock_state(uint32_t pt,
215b29b4195SJens Wiklander 				   TEE_Param params[TEE_NUM_PARAMS])
216b29b4195SJens Wiklander {
217b29b4195SJens Wiklander 	const uint32_t exp_pt = TEE_PARAM_TYPES(TEE_PARAM_TYPE_VALUE_INPUT,
218b29b4195SJens Wiklander 						TEE_PARAM_TYPE_NONE,
219b29b4195SJens Wiklander 						TEE_PARAM_TYPE_NONE,
220b29b4195SJens Wiklander 						TEE_PARAM_TYPE_NONE);
221b29b4195SJens Wiklander 	uint32_t wlock_state;
222b29b4195SJens Wiklander 	uint32_t lock_state;
223b29b4195SJens Wiklander 	uint32_t count;
224b29b4195SJens Wiklander 	TEE_Result res;
225b29b4195SJens Wiklander 	TEE_ObjectHandle h;
226b29b4195SJens Wiklander 
227b29b4195SJens Wiklander 	if (pt != exp_pt)
228b29b4195SJens Wiklander 		return TEE_ERROR_BAD_PARAMETERS;
229b29b4195SJens Wiklander 
230b29b4195SJens Wiklander 	wlock_state = params[0].value.a;
231b29b4195SJens Wiklander 
232275d9d31SIgor Opaniuk 	res = open_rb_state(wlock_state, &h);
233b29b4195SJens Wiklander 	if (res)
234b29b4195SJens Wiklander 		return res;
235b29b4195SJens Wiklander 
236b29b4195SJens Wiklander 	res =  TEE_ReadObjectData(h, &lock_state, sizeof(lock_state), &count);
237b29b4195SJens Wiklander 	if (res)
238b29b4195SJens Wiklander 		goto out;
239b29b4195SJens Wiklander 	if (count == sizeof(lock_state) && lock_state == wlock_state)
240b29b4195SJens Wiklander 		goto out;
241b29b4195SJens Wiklander 
242275d9d31SIgor Opaniuk 	res = create_rb_state(wlock_state, &h);
243b29b4195SJens Wiklander out:
244b29b4195SJens Wiklander 	TEE_CloseObject(h);
245b29b4195SJens Wiklander 	return res;
246b29b4195SJens Wiklander }
247b29b4195SJens Wiklander 
248275d9d31SIgor Opaniuk static TEE_Result write_persist_value(uint32_t pt,
249275d9d31SIgor Opaniuk 				      TEE_Param params[TEE_NUM_PARAMS])
250275d9d31SIgor Opaniuk {
251275d9d31SIgor Opaniuk 	const uint32_t exp_pt = TEE_PARAM_TYPES(TEE_PARAM_TYPE_MEMREF_INPUT,
252275d9d31SIgor Opaniuk 						TEE_PARAM_TYPE_MEMREF_INPUT,
253275d9d31SIgor Opaniuk 						TEE_PARAM_TYPE_NONE,
254275d9d31SIgor Opaniuk 						TEE_PARAM_TYPE_NONE);
255275d9d31SIgor Opaniuk 	const uint32_t flags = TEE_DATA_FLAG_ACCESS_READ |
256275d9d31SIgor Opaniuk 			       TEE_DATA_FLAG_ACCESS_WRITE |
257275d9d31SIgor Opaniuk 			       TEE_DATA_FLAG_OVERWRITE;
258*9c3a1069SJens Wiklander 	char name_full[TEE_OBJECT_ID_MAX_LEN] = { };
259*9c3a1069SJens Wiklander 	TEE_ObjectHandle h = TEE_HANDLE_NULL;
260*9c3a1069SJens Wiklander 	TEE_Result res = TEE_SUCCESS;
261*9c3a1069SJens Wiklander 	uint32_t name_full_sz = 0;
262*9c3a1069SJens Wiklander 	uint32_t name_buf_sz = 0;
263*9c3a1069SJens Wiklander 	uint32_t value_sz = 0;
264*9c3a1069SJens Wiklander 	char *name_buf = NULL;
265*9c3a1069SJens Wiklander 	char *value = NULL;
266275d9d31SIgor Opaniuk 
267275d9d31SIgor Opaniuk 	if (pt != exp_pt)
268275d9d31SIgor Opaniuk 		return TEE_ERROR_BAD_PARAMETERS;
269275d9d31SIgor Opaniuk 
270*9c3a1069SJens Wiklander 	name_buf = params[0].memref.buffer;
271*9c3a1069SJens Wiklander 	name_buf_sz = params[0].memref.size;
272*9c3a1069SJens Wiklander 	value_sz = params[1].memref.size;
273*9c3a1069SJens Wiklander 	value = TEE_Malloc(value_sz, 0);
274ddcd07a2SIgor Opaniuk 	if (!value)
275ddcd07a2SIgor Opaniuk 		return TEE_ERROR_OUT_OF_MEMORY;
276ddcd07a2SIgor Opaniuk 
277ddcd07a2SIgor Opaniuk 	TEE_MemMove(value, params[1].memref.buffer, value_sz);
278275d9d31SIgor Opaniuk 
279275d9d31SIgor Opaniuk 	res = get_named_object_name(name_buf, name_buf_sz,
280275d9d31SIgor Opaniuk 				    name_full, &name_full_sz);
281275d9d31SIgor Opaniuk 	if (res)
282ddcd07a2SIgor Opaniuk 		goto out;
283275d9d31SIgor Opaniuk 
284275d9d31SIgor Opaniuk 	res = TEE_CreatePersistentObject(storageid, name_full,
285275d9d31SIgor Opaniuk 					 name_full_sz,
286275d9d31SIgor Opaniuk 					 flags, NULL, value,
287275d9d31SIgor Opaniuk 					 value_sz, &h);
288275d9d31SIgor Opaniuk 	if (res)
289275d9d31SIgor Opaniuk 		EMSG("Can't create named object value, res = 0x%x", res);
290275d9d31SIgor Opaniuk 
291275d9d31SIgor Opaniuk 	TEE_CloseObject(h);
292ddcd07a2SIgor Opaniuk out:
293ddcd07a2SIgor Opaniuk 	TEE_Free(value);
294275d9d31SIgor Opaniuk 
295275d9d31SIgor Opaniuk 	return res;
296275d9d31SIgor Opaniuk }
297275d9d31SIgor Opaniuk 
298275d9d31SIgor Opaniuk static TEE_Result read_persist_value(uint32_t pt,
299275d9d31SIgor Opaniuk 				      TEE_Param params[TEE_NUM_PARAMS])
300275d9d31SIgor Opaniuk {
301275d9d31SIgor Opaniuk 	const uint32_t exp_pt = TEE_PARAM_TYPES(TEE_PARAM_TYPE_MEMREF_INPUT,
302275d9d31SIgor Opaniuk 						TEE_PARAM_TYPE_MEMREF_INOUT,
303275d9d31SIgor Opaniuk 						TEE_PARAM_TYPE_NONE,
304275d9d31SIgor Opaniuk 						TEE_PARAM_TYPE_NONE);
305275d9d31SIgor Opaniuk 	uint32_t flags = TEE_DATA_FLAG_ACCESS_READ |
306275d9d31SIgor Opaniuk 			 TEE_DATA_FLAG_ACCESS_WRITE;
307*9c3a1069SJens Wiklander 	TEE_Result res = TEE_SUCCESS;
308*9c3a1069SJens Wiklander 	TEE_ObjectHandle h = TEE_HANDLE_NULL;
309275d9d31SIgor Opaniuk 	char name_full[TEE_OBJECT_ID_MAX_LEN];
310*9c3a1069SJens Wiklander 	uint32_t name_full_sz = 0;
311*9c3a1069SJens Wiklander 	uint32_t name_buf_sz = 0;
312*9c3a1069SJens Wiklander 	char *name_buf = NULL;
313*9c3a1069SJens Wiklander 	uint32_t value_sz = 0;
314*9c3a1069SJens Wiklander 	char *value = NULL;
315*9c3a1069SJens Wiklander 	uint32_t count = 0;
316275d9d31SIgor Opaniuk 
317275d9d31SIgor Opaniuk 	if (pt != exp_pt)
318275d9d31SIgor Opaniuk 		return TEE_ERROR_BAD_PARAMETERS;
319275d9d31SIgor Opaniuk 
320*9c3a1069SJens Wiklander 	name_buf = params[0].memref.buffer;
321*9c3a1069SJens Wiklander 	name_buf_sz = params[0].memref.size;
322*9c3a1069SJens Wiklander 	value_sz = params[1].memref.size;
323*9c3a1069SJens Wiklander 	value = TEE_Malloc(value_sz, 0);
324ddcd07a2SIgor Opaniuk 	if (!value)
325ddcd07a2SIgor Opaniuk 		return TEE_ERROR_OUT_OF_MEMORY;
326275d9d31SIgor Opaniuk 
327275d9d31SIgor Opaniuk 	res = get_named_object_name(name_buf, name_buf_sz,
328275d9d31SIgor Opaniuk 				    name_full, &name_full_sz);
329275d9d31SIgor Opaniuk 	if (res)
330ddcd07a2SIgor Opaniuk 		goto out_free;
331275d9d31SIgor Opaniuk 
332275d9d31SIgor Opaniuk 	res = TEE_OpenPersistentObject(storageid, name_full,
333275d9d31SIgor Opaniuk 				       name_full_sz, flags, &h);
334275d9d31SIgor Opaniuk 	if (res) {
335275d9d31SIgor Opaniuk 		EMSG("Can't open named object value, res = 0x%x", res);
336ddcd07a2SIgor Opaniuk 		goto out_free;
337275d9d31SIgor Opaniuk 	}
338275d9d31SIgor Opaniuk 
339275d9d31SIgor Opaniuk 	res =  TEE_ReadObjectData(h, value, value_sz, &count);
340275d9d31SIgor Opaniuk 	if (res) {
341275d9d31SIgor Opaniuk 		EMSG("Can't read named object value, res = 0x%x", res);
342275d9d31SIgor Opaniuk 		goto out;
343275d9d31SIgor Opaniuk 	}
344275d9d31SIgor Opaniuk 
345ddcd07a2SIgor Opaniuk 	TEE_MemMove(params[1].memref.buffer, value,
346ddcd07a2SIgor Opaniuk 		    value_sz);
347ddcd07a2SIgor Opaniuk 
348275d9d31SIgor Opaniuk 	params[1].memref.size = count;
349275d9d31SIgor Opaniuk out:
350275d9d31SIgor Opaniuk 	TEE_CloseObject(h);
351ddcd07a2SIgor Opaniuk out_free:
352ddcd07a2SIgor Opaniuk 	TEE_Free(value);
353275d9d31SIgor Opaniuk 
354275d9d31SIgor Opaniuk 	return res;
355275d9d31SIgor Opaniuk }
356275d9d31SIgor Opaniuk 
357b29b4195SJens Wiklander TEE_Result TA_CreateEntryPoint(void)
358b29b4195SJens Wiklander {
359b29b4195SJens Wiklander 	return TEE_SUCCESS;
360b29b4195SJens Wiklander }
361b29b4195SJens Wiklander 
362b29b4195SJens Wiklander void TA_DestroyEntryPoint(void)
363b29b4195SJens Wiklander {
364b29b4195SJens Wiklander }
365b29b4195SJens Wiklander 
366b29b4195SJens Wiklander TEE_Result TA_OpenSessionEntryPoint(uint32_t pt __unused,
367b29b4195SJens Wiklander 				    TEE_Param params[4] __unused,
368b29b4195SJens Wiklander 				    void **session __unused)
369b29b4195SJens Wiklander {
370b29b4195SJens Wiklander 	return TEE_SUCCESS;
371b29b4195SJens Wiklander }
372b29b4195SJens Wiklander 
373b29b4195SJens Wiklander void TA_CloseSessionEntryPoint(void *sess __unused)
374b29b4195SJens Wiklander {
375b29b4195SJens Wiklander }
376b29b4195SJens Wiklander 
377b29b4195SJens Wiklander TEE_Result TA_InvokeCommandEntryPoint(void *sess __unused, uint32_t cmd,
378b29b4195SJens Wiklander 				      uint32_t pt,
379b29b4195SJens Wiklander 				      TEE_Param params[TEE_NUM_PARAMS])
380b29b4195SJens Wiklander {
381b29b4195SJens Wiklander 	switch (cmd) {
382b29b4195SJens Wiklander 	case TA_AVB_CMD_READ_ROLLBACK_INDEX:
383b29b4195SJens Wiklander 		return read_rb_idx(pt, params);
384b29b4195SJens Wiklander 	case TA_AVB_CMD_WRITE_ROLLBACK_INDEX:
385b29b4195SJens Wiklander 		return write_rb_idx(pt, params);
386b29b4195SJens Wiklander 	case TA_AVB_CMD_READ_LOCK_STATE:
387b29b4195SJens Wiklander 		return read_lock_state(pt, params);
388b29b4195SJens Wiklander 	case TA_AVB_CMD_WRITE_LOCK_STATE:
389b29b4195SJens Wiklander 		return write_lock_state(pt, params);
390275d9d31SIgor Opaniuk 	case TA_AVB_CMD_READ_PERSIST_VALUE:
391275d9d31SIgor Opaniuk 		return read_persist_value(pt, params);
392275d9d31SIgor Opaniuk 	case TA_AVB_CMD_WRITE_PERSIST_VALUE:
393275d9d31SIgor Opaniuk 		return write_persist_value(pt, params);
394b29b4195SJens Wiklander 	default:
395b29b4195SJens Wiklander 		EMSG("Command ID 0x%x is not supported", cmd);
396b29b4195SJens Wiklander 		return TEE_ERROR_NOT_SUPPORTED;
397b29b4195SJens Wiklander 	}
398b29b4195SJens Wiklander }
399