1390cb5e2SMarouene Boubakri /* SPDX-License-Identifier: BSD-2-Clause */
2390cb5e2SMarouene Boubakri /*
3390cb5e2SMarouene Boubakri * Copyright (c) 2015, Linaro Limited
4390cb5e2SMarouene Boubakri * Copyright (c) 2020, Arm Limited
5390cb5e2SMarouene Boubakri */
6d50fee03SEtienne Carriere #ifndef __KERNEL_USER_TA_H
7d50fee03SEtienne Carriere #define __KERNEL_USER_TA_H
8390cb5e2SMarouene Boubakri
9390cb5e2SMarouene Boubakri #include <assert.h>
10390cb5e2SMarouene Boubakri #include <kernel/tee_ta_manager.h>
11390cb5e2SMarouene Boubakri #include <kernel/user_mode_ctx_struct.h>
12390cb5e2SMarouene Boubakri #include <kernel/thread.h>
13390cb5e2SMarouene Boubakri #include <mm/file.h>
14390cb5e2SMarouene Boubakri #include <mm/tee_mm.h>
15390cb5e2SMarouene Boubakri #include <scattered_array.h>
16390cb5e2SMarouene Boubakri #include <tee_api_types.h>
17390cb5e2SMarouene Boubakri #include <types_ext.h>
18390cb5e2SMarouene Boubakri #include <util.h>
19390cb5e2SMarouene Boubakri
20390cb5e2SMarouene Boubakri TAILQ_HEAD(tee_cryp_state_head, tee_cryp_state);
21390cb5e2SMarouene Boubakri TAILQ_HEAD(tee_obj_head, tee_obj);
22390cb5e2SMarouene Boubakri TAILQ_HEAD(tee_storage_enum_head, tee_storage_enum);
23390cb5e2SMarouene Boubakri SLIST_HEAD(load_seg_head, load_seg);
24390cb5e2SMarouene Boubakri
25390cb5e2SMarouene Boubakri /*
26390cb5e2SMarouene Boubakri * struct user_ta_ctx - user TA context
27390cb5e2SMarouene Boubakri * @open_sessions: List of sessions opened by this TA
28390cb5e2SMarouene Boubakri * @cryp_states: List of cryp states created by this TA
29390cb5e2SMarouene Boubakri * @objects: List of storage objects opened by this TA
30390cb5e2SMarouene Boubakri * @storage_enums: List of storage enumerators opened by this TA
31390cb5e2SMarouene Boubakri * @uctx: Generic user mode context
32390cb5e2SMarouene Boubakri * @ctx: Generic TA context
33390cb5e2SMarouene Boubakri */
34390cb5e2SMarouene Boubakri struct user_ta_ctx {
35390cb5e2SMarouene Boubakri struct tee_ta_session_head open_sessions;
36390cb5e2SMarouene Boubakri struct tee_cryp_state_head cryp_states;
37390cb5e2SMarouene Boubakri struct tee_obj_head objects;
38390cb5e2SMarouene Boubakri struct tee_storage_enum_head storage_enums;
39390cb5e2SMarouene Boubakri struct user_mode_ctx uctx;
40390cb5e2SMarouene Boubakri struct tee_ta_ctx ta_ctx;
41390cb5e2SMarouene Boubakri };
42390cb5e2SMarouene Boubakri
43390cb5e2SMarouene Boubakri #ifdef CFG_WITH_USER_TA
44390cb5e2SMarouene Boubakri bool is_user_ta_ctx(struct ts_ctx *ctx);
45390cb5e2SMarouene Boubakri #else
is_user_ta_ctx(struct ts_ctx * ctx __unused)460a75d408SJens Wiklander static inline bool __noprof is_user_ta_ctx(struct ts_ctx *ctx __unused)
47390cb5e2SMarouene Boubakri {
48390cb5e2SMarouene Boubakri return false;
49390cb5e2SMarouene Boubakri }
50390cb5e2SMarouene Boubakri #endif
51390cb5e2SMarouene Boubakri
to_user_ta_ctx(struct ts_ctx * ctx)52390cb5e2SMarouene Boubakri static inline struct user_ta_ctx *to_user_ta_ctx(struct ts_ctx *ctx)
53390cb5e2SMarouene Boubakri {
54390cb5e2SMarouene Boubakri assert(is_user_ta_ctx(ctx));
55390cb5e2SMarouene Boubakri return container_of(ctx, struct user_ta_ctx, ta_ctx.ts_ctx);
56390cb5e2SMarouene Boubakri }
57390cb5e2SMarouene Boubakri
58390cb5e2SMarouene Boubakri #ifdef CFG_WITH_USER_TA
59*956c2d50SEtienne Carriere /*
60*956c2d50SEtienne Carriere * Setup session context for a user TA
61*956c2d50SEtienne Carriere * @uuid: TA UUID
62*956c2d50SEtienne Carriere * @s: Session for which to setup a user TA context
63*956c2d50SEtienne Carriere *
64*956c2d50SEtienne Carriere * This function must be called with tee_ta_mutex locked.
65*956c2d50SEtienne Carriere */
66390cb5e2SMarouene Boubakri TEE_Result tee_ta_init_user_ta_session(const TEE_UUID *uuid,
67390cb5e2SMarouene Boubakri struct tee_ta_session *s);
68*956c2d50SEtienne Carriere
69*956c2d50SEtienne Carriere /*
70*956c2d50SEtienne Carriere * Finalize session context initialization for a user TA
71*956c2d50SEtienne Carriere * @sess: Session for which to finalize user TA context
72*956c2d50SEtienne Carriere */
73*956c2d50SEtienne Carriere TEE_Result tee_ta_complete_user_ta_session(struct tee_ta_session *s);
74390cb5e2SMarouene Boubakri #else
75*956c2d50SEtienne Carriere static inline TEE_Result
tee_ta_init_user_ta_session(const TEE_UUID * uuid __unused,struct tee_ta_session * s __unused)76*956c2d50SEtienne Carriere tee_ta_init_user_ta_session(const TEE_UUID *uuid __unused,
77390cb5e2SMarouene Boubakri struct tee_ta_session *s __unused)
78390cb5e2SMarouene Boubakri {
79390cb5e2SMarouene Boubakri return TEE_ERROR_ITEM_NOT_FOUND;
80390cb5e2SMarouene Boubakri }
81390cb5e2SMarouene Boubakri
82*956c2d50SEtienne Carriere static inline TEE_Result
tee_ta_complete_user_ta_session(struct tee_ta_session * s __unused)83*956c2d50SEtienne Carriere tee_ta_complete_user_ta_session(struct tee_ta_session *s __unused)
84*956c2d50SEtienne Carriere {
85*956c2d50SEtienne Carriere return TEE_ERROR_GENERIC;
86*956c2d50SEtienne Carriere }
87*956c2d50SEtienne Carriere #endif /*CFG_WITH_USER_TA*/
88d50fee03SEtienne Carriere #endif /*__KERNEL_USER_TA_H*/
89