xref: /optee_os/ta/avb/entry.c (revision 4bc2a199d122c30f05bcc61e43da128ffabd46fb)
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 
10b29b4195SJens Wiklander #define DEFAULT_LOCK_STATE	0
11b29b4195SJens Wiklander 
12b29b4195SJens Wiklander static const uint32_t storageid = TEE_STORAGE_PRIVATE_RPMB;
13275d9d31SIgor Opaniuk static const char rb_obj_name[] = "rb_state";
14275d9d31SIgor Opaniuk static const char *named_value_prefix = "named_value_";
15b29b4195SJens Wiklander 
get_slot_offset(size_t slot,size_t * offset)16b29b4195SJens Wiklander static TEE_Result get_slot_offset(size_t slot, size_t *offset)
17b29b4195SJens Wiklander {
18b29b4195SJens Wiklander 	if (slot >= TA_AVB_MAX_ROLLBACK_LOCATIONS)
19b29b4195SJens Wiklander 		return TEE_ERROR_BAD_PARAMETERS;
20b29b4195SJens Wiklander 
21b29b4195SJens Wiklander 	*offset = sizeof(uint32_t) /* lock_state */ + slot * sizeof(uint64_t);
22b29b4195SJens Wiklander 	return TEE_SUCCESS;
23b29b4195SJens Wiklander }
24b29b4195SJens Wiklander 
create_rb_state(uint32_t lock_state,TEE_ObjectHandle * h)25275d9d31SIgor Opaniuk static TEE_Result create_rb_state(uint32_t lock_state, TEE_ObjectHandle *h)
26b29b4195SJens Wiklander {
27b29b4195SJens Wiklander 	const uint32_t flags = TEE_DATA_FLAG_ACCESS_READ |
28b29b4195SJens Wiklander 			       TEE_DATA_FLAG_ACCESS_WRITE |
29b29b4195SJens Wiklander 			       TEE_DATA_FLAG_OVERWRITE;
30b29b4195SJens Wiklander 
31275d9d31SIgor Opaniuk 	return TEE_CreatePersistentObject(storageid, rb_obj_name,
32275d9d31SIgor Opaniuk 					  sizeof(rb_obj_name), flags, NULL,
33275d9d31SIgor Opaniuk 					  &lock_state, sizeof(lock_state), h);
34b29b4195SJens Wiklander }
35b29b4195SJens Wiklander 
open_rb_state(uint32_t default_lock_state,TEE_ObjectHandle * h)36275d9d31SIgor Opaniuk static TEE_Result open_rb_state(uint32_t default_lock_state,
37275d9d31SIgor Opaniuk 				TEE_ObjectHandle *h)
38b29b4195SJens Wiklander {
39275d9d31SIgor Opaniuk 	uint32_t flags = TEE_DATA_FLAG_ACCESS_READ |
40275d9d31SIgor Opaniuk 			 TEE_DATA_FLAG_ACCESS_WRITE;
41b29b4195SJens Wiklander 	TEE_Result res;
42b29b4195SJens Wiklander 
43275d9d31SIgor Opaniuk 	res = TEE_OpenPersistentObject(storageid, rb_obj_name,
44275d9d31SIgor Opaniuk 				       sizeof(rb_obj_name), flags, h);
45b29b4195SJens Wiklander 	if (!res)
46b29b4195SJens Wiklander 		return TEE_SUCCESS;
47b29b4195SJens Wiklander 
48275d9d31SIgor Opaniuk 	return create_rb_state(default_lock_state, h);
49275d9d31SIgor Opaniuk }
50275d9d31SIgor Opaniuk 
get_named_object_name(char * name_orig,uint32_t name_orig_size,char * name,uint32_t * name_size)51275d9d31SIgor Opaniuk static TEE_Result get_named_object_name(char *name_orig,
52275d9d31SIgor Opaniuk 					uint32_t name_orig_size,
53275d9d31SIgor Opaniuk 					char *name, uint32_t *name_size)
54275d9d31SIgor Opaniuk {
55275d9d31SIgor Opaniuk 	size_t pref_len = strlen(named_value_prefix);
56275d9d31SIgor Opaniuk 
57275d9d31SIgor Opaniuk 	if (name_orig_size + pref_len >
58275d9d31SIgor Opaniuk 	    TEE_OBJECT_ID_MAX_LEN)
59275d9d31SIgor Opaniuk 		return TEE_ERROR_BAD_PARAMETERS;
60275d9d31SIgor Opaniuk 
61275d9d31SIgor Opaniuk 	/* Start with prefix */
62275d9d31SIgor Opaniuk 	TEE_MemMove(name, named_value_prefix, pref_len);
63275d9d31SIgor Opaniuk 
64275d9d31SIgor Opaniuk 	/* Concatenate provided object name */
65275d9d31SIgor Opaniuk 	TEE_MemMove(name + pref_len, name_orig, name_orig_size);
66275d9d31SIgor Opaniuk 
67275d9d31SIgor Opaniuk 	*name_size = name_orig_size + pref_len;
68275d9d31SIgor Opaniuk 
69275d9d31SIgor Opaniuk 	return TEE_SUCCESS;
70b29b4195SJens Wiklander }
71b29b4195SJens Wiklander 
read_rb_idx(uint32_t pt,TEE_Param params[TEE_NUM_PARAMS])72b29b4195SJens Wiklander static TEE_Result read_rb_idx(uint32_t pt, TEE_Param params[TEE_NUM_PARAMS])
73b29b4195SJens Wiklander {
74b29b4195SJens Wiklander 	const uint32_t exp_pt = TEE_PARAM_TYPES(TEE_PARAM_TYPE_VALUE_INPUT,
75b29b4195SJens Wiklander 						TEE_PARAM_TYPE_VALUE_OUTPUT,
76b29b4195SJens Wiklander 						TEE_PARAM_TYPE_NONE,
77b29b4195SJens Wiklander 						TEE_PARAM_TYPE_NONE);
78b29b4195SJens Wiklander 	size_t slot_offset;
79b29b4195SJens Wiklander 	uint64_t idx;
80*c7f1b4f7SJens Wiklander 	size_t count;
81b29b4195SJens Wiklander 	TEE_Result res;
82b29b4195SJens Wiklander 	TEE_ObjectHandle h;
83b29b4195SJens Wiklander 
84b29b4195SJens Wiklander 	if (pt != exp_pt)
85b29b4195SJens Wiklander 		return TEE_ERROR_BAD_PARAMETERS;
86b29b4195SJens Wiklander 
87b29b4195SJens Wiklander 	res = get_slot_offset(params[0].value.a, &slot_offset);
88b29b4195SJens Wiklander 	if (res)
89b29b4195SJens Wiklander 		return res;
90b29b4195SJens Wiklander 
91275d9d31SIgor Opaniuk 	res = open_rb_state(DEFAULT_LOCK_STATE, &h);
92b29b4195SJens Wiklander 	if (res)
93b29b4195SJens Wiklander 		return res;
94b29b4195SJens Wiklander 
95b29b4195SJens Wiklander 	res = TEE_SeekObjectData(h, slot_offset, TEE_DATA_SEEK_SET);
96b29b4195SJens Wiklander 	if (res)
97b29b4195SJens Wiklander 		goto out;
98b29b4195SJens Wiklander 
99b29b4195SJens Wiklander 	res =  TEE_ReadObjectData(h, &idx, sizeof(idx), &count);
100b29b4195SJens Wiklander 	if (res)
101b29b4195SJens Wiklander 		goto out;
102b29b4195SJens Wiklander 	if (count != sizeof(idx)) {
103b29b4195SJens Wiklander 		idx = 0; /* Not yet written slots are reported as 0 */
104b29b4195SJens Wiklander 
105b29b4195SJens Wiklander 		if (count) {
106b29b4195SJens Wiklander 			/*
107b29b4195SJens Wiklander 			 * Somehow the file didn't even hold a complete
108b29b4195SJens Wiklander 			 * slot index entry.  Write it as 0.
109b29b4195SJens Wiklander 			 */
110b29b4195SJens Wiklander 			res = TEE_SeekObjectData(h, slot_offset,
111b29b4195SJens Wiklander 						 TEE_DATA_SEEK_SET);
112b29b4195SJens Wiklander 			if (res)
113b29b4195SJens Wiklander 				goto out;
114b29b4195SJens Wiklander 			res = TEE_WriteObjectData(h, &idx, sizeof(idx));
115b29b4195SJens Wiklander 			if (res)
116b29b4195SJens Wiklander 				goto out;
117b29b4195SJens Wiklander 		}
118b29b4195SJens Wiklander 	}
119b29b4195SJens Wiklander 
120b29b4195SJens Wiklander 	params[1].value.a = idx >> 32;
121b29b4195SJens Wiklander 	params[1].value.b = idx;
122b29b4195SJens Wiklander out:
123b29b4195SJens Wiklander 	TEE_CloseObject(h);
124b29b4195SJens Wiklander 	return res;
125b29b4195SJens Wiklander }
126b29b4195SJens Wiklander 
write_rb_idx(uint32_t pt,TEE_Param params[TEE_NUM_PARAMS])127b29b4195SJens Wiklander static TEE_Result write_rb_idx(uint32_t pt, TEE_Param params[TEE_NUM_PARAMS])
128b29b4195SJens Wiklander {
129b29b4195SJens Wiklander 	const uint32_t exp_pt = TEE_PARAM_TYPES(TEE_PARAM_TYPE_VALUE_INPUT,
130b29b4195SJens Wiklander 						TEE_PARAM_TYPE_VALUE_INPUT,
131b29b4195SJens Wiklander 						TEE_PARAM_TYPE_NONE,
132b29b4195SJens Wiklander 						TEE_PARAM_TYPE_NONE);
133b29b4195SJens Wiklander 	size_t slot_offset;
134b29b4195SJens Wiklander 	uint64_t widx;
135b29b4195SJens Wiklander 	uint64_t idx;
136*c7f1b4f7SJens Wiklander 	size_t count;
137b29b4195SJens Wiklander 	TEE_Result res;
138b29b4195SJens Wiklander 	TEE_ObjectHandle h;
139b29b4195SJens Wiklander 
140b29b4195SJens Wiklander 	if (pt != exp_pt)
141b29b4195SJens Wiklander 		return TEE_ERROR_BAD_PARAMETERS;
142b29b4195SJens Wiklander 
143b29b4195SJens Wiklander 	res = get_slot_offset(params[0].value.a, &slot_offset);
144b29b4195SJens Wiklander 	if (res)
145b29b4195SJens Wiklander 		return res;
146b29b4195SJens Wiklander 	widx = ((uint64_t)params[1].value.a << 32) | params[1].value.b;
147b29b4195SJens Wiklander 
148275d9d31SIgor Opaniuk 	res = open_rb_state(DEFAULT_LOCK_STATE, &h);
149b29b4195SJens Wiklander 	if (res)
150b29b4195SJens Wiklander 		return res;
151b29b4195SJens Wiklander 
152b29b4195SJens Wiklander 	res = TEE_SeekObjectData(h, slot_offset, TEE_DATA_SEEK_SET);
153b29b4195SJens Wiklander 	if (res)
154b29b4195SJens Wiklander 		goto out;
155b29b4195SJens Wiklander 
156b29b4195SJens Wiklander 	res =  TEE_ReadObjectData(h, &idx, sizeof(idx), &count);
157b29b4195SJens Wiklander 	if (res)
158b29b4195SJens Wiklander 		goto out;
159b29b4195SJens Wiklander 	if (count != sizeof(idx))
160b29b4195SJens Wiklander 		idx = 0; /* Not yet written slots are reported as 0 */
161b29b4195SJens Wiklander 
162b29b4195SJens Wiklander 	if (widx < idx) {
163b29b4195SJens Wiklander 		res = TEE_ERROR_SECURITY;
164b29b4195SJens Wiklander 		goto out;
165b29b4195SJens Wiklander 	}
166b29b4195SJens Wiklander 
167b29b4195SJens Wiklander 	res = TEE_SeekObjectData(h, slot_offset, TEE_DATA_SEEK_SET);
168b29b4195SJens Wiklander 	if (res)
169b29b4195SJens Wiklander 		goto out;
170b29b4195SJens Wiklander 
171b29b4195SJens Wiklander 	res = TEE_WriteObjectData(h, &widx, sizeof(widx));
172b29b4195SJens Wiklander out:
173b29b4195SJens Wiklander 	TEE_CloseObject(h);
174b29b4195SJens Wiklander 	return res;
175b29b4195SJens Wiklander }
176b29b4195SJens Wiklander 
read_lock_state(uint32_t pt,TEE_Param params[TEE_NUM_PARAMS])177b29b4195SJens Wiklander static TEE_Result read_lock_state(uint32_t pt, TEE_Param params[TEE_NUM_PARAMS])
178b29b4195SJens Wiklander {
179b29b4195SJens Wiklander 	const uint32_t exp_pt = TEE_PARAM_TYPES(TEE_PARAM_TYPE_VALUE_OUTPUT,
180b29b4195SJens Wiklander 						TEE_PARAM_TYPE_NONE,
181b29b4195SJens Wiklander 						TEE_PARAM_TYPE_NONE,
182b29b4195SJens Wiklander 						TEE_PARAM_TYPE_NONE);
183b29b4195SJens Wiklander 	uint32_t lock_state;
184*c7f1b4f7SJens Wiklander 	size_t count;
185b29b4195SJens Wiklander 	TEE_Result res;
186b29b4195SJens Wiklander 	TEE_ObjectHandle h;
187b29b4195SJens Wiklander 
188b29b4195SJens Wiklander 	if (pt != exp_pt)
189b29b4195SJens Wiklander 		return TEE_ERROR_BAD_PARAMETERS;
190b29b4195SJens Wiklander 
191275d9d31SIgor Opaniuk 	res = open_rb_state(DEFAULT_LOCK_STATE, &h);
192b29b4195SJens Wiklander 	if (res)
193b29b4195SJens Wiklander 		return res;
194b29b4195SJens Wiklander 
195b29b4195SJens Wiklander 	res =  TEE_ReadObjectData(h, &lock_state, sizeof(lock_state), &count);
196b29b4195SJens Wiklander 	if (res)
197b29b4195SJens Wiklander 		goto out;
198b29b4195SJens Wiklander 	if (count != sizeof(lock_state)) {
199b29b4195SJens Wiklander 		/*
200b29b4195SJens Wiklander 		 * Client need write the lock state to recover, this can
201b29b4195SJens Wiklander 		 * normally not happen.
202b29b4195SJens Wiklander 		 */
203b29b4195SJens Wiklander 		res = TEE_ERROR_CORRUPT_OBJECT;
204b29b4195SJens Wiklander 		goto out;
205b29b4195SJens Wiklander 	}
206b29b4195SJens Wiklander 
207b29b4195SJens Wiklander 	params[0].value.a = lock_state;
208b29b4195SJens Wiklander out:
209b29b4195SJens Wiklander 	TEE_CloseObject(h);
210b29b4195SJens Wiklander 	return res;
211b29b4195SJens Wiklander }
212b29b4195SJens Wiklander 
write_lock_state(uint32_t pt,TEE_Param params[TEE_NUM_PARAMS])213b29b4195SJens Wiklander static TEE_Result write_lock_state(uint32_t pt,
214b29b4195SJens Wiklander 				   TEE_Param params[TEE_NUM_PARAMS])
215b29b4195SJens Wiklander {
216b29b4195SJens Wiklander 	const uint32_t exp_pt = TEE_PARAM_TYPES(TEE_PARAM_TYPE_VALUE_INPUT,
217b29b4195SJens Wiklander 						TEE_PARAM_TYPE_NONE,
218b29b4195SJens Wiklander 						TEE_PARAM_TYPE_NONE,
219b29b4195SJens Wiklander 						TEE_PARAM_TYPE_NONE);
220b29b4195SJens Wiklander 	uint32_t wlock_state;
221b29b4195SJens Wiklander 	uint32_t lock_state;
222*c7f1b4f7SJens Wiklander 	size_t count;
223b29b4195SJens Wiklander 	TEE_Result res;
224b29b4195SJens Wiklander 	TEE_ObjectHandle h;
225b29b4195SJens Wiklander 
226b29b4195SJens Wiklander 	if (pt != exp_pt)
227b29b4195SJens Wiklander 		return TEE_ERROR_BAD_PARAMETERS;
228b29b4195SJens Wiklander 
229b29b4195SJens Wiklander 	wlock_state = params[0].value.a;
230b29b4195SJens Wiklander 
231275d9d31SIgor Opaniuk 	res = open_rb_state(wlock_state, &h);
232b29b4195SJens Wiklander 	if (res)
233b29b4195SJens Wiklander 		return res;
234b29b4195SJens Wiklander 
235b29b4195SJens Wiklander 	res =  TEE_ReadObjectData(h, &lock_state, sizeof(lock_state), &count);
236b29b4195SJens Wiklander 	if (res)
237b29b4195SJens Wiklander 		goto out;
238b29b4195SJens Wiklander 	if (count == sizeof(lock_state) && lock_state == wlock_state)
239b29b4195SJens Wiklander 		goto out;
240b29b4195SJens Wiklander 
2414dce38c2SIvan Khoronzhuk 	res = TEE_SeekObjectData(h, 0, TEE_DATA_SEEK_SET);
2424dce38c2SIvan Khoronzhuk 	if (res)
2434dce38c2SIvan Khoronzhuk 		goto out;
2444dce38c2SIvan Khoronzhuk 
2454dce38c2SIvan Khoronzhuk 	res = TEE_WriteObjectData(h, &wlock_state, sizeof(wlock_state));
246b29b4195SJens Wiklander out:
247b29b4195SJens Wiklander 	TEE_CloseObject(h);
248b29b4195SJens Wiklander 	return res;
249b29b4195SJens Wiklander }
250b29b4195SJens Wiklander 
write_persist_value(uint32_t pt,TEE_Param params[TEE_NUM_PARAMS])251275d9d31SIgor Opaniuk static TEE_Result write_persist_value(uint32_t pt,
252275d9d31SIgor Opaniuk 				      TEE_Param params[TEE_NUM_PARAMS])
253275d9d31SIgor Opaniuk {
254275d9d31SIgor Opaniuk 	const uint32_t exp_pt = TEE_PARAM_TYPES(TEE_PARAM_TYPE_MEMREF_INPUT,
255275d9d31SIgor Opaniuk 						TEE_PARAM_TYPE_MEMREF_INPUT,
256275d9d31SIgor Opaniuk 						TEE_PARAM_TYPE_NONE,
257275d9d31SIgor Opaniuk 						TEE_PARAM_TYPE_NONE);
258275d9d31SIgor Opaniuk 	const uint32_t flags = TEE_DATA_FLAG_ACCESS_READ |
259275d9d31SIgor Opaniuk 			       TEE_DATA_FLAG_ACCESS_WRITE |
260275d9d31SIgor Opaniuk 			       TEE_DATA_FLAG_OVERWRITE;
2619c3a1069SJens Wiklander 	char name_full[TEE_OBJECT_ID_MAX_LEN] = { };
2629c3a1069SJens Wiklander 	TEE_ObjectHandle h = TEE_HANDLE_NULL;
2639c3a1069SJens Wiklander 	TEE_Result res = TEE_SUCCESS;
2649c3a1069SJens Wiklander 	uint32_t name_full_sz = 0;
2659c3a1069SJens Wiklander 	uint32_t name_buf_sz = 0;
2669c3a1069SJens Wiklander 	uint32_t value_sz = 0;
2679c3a1069SJens Wiklander 	char *name_buf = NULL;
2689c3a1069SJens Wiklander 	char *value = NULL;
269275d9d31SIgor Opaniuk 
270275d9d31SIgor Opaniuk 	if (pt != exp_pt)
271275d9d31SIgor Opaniuk 		return TEE_ERROR_BAD_PARAMETERS;
272275d9d31SIgor Opaniuk 
2739c3a1069SJens Wiklander 	name_buf = params[0].memref.buffer;
2749c3a1069SJens Wiklander 	name_buf_sz = params[0].memref.size;
2759c3a1069SJens Wiklander 	value_sz = params[1].memref.size;
2769c3a1069SJens Wiklander 	value = TEE_Malloc(value_sz, 0);
277ddcd07a2SIgor Opaniuk 	if (!value)
278ddcd07a2SIgor Opaniuk 		return TEE_ERROR_OUT_OF_MEMORY;
279ddcd07a2SIgor Opaniuk 
280ddcd07a2SIgor Opaniuk 	TEE_MemMove(value, params[1].memref.buffer, value_sz);
281275d9d31SIgor Opaniuk 
282275d9d31SIgor Opaniuk 	res = get_named_object_name(name_buf, name_buf_sz,
283275d9d31SIgor Opaniuk 				    name_full, &name_full_sz);
284275d9d31SIgor Opaniuk 	if (res)
285ddcd07a2SIgor Opaniuk 		goto out;
286275d9d31SIgor Opaniuk 
287275d9d31SIgor Opaniuk 	res = TEE_CreatePersistentObject(storageid, name_full,
288275d9d31SIgor Opaniuk 					 name_full_sz,
289275d9d31SIgor Opaniuk 					 flags, NULL, value,
290275d9d31SIgor Opaniuk 					 value_sz, &h);
291275d9d31SIgor Opaniuk 	if (res)
292275d9d31SIgor Opaniuk 		EMSG("Can't create named object value, res = 0x%x", res);
293275d9d31SIgor Opaniuk 
294275d9d31SIgor Opaniuk 	TEE_CloseObject(h);
295ddcd07a2SIgor Opaniuk out:
296ddcd07a2SIgor Opaniuk 	TEE_Free(value);
297275d9d31SIgor Opaniuk 
298275d9d31SIgor Opaniuk 	return res;
299275d9d31SIgor Opaniuk }
300275d9d31SIgor Opaniuk 
read_persist_value(uint32_t pt,TEE_Param params[TEE_NUM_PARAMS])301275d9d31SIgor Opaniuk static TEE_Result read_persist_value(uint32_t pt,
302275d9d31SIgor Opaniuk 				      TEE_Param params[TEE_NUM_PARAMS])
303275d9d31SIgor Opaniuk {
304275d9d31SIgor Opaniuk 	const uint32_t exp_pt = TEE_PARAM_TYPES(TEE_PARAM_TYPE_MEMREF_INPUT,
305275d9d31SIgor Opaniuk 						TEE_PARAM_TYPE_MEMREF_INOUT,
306275d9d31SIgor Opaniuk 						TEE_PARAM_TYPE_NONE,
307275d9d31SIgor Opaniuk 						TEE_PARAM_TYPE_NONE);
308275d9d31SIgor Opaniuk 	uint32_t flags = TEE_DATA_FLAG_ACCESS_READ |
309275d9d31SIgor Opaniuk 			 TEE_DATA_FLAG_ACCESS_WRITE;
3109c3a1069SJens Wiklander 	TEE_Result res = TEE_SUCCESS;
3119c3a1069SJens Wiklander 	TEE_ObjectHandle h = TEE_HANDLE_NULL;
312275d9d31SIgor Opaniuk 	char name_full[TEE_OBJECT_ID_MAX_LEN];
3139c3a1069SJens Wiklander 	uint32_t name_full_sz = 0;
3149c3a1069SJens Wiklander 	uint32_t name_buf_sz = 0;
3159c3a1069SJens Wiklander 	char *name_buf = NULL;
3169c3a1069SJens Wiklander 	uint32_t value_sz = 0;
3179c3a1069SJens Wiklander 	char *value = NULL;
318*c7f1b4f7SJens Wiklander 	size_t count = 0;
319275d9d31SIgor Opaniuk 
320275d9d31SIgor Opaniuk 	if (pt != exp_pt)
321275d9d31SIgor Opaniuk 		return TEE_ERROR_BAD_PARAMETERS;
322275d9d31SIgor Opaniuk 
3239c3a1069SJens Wiklander 	name_buf = params[0].memref.buffer;
3249c3a1069SJens Wiklander 	name_buf_sz = params[0].memref.size;
3259c3a1069SJens Wiklander 	value_sz = params[1].memref.size;
3269c3a1069SJens Wiklander 	value = TEE_Malloc(value_sz, 0);
327ddcd07a2SIgor Opaniuk 	if (!value)
328ddcd07a2SIgor Opaniuk 		return TEE_ERROR_OUT_OF_MEMORY;
329275d9d31SIgor Opaniuk 
330275d9d31SIgor Opaniuk 	res = get_named_object_name(name_buf, name_buf_sz,
331275d9d31SIgor Opaniuk 				    name_full, &name_full_sz);
332275d9d31SIgor Opaniuk 	if (res)
333ddcd07a2SIgor Opaniuk 		goto out_free;
334275d9d31SIgor Opaniuk 
335275d9d31SIgor Opaniuk 	res = TEE_OpenPersistentObject(storageid, name_full,
336275d9d31SIgor Opaniuk 				       name_full_sz, flags, &h);
337275d9d31SIgor Opaniuk 	if (res) {
338275d9d31SIgor Opaniuk 		EMSG("Can't open named object value, res = 0x%x", res);
339ddcd07a2SIgor Opaniuk 		goto out_free;
340275d9d31SIgor Opaniuk 	}
341275d9d31SIgor Opaniuk 
342275d9d31SIgor Opaniuk 	res =  TEE_ReadObjectData(h, value, value_sz, &count);
343275d9d31SIgor Opaniuk 	if (res) {
344275d9d31SIgor Opaniuk 		EMSG("Can't read named object value, res = 0x%x", res);
345275d9d31SIgor Opaniuk 		goto out;
346275d9d31SIgor Opaniuk 	}
347275d9d31SIgor Opaniuk 
348ddcd07a2SIgor Opaniuk 	TEE_MemMove(params[1].memref.buffer, value,
349ddcd07a2SIgor Opaniuk 		    value_sz);
350ddcd07a2SIgor Opaniuk 
351275d9d31SIgor Opaniuk 	params[1].memref.size = count;
352275d9d31SIgor Opaniuk out:
353275d9d31SIgor Opaniuk 	TEE_CloseObject(h);
354ddcd07a2SIgor Opaniuk out_free:
355ddcd07a2SIgor Opaniuk 	TEE_Free(value);
356275d9d31SIgor Opaniuk 
357275d9d31SIgor Opaniuk 	return res;
358275d9d31SIgor Opaniuk }
359275d9d31SIgor Opaniuk 
TA_CreateEntryPoint(void)360b29b4195SJens Wiklander TEE_Result TA_CreateEntryPoint(void)
361b29b4195SJens Wiklander {
362b29b4195SJens Wiklander 	return TEE_SUCCESS;
363b29b4195SJens Wiklander }
364b29b4195SJens Wiklander 
TA_DestroyEntryPoint(void)365b29b4195SJens Wiklander void TA_DestroyEntryPoint(void)
366b29b4195SJens Wiklander {
367b29b4195SJens Wiklander }
368b29b4195SJens Wiklander 
TA_OpenSessionEntryPoint(uint32_t pt __unused,TEE_Param params[4]__unused,void ** session __unused)369b29b4195SJens Wiklander TEE_Result TA_OpenSessionEntryPoint(uint32_t pt __unused,
370b29b4195SJens Wiklander 				    TEE_Param params[4] __unused,
371b29b4195SJens Wiklander 				    void **session __unused)
372b29b4195SJens Wiklander {
373b29b4195SJens Wiklander 	return TEE_SUCCESS;
374b29b4195SJens Wiklander }
375b29b4195SJens Wiklander 
TA_CloseSessionEntryPoint(void * sess __unused)376b29b4195SJens Wiklander void TA_CloseSessionEntryPoint(void *sess __unused)
377b29b4195SJens Wiklander {
378b29b4195SJens Wiklander }
379b29b4195SJens Wiklander 
TA_InvokeCommandEntryPoint(void * sess __unused,uint32_t cmd,uint32_t pt,TEE_Param params[TEE_NUM_PARAMS])380b29b4195SJens Wiklander TEE_Result TA_InvokeCommandEntryPoint(void *sess __unused, uint32_t cmd,
381b29b4195SJens Wiklander 				      uint32_t pt,
382b29b4195SJens Wiklander 				      TEE_Param params[TEE_NUM_PARAMS])
383b29b4195SJens Wiklander {
384b29b4195SJens Wiklander 	switch (cmd) {
385b29b4195SJens Wiklander 	case TA_AVB_CMD_READ_ROLLBACK_INDEX:
386b29b4195SJens Wiklander 		return read_rb_idx(pt, params);
387b29b4195SJens Wiklander 	case TA_AVB_CMD_WRITE_ROLLBACK_INDEX:
388b29b4195SJens Wiklander 		return write_rb_idx(pt, params);
389b29b4195SJens Wiklander 	case TA_AVB_CMD_READ_LOCK_STATE:
390b29b4195SJens Wiklander 		return read_lock_state(pt, params);
391b29b4195SJens Wiklander 	case TA_AVB_CMD_WRITE_LOCK_STATE:
392b29b4195SJens Wiklander 		return write_lock_state(pt, params);
393275d9d31SIgor Opaniuk 	case TA_AVB_CMD_READ_PERSIST_VALUE:
394275d9d31SIgor Opaniuk 		return read_persist_value(pt, params);
395275d9d31SIgor Opaniuk 	case TA_AVB_CMD_WRITE_PERSIST_VALUE:
396275d9d31SIgor Opaniuk 		return write_persist_value(pt, params);
397b29b4195SJens Wiklander 	default:
398b29b4195SJens Wiklander 		EMSG("Command ID 0x%x is not supported", cmd);
399b29b4195SJens Wiklander 		return TEE_ERROR_NOT_SUPPORTED;
400b29b4195SJens Wiklander 	}
401b29b4195SJens Wiklander }
402