11bb92983SJerome Forissier // SPDX-License-Identifier: BSD-2-Clause 2b0104773SPascal Brand /* 3b0104773SPascal Brand * Copyright (c) 2014, STMicroelectronics International N.V. 4b0104773SPascal Brand */ 5b0104773SPascal Brand 6*89c9728dSJens Wiklander #include <mm/vm.h> 7b0104773SPascal Brand #include <stdlib.h> 8b0104773SPascal Brand #include <tee_api_defines.h> 9b0104773SPascal Brand #include <tee/tee_fs.h> 10*89c9728dSJens Wiklander #include <tee/tee_obj.h> 11b0104773SPascal Brand #include <tee/tee_pobj.h> 1240a4fd66SJens Wiklander #include <tee/tee_svc_cryp.h> 13*89c9728dSJens Wiklander #include <tee/tee_svc_storage.h> 14*89c9728dSJens Wiklander #include <trace.h> 15b0104773SPascal Brand 168684fde8SJens Wiklander void tee_obj_add(struct user_ta_ctx *utc, struct tee_obj *o) 17b0104773SPascal Brand { 188684fde8SJens Wiklander TAILQ_INSERT_TAIL(&utc->objects, o, link); 19b0104773SPascal Brand } 20b0104773SPascal Brand 21589a4941SJerome Forissier TEE_Result tee_obj_get(struct user_ta_ctx *utc, vaddr_t obj_id, 22b0104773SPascal Brand struct tee_obj **obj) 23b0104773SPascal Brand { 24b0104773SPascal Brand struct tee_obj *o; 25b0104773SPascal Brand 268684fde8SJens Wiklander TAILQ_FOREACH(o, &utc->objects, link) { 2761ea19fdSJens Wiklander if (obj_id == (vaddr_t)o) { 28b0104773SPascal Brand *obj = o; 29b0104773SPascal Brand return TEE_SUCCESS; 30b0104773SPascal Brand } 31b0104773SPascal Brand } 326c276b08SJens Wiklander return TEE_ERROR_BAD_STATE; 33b0104773SPascal Brand } 34b0104773SPascal Brand 358684fde8SJens Wiklander void tee_obj_close(struct user_ta_ctx *utc, struct tee_obj *o) 36b0104773SPascal Brand { 378684fde8SJens Wiklander TAILQ_REMOVE(&utc->objects, o, link); 38b0104773SPascal Brand 39894b41abSJens Wiklander if ((o->info.handleFlags & TEE_HANDLE_FLAG_PERSISTENT)) { 40b0311ad8SJens Wiklander o->pobj->fops->close(&o->fh); 41b0104773SPascal Brand tee_pobj_release(o->pobj); 42b0104773SPascal Brand } 43b0104773SPascal Brand 4440a4fd66SJens Wiklander tee_obj_free(o); 45b0104773SPascal Brand } 46b0104773SPascal Brand 478684fde8SJens Wiklander void tee_obj_close_all(struct user_ta_ctx *utc) 48b0104773SPascal Brand { 498684fde8SJens Wiklander struct tee_obj_head *objects = &utc->objects; 50b0104773SPascal Brand 51b0104773SPascal Brand while (!TAILQ_EMPTY(objects)) 528684fde8SJens Wiklander tee_obj_close(utc, TAILQ_FIRST(objects)); 53b0104773SPascal Brand } 54a2e9a830SCedric Chaumont 55a2e9a830SCedric Chaumont TEE_Result tee_obj_verify(struct tee_ta_session *sess, struct tee_obj *o) 56a2e9a830SCedric Chaumont { 57a2e9a830SCedric Chaumont TEE_Result res; 58b44708c1SJerome Forissier const struct tee_file_operations *fops = o->pobj->fops; 59b0311ad8SJens Wiklander struct tee_file_handle *fh = NULL; 60b44708c1SJerome Forissier 61b44708c1SJerome Forissier if (!fops) 62b44708c1SJerome Forissier return TEE_ERROR_STORAGE_NOT_AVAILABLE; 63a2e9a830SCedric Chaumont 64d5fe340fSJens Wiklander res = fops->open(o->pobj, NULL, &fh); 65a2e9a830SCedric Chaumont if (res == TEE_ERROR_CORRUPT_OBJECT) { 6665fe41dbSEtienne Carriere EMSG("Object corrupt"); 67b2215adfSJens Wiklander fops->remove(o->pobj); 6800b3b9a2SJens Wiklander tee_obj_close(to_user_ta_ctx(sess->ts_sess.ctx), o); 69a2e9a830SCedric Chaumont } 70a2e9a830SCedric Chaumont 71b0311ad8SJens Wiklander fops->close(&fh); 72a2e9a830SCedric Chaumont return res; 73a2e9a830SCedric Chaumont } 7440a4fd66SJens Wiklander 7540a4fd66SJens Wiklander struct tee_obj *tee_obj_alloc(void) 7640a4fd66SJens Wiklander { 77b0311ad8SJens Wiklander return calloc(1, sizeof(struct tee_obj)); 7840a4fd66SJens Wiklander } 7940a4fd66SJens Wiklander 8040a4fd66SJens Wiklander void tee_obj_free(struct tee_obj *o) 8140a4fd66SJens Wiklander { 8240a4fd66SJens Wiklander if (o) { 8340a4fd66SJens Wiklander tee_obj_attr_free(o); 8440a4fd66SJens Wiklander free(o->attr); 8540a4fd66SJens Wiklander free(o); 8640a4fd66SJens Wiklander } 8740a4fd66SJens Wiklander } 88