xref: /optee_os/ta/avb/entry.c (revision c7f1b4f7881fded88ca7b5bffc8cc47b94c07dd5)
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;
81*c7f1b4f7SJens Wiklander 	size_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;
137*c7f1b4f7SJens Wiklander 	size_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;
185*c7f1b4f7SJens Wiklander 	size_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;
223*c7f1b4f7SJens Wiklander 	size_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 
2424dce38c2SIvan Khoronzhuk 	res = TEE_SeekObjectData(h, 0, TEE_DATA_SEEK_SET);
2434dce38c2SIvan Khoronzhuk 	if (res)
2444dce38c2SIvan Khoronzhuk 		goto out;
2454dce38c2SIvan Khoronzhuk 
2464dce38c2SIvan Khoronzhuk 	res = TEE_WriteObjectData(h, &wlock_state, sizeof(wlock_state));
247b29b4195SJens Wiklander out:
248b29b4195SJens Wiklander 	TEE_CloseObject(h);
249b29b4195SJens Wiklander 	return res;
250b29b4195SJens Wiklander }
251b29b4195SJens Wiklander 
252275d9d31SIgor Opaniuk static TEE_Result write_persist_value(uint32_t pt,
253275d9d31SIgor Opaniuk 				      TEE_Param params[TEE_NUM_PARAMS])
254275d9d31SIgor Opaniuk {
255275d9d31SIgor Opaniuk 	const uint32_t exp_pt = TEE_PARAM_TYPES(TEE_PARAM_TYPE_MEMREF_INPUT,
256275d9d31SIgor Opaniuk 						TEE_PARAM_TYPE_MEMREF_INPUT,
257275d9d31SIgor Opaniuk 						TEE_PARAM_TYPE_NONE,
258275d9d31SIgor Opaniuk 						TEE_PARAM_TYPE_NONE);
259275d9d31SIgor Opaniuk 	const uint32_t flags = TEE_DATA_FLAG_ACCESS_READ |
260275d9d31SIgor Opaniuk 			       TEE_DATA_FLAG_ACCESS_WRITE |
261275d9d31SIgor Opaniuk 			       TEE_DATA_FLAG_OVERWRITE;
2629c3a1069SJens Wiklander 	char name_full[TEE_OBJECT_ID_MAX_LEN] = { };
2639c3a1069SJens Wiklander 	TEE_ObjectHandle h = TEE_HANDLE_NULL;
2649c3a1069SJens Wiklander 	TEE_Result res = TEE_SUCCESS;
2659c3a1069SJens Wiklander 	uint32_t name_full_sz = 0;
2669c3a1069SJens Wiklander 	uint32_t name_buf_sz = 0;
2679c3a1069SJens Wiklander 	uint32_t value_sz = 0;
2689c3a1069SJens Wiklander 	char *name_buf = NULL;
2699c3a1069SJens Wiklander 	char *value = NULL;
270275d9d31SIgor Opaniuk 
271275d9d31SIgor Opaniuk 	if (pt != exp_pt)
272275d9d31SIgor Opaniuk 		return TEE_ERROR_BAD_PARAMETERS;
273275d9d31SIgor Opaniuk 
2749c3a1069SJens Wiklander 	name_buf = params[0].memref.buffer;
2759c3a1069SJens Wiklander 	name_buf_sz = params[0].memref.size;
2769c3a1069SJens Wiklander 	value_sz = params[1].memref.size;
2779c3a1069SJens Wiklander 	value = TEE_Malloc(value_sz, 0);
278ddcd07a2SIgor Opaniuk 	if (!value)
279ddcd07a2SIgor Opaniuk 		return TEE_ERROR_OUT_OF_MEMORY;
280ddcd07a2SIgor Opaniuk 
281ddcd07a2SIgor Opaniuk 	TEE_MemMove(value, params[1].memref.buffer, value_sz);
282275d9d31SIgor Opaniuk 
283275d9d31SIgor Opaniuk 	res = get_named_object_name(name_buf, name_buf_sz,
284275d9d31SIgor Opaniuk 				    name_full, &name_full_sz);
285275d9d31SIgor Opaniuk 	if (res)
286ddcd07a2SIgor Opaniuk 		goto out;
287275d9d31SIgor Opaniuk 
288275d9d31SIgor Opaniuk 	res = TEE_CreatePersistentObject(storageid, name_full,
289275d9d31SIgor Opaniuk 					 name_full_sz,
290275d9d31SIgor Opaniuk 					 flags, NULL, value,
291275d9d31SIgor Opaniuk 					 value_sz, &h);
292275d9d31SIgor Opaniuk 	if (res)
293275d9d31SIgor Opaniuk 		EMSG("Can't create named object value, res = 0x%x", res);
294275d9d31SIgor Opaniuk 
295275d9d31SIgor Opaniuk 	TEE_CloseObject(h);
296ddcd07a2SIgor Opaniuk out:
297ddcd07a2SIgor Opaniuk 	TEE_Free(value);
298275d9d31SIgor Opaniuk 
299275d9d31SIgor Opaniuk 	return res;
300275d9d31SIgor Opaniuk }
301275d9d31SIgor Opaniuk 
302275d9d31SIgor Opaniuk static TEE_Result read_persist_value(uint32_t pt,
303275d9d31SIgor Opaniuk 				      TEE_Param params[TEE_NUM_PARAMS])
304275d9d31SIgor Opaniuk {
305275d9d31SIgor Opaniuk 	const uint32_t exp_pt = TEE_PARAM_TYPES(TEE_PARAM_TYPE_MEMREF_INPUT,
306275d9d31SIgor Opaniuk 						TEE_PARAM_TYPE_MEMREF_INOUT,
307275d9d31SIgor Opaniuk 						TEE_PARAM_TYPE_NONE,
308275d9d31SIgor Opaniuk 						TEE_PARAM_TYPE_NONE);
309275d9d31SIgor Opaniuk 	uint32_t flags = TEE_DATA_FLAG_ACCESS_READ |
310275d9d31SIgor Opaniuk 			 TEE_DATA_FLAG_ACCESS_WRITE;
3119c3a1069SJens Wiklander 	TEE_Result res = TEE_SUCCESS;
3129c3a1069SJens Wiklander 	TEE_ObjectHandle h = TEE_HANDLE_NULL;
313275d9d31SIgor Opaniuk 	char name_full[TEE_OBJECT_ID_MAX_LEN];
3149c3a1069SJens Wiklander 	uint32_t name_full_sz = 0;
3159c3a1069SJens Wiklander 	uint32_t name_buf_sz = 0;
3169c3a1069SJens Wiklander 	char *name_buf = NULL;
3179c3a1069SJens Wiklander 	uint32_t value_sz = 0;
3189c3a1069SJens Wiklander 	char *value = NULL;
319*c7f1b4f7SJens Wiklander 	size_t count = 0;
320275d9d31SIgor Opaniuk 
321275d9d31SIgor Opaniuk 	if (pt != exp_pt)
322275d9d31SIgor Opaniuk 		return TEE_ERROR_BAD_PARAMETERS;
323275d9d31SIgor Opaniuk 
3249c3a1069SJens Wiklander 	name_buf = params[0].memref.buffer;
3259c3a1069SJens Wiklander 	name_buf_sz = params[0].memref.size;
3269c3a1069SJens Wiklander 	value_sz = params[1].memref.size;
3279c3a1069SJens Wiklander 	value = TEE_Malloc(value_sz, 0);
328ddcd07a2SIgor Opaniuk 	if (!value)
329ddcd07a2SIgor Opaniuk 		return TEE_ERROR_OUT_OF_MEMORY;
330275d9d31SIgor Opaniuk 
331275d9d31SIgor Opaniuk 	res = get_named_object_name(name_buf, name_buf_sz,
332275d9d31SIgor Opaniuk 				    name_full, &name_full_sz);
333275d9d31SIgor Opaniuk 	if (res)
334ddcd07a2SIgor Opaniuk 		goto out_free;
335275d9d31SIgor Opaniuk 
336275d9d31SIgor Opaniuk 	res = TEE_OpenPersistentObject(storageid, name_full,
337275d9d31SIgor Opaniuk 				       name_full_sz, flags, &h);
338275d9d31SIgor Opaniuk 	if (res) {
339275d9d31SIgor Opaniuk 		EMSG("Can't open named object value, res = 0x%x", res);
340ddcd07a2SIgor Opaniuk 		goto out_free;
341275d9d31SIgor Opaniuk 	}
342275d9d31SIgor Opaniuk 
343275d9d31SIgor Opaniuk 	res =  TEE_ReadObjectData(h, value, value_sz, &count);
344275d9d31SIgor Opaniuk 	if (res) {
345275d9d31SIgor Opaniuk 		EMSG("Can't read named object value, res = 0x%x", res);
346275d9d31SIgor Opaniuk 		goto out;
347275d9d31SIgor Opaniuk 	}
348275d9d31SIgor Opaniuk 
349ddcd07a2SIgor Opaniuk 	TEE_MemMove(params[1].memref.buffer, value,
350ddcd07a2SIgor Opaniuk 		    value_sz);
351ddcd07a2SIgor Opaniuk 
352275d9d31SIgor Opaniuk 	params[1].memref.size = count;
353275d9d31SIgor Opaniuk out:
354275d9d31SIgor Opaniuk 	TEE_CloseObject(h);
355ddcd07a2SIgor Opaniuk out_free:
356ddcd07a2SIgor Opaniuk 	TEE_Free(value);
357275d9d31SIgor Opaniuk 
358275d9d31SIgor Opaniuk 	return res;
359275d9d31SIgor Opaniuk }
360275d9d31SIgor Opaniuk 
361b29b4195SJens Wiklander TEE_Result TA_CreateEntryPoint(void)
362b29b4195SJens Wiklander {
363b29b4195SJens Wiklander 	return TEE_SUCCESS;
364b29b4195SJens Wiklander }
365b29b4195SJens Wiklander 
366b29b4195SJens Wiklander void TA_DestroyEntryPoint(void)
367b29b4195SJens Wiklander {
368b29b4195SJens Wiklander }
369b29b4195SJens Wiklander 
370b29b4195SJens Wiklander TEE_Result TA_OpenSessionEntryPoint(uint32_t pt __unused,
371b29b4195SJens Wiklander 				    TEE_Param params[4] __unused,
372b29b4195SJens Wiklander 				    void **session __unused)
373b29b4195SJens Wiklander {
374b29b4195SJens Wiklander 	return TEE_SUCCESS;
375b29b4195SJens Wiklander }
376b29b4195SJens Wiklander 
377b29b4195SJens Wiklander void TA_CloseSessionEntryPoint(void *sess __unused)
378b29b4195SJens Wiklander {
379b29b4195SJens Wiklander }
380b29b4195SJens Wiklander 
381b29b4195SJens Wiklander TEE_Result TA_InvokeCommandEntryPoint(void *sess __unused, uint32_t cmd,
382b29b4195SJens Wiklander 				      uint32_t pt,
383b29b4195SJens Wiklander 				      TEE_Param params[TEE_NUM_PARAMS])
384b29b4195SJens Wiklander {
385b29b4195SJens Wiklander 	switch (cmd) {
386b29b4195SJens Wiklander 	case TA_AVB_CMD_READ_ROLLBACK_INDEX:
387b29b4195SJens Wiklander 		return read_rb_idx(pt, params);
388b29b4195SJens Wiklander 	case TA_AVB_CMD_WRITE_ROLLBACK_INDEX:
389b29b4195SJens Wiklander 		return write_rb_idx(pt, params);
390b29b4195SJens Wiklander 	case TA_AVB_CMD_READ_LOCK_STATE:
391b29b4195SJens Wiklander 		return read_lock_state(pt, params);
392b29b4195SJens Wiklander 	case TA_AVB_CMD_WRITE_LOCK_STATE:
393b29b4195SJens Wiklander 		return write_lock_state(pt, params);
394275d9d31SIgor Opaniuk 	case TA_AVB_CMD_READ_PERSIST_VALUE:
395275d9d31SIgor Opaniuk 		return read_persist_value(pt, params);
396275d9d31SIgor Opaniuk 	case TA_AVB_CMD_WRITE_PERSIST_VALUE:
397275d9d31SIgor Opaniuk 		return write_persist_value(pt, params);
398b29b4195SJens Wiklander 	default:
399b29b4195SJens Wiklander 		EMSG("Command ID 0x%x is not supported", cmd);
400b29b4195SJens Wiklander 		return TEE_ERROR_NOT_SUPPORTED;
401b29b4195SJens Wiklander 	}
402b29b4195SJens Wiklander }
403