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