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