11bb92983SJerome Forissier // SPDX-License-Identifier: BSD-2-Clause 2b0104773SPascal Brand /* 3b0104773SPascal Brand * Copyright (c) 2014, STMicroelectronics International N.V. 4b0104773SPascal Brand */ 5b0104773SPascal Brand 6b0104773SPascal Brand #include <tee/tee_obj.h> 7b0104773SPascal Brand 8b0104773SPascal Brand #include <stdlib.h> 9b0104773SPascal Brand #include <tee_api_defines.h> 10b0104773SPascal Brand #include <mm/tee_mmu.h> 11b0104773SPascal Brand #include <tee/tee_fs.h> 12b0104773SPascal Brand #include <tee/tee_pobj.h> 134de4bebcSJens Wiklander #include <trace.h> 14a2e9a830SCedric Chaumont #include <tee/tee_svc_storage.h> 1540a4fd66SJens Wiklander #include <tee/tee_svc_cryp.h> 16b0104773SPascal Brand 178684fde8SJens Wiklander void tee_obj_add(struct user_ta_ctx *utc, struct tee_obj *o) 18b0104773SPascal Brand { 198684fde8SJens Wiklander TAILQ_INSERT_TAIL(&utc->objects, o, link); 20b0104773SPascal Brand } 21b0104773SPascal Brand 22*589a4941SJerome Forissier TEE_Result tee_obj_get(struct user_ta_ctx *utc, vaddr_t obj_id, 23b0104773SPascal Brand struct tee_obj **obj) 24b0104773SPascal Brand { 25b0104773SPascal Brand struct tee_obj *o; 26b0104773SPascal Brand 278684fde8SJens Wiklander TAILQ_FOREACH(o, &utc->objects, link) { 2861ea19fdSJens Wiklander if (obj_id == (vaddr_t)o) { 29b0104773SPascal Brand *obj = o; 30b0104773SPascal Brand return TEE_SUCCESS; 31b0104773SPascal Brand } 32b0104773SPascal Brand } 336c276b08SJens Wiklander return TEE_ERROR_BAD_STATE; 34b0104773SPascal Brand } 35b0104773SPascal Brand 368684fde8SJens Wiklander void tee_obj_close(struct user_ta_ctx *utc, struct tee_obj *o) 37b0104773SPascal Brand { 388684fde8SJens Wiklander TAILQ_REMOVE(&utc->objects, o, link); 39b0104773SPascal Brand 40894b41abSJens Wiklander if ((o->info.handleFlags & TEE_HANDLE_FLAG_PERSISTENT)) { 41b0311ad8SJens Wiklander o->pobj->fops->close(&o->fh); 42b0104773SPascal Brand tee_pobj_release(o->pobj); 43b0104773SPascal Brand } 44b0104773SPascal Brand 4540a4fd66SJens Wiklander tee_obj_free(o); 46b0104773SPascal Brand } 47b0104773SPascal Brand 488684fde8SJens Wiklander void tee_obj_close_all(struct user_ta_ctx *utc) 49b0104773SPascal Brand { 508684fde8SJens Wiklander struct tee_obj_head *objects = &utc->objects; 51b0104773SPascal Brand 52b0104773SPascal Brand while (!TAILQ_EMPTY(objects)) 538684fde8SJens Wiklander tee_obj_close(utc, TAILQ_FIRST(objects)); 54b0104773SPascal Brand } 55a2e9a830SCedric Chaumont 56a2e9a830SCedric Chaumont TEE_Result tee_obj_verify(struct tee_ta_session *sess, struct tee_obj *o) 57a2e9a830SCedric Chaumont { 58a2e9a830SCedric Chaumont TEE_Result res; 59b44708c1SJerome Forissier const struct tee_file_operations *fops = o->pobj->fops; 60b0311ad8SJens Wiklander struct tee_file_handle *fh = NULL; 61b44708c1SJerome Forissier 62b44708c1SJerome Forissier if (!fops) 63b44708c1SJerome Forissier return TEE_ERROR_STORAGE_NOT_AVAILABLE; 64a2e9a830SCedric Chaumont 65d5fe340fSJens Wiklander res = fops->open(o->pobj, NULL, &fh); 66a2e9a830SCedric Chaumont if (res == TEE_ERROR_CORRUPT_OBJECT) { 6765fe41dbSEtienne Carriere EMSG("Object corrupt"); 68b2215adfSJens Wiklander fops->remove(o->pobj); 698684fde8SJens Wiklander tee_obj_close(to_user_ta_ctx(sess->ctx), o); 70a2e9a830SCedric Chaumont } 71a2e9a830SCedric Chaumont 72b0311ad8SJens Wiklander fops->close(&fh); 73a2e9a830SCedric Chaumont return res; 74a2e9a830SCedric Chaumont } 7540a4fd66SJens Wiklander 7640a4fd66SJens Wiklander struct tee_obj *tee_obj_alloc(void) 7740a4fd66SJens Wiklander { 78b0311ad8SJens Wiklander return calloc(1, sizeof(struct tee_obj)); 7940a4fd66SJens Wiklander } 8040a4fd66SJens Wiklander 8140a4fd66SJens Wiklander void tee_obj_free(struct tee_obj *o) 8240a4fd66SJens Wiklander { 8340a4fd66SJens Wiklander if (o) { 8440a4fd66SJens Wiklander tee_obj_attr_free(o); 8540a4fd66SJens Wiklander free(o->attr); 8640a4fd66SJens Wiklander free(o); 8740a4fd66SJens Wiklander } 8840a4fd66SJens Wiklander } 89