xref: /optee_os/core/tee/tee_obj.c (revision 89c9728d981ff0f4a8edecc325858537441d721e)
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