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 <trace.h>
14b0104773SPascal Brand
tee_obj_add(struct user_ta_ctx * utc,struct tee_obj * o)158684fde8SJens Wiklander void tee_obj_add(struct user_ta_ctx *utc, struct tee_obj *o)
16b0104773SPascal Brand {
178684fde8SJens Wiklander TAILQ_INSERT_TAIL(&utc->objects, o, link);
18b0104773SPascal Brand }
19b0104773SPascal Brand
tee_obj_get(struct user_ta_ctx * utc,vaddr_t obj_id,struct tee_obj ** obj)20589a4941SJerome Forissier TEE_Result tee_obj_get(struct user_ta_ctx *utc, vaddr_t obj_id,
21b0104773SPascal Brand struct tee_obj **obj)
22b0104773SPascal Brand {
23b0104773SPascal Brand struct tee_obj *o;
24b0104773SPascal Brand
258684fde8SJens Wiklander TAILQ_FOREACH(o, &utc->objects, link) {
2661ea19fdSJens Wiklander if (obj_id == (vaddr_t)o) {
27b0104773SPascal Brand *obj = o;
28b0104773SPascal Brand return TEE_SUCCESS;
29b0104773SPascal Brand }
30b0104773SPascal Brand }
316c276b08SJens Wiklander return TEE_ERROR_BAD_STATE;
32b0104773SPascal Brand }
33b0104773SPascal Brand
tee_obj_close(struct user_ta_ctx * utc,struct tee_obj * o)348684fde8SJens Wiklander void tee_obj_close(struct user_ta_ctx *utc, struct tee_obj *o)
35b0104773SPascal Brand {
368684fde8SJens Wiklander TAILQ_REMOVE(&utc->objects, o, link);
37b0104773SPascal Brand
38894b41abSJens Wiklander if ((o->info.handleFlags & TEE_HANDLE_FLAG_PERSISTENT)) {
39b0311ad8SJens Wiklander o->pobj->fops->close(&o->fh);
40b0104773SPascal Brand tee_pobj_release(o->pobj);
41b0104773SPascal Brand }
42b0104773SPascal Brand
4340a4fd66SJens Wiklander tee_obj_free(o);
44b0104773SPascal Brand }
45b0104773SPascal Brand
tee_obj_close_all(struct user_ta_ctx * utc)468684fde8SJens Wiklander void tee_obj_close_all(struct user_ta_ctx *utc)
47b0104773SPascal Brand {
488684fde8SJens Wiklander struct tee_obj_head *objects = &utc->objects;
49b0104773SPascal Brand
50b0104773SPascal Brand while (!TAILQ_EMPTY(objects))
518684fde8SJens Wiklander tee_obj_close(utc, TAILQ_FIRST(objects));
52b0104773SPascal Brand }
53a2e9a830SCedric Chaumont
tee_obj_verify(struct tee_ta_session * sess,struct tee_obj * o)54a2e9a830SCedric Chaumont TEE_Result tee_obj_verify(struct tee_ta_session *sess, struct tee_obj *o)
55a2e9a830SCedric Chaumont {
56a2e9a830SCedric Chaumont TEE_Result res;
57b44708c1SJerome Forissier const struct tee_file_operations *fops = o->pobj->fops;
58b0311ad8SJens Wiklander struct tee_file_handle *fh = NULL;
59b44708c1SJerome Forissier
60b44708c1SJerome Forissier if (!fops)
61b44708c1SJerome Forissier return TEE_ERROR_STORAGE_NOT_AVAILABLE;
62a2e9a830SCedric Chaumont
63d5fe340fSJens Wiklander res = fops->open(o->pobj, NULL, &fh);
64a2e9a830SCedric Chaumont if (res == TEE_ERROR_CORRUPT_OBJECT) {
6565fe41dbSEtienne Carriere EMSG("Object corrupt");
66b2215adfSJens Wiklander fops->remove(o->pobj);
6700b3b9a2SJens Wiklander tee_obj_close(to_user_ta_ctx(sess->ts_sess.ctx), o);
68a2e9a830SCedric Chaumont }
69a2e9a830SCedric Chaumont
70b0311ad8SJens Wiklander fops->close(&fh);
71a2e9a830SCedric Chaumont return res;
72a2e9a830SCedric Chaumont }
7340a4fd66SJens Wiklander
tee_obj_alloc(void)7440a4fd66SJens Wiklander struct tee_obj *tee_obj_alloc(void)
7540a4fd66SJens Wiklander {
76b0311ad8SJens Wiklander return calloc(1, sizeof(struct tee_obj));
7740a4fd66SJens Wiklander }
7840a4fd66SJens Wiklander
tee_obj_free(struct tee_obj * o)7940a4fd66SJens Wiklander void tee_obj_free(struct tee_obj *o)
8040a4fd66SJens Wiklander {
8140a4fd66SJens Wiklander if (o) {
8240a4fd66SJens Wiklander tee_obj_attr_free(o);
8340a4fd66SJens Wiklander free(o->attr);
8440a4fd66SJens Wiklander free(o);
8540a4fd66SJens Wiklander }
8640a4fd66SJens Wiklander }
87