100b3b9a2SJens Wiklander /* SPDX-License-Identifier: BSD-2-Clause */ 200b3b9a2SJens Wiklander /* 300b3b9a2SJens Wiklander * Copyright (c) 2014, STMicroelectronics International N.V. 400b3b9a2SJens Wiklander * Copyright (c) 2017-2020, Linaro Limited 536bb435fSBalint Dobszay * Copyright (c) 2020, Arm Limited 600b3b9a2SJens Wiklander */ 700b3b9a2SJens Wiklander 800b3b9a2SJens Wiklander #ifndef __KERNEL_TS_MANAGER_H 900b3b9a2SJens Wiklander #define __KERNEL_TS_MANAGER_H 1000b3b9a2SJens Wiklander 1100b3b9a2SJens Wiklander #include <sys/queue.h> 123560d990SJens Wiklander #include <tee_api_types.h> 133560d990SJens Wiklander 143560d990SJens Wiklander struct ts_ctx { 153560d990SJens Wiklander TEE_UUID uuid; 16ab242291SJens Wiklander const struct ts_ops *ops; 173560d990SJens Wiklander }; 1800b3b9a2SJens Wiklander 19ab5363c6SJens Wiklander struct thread_scall_regs; 2000b3b9a2SJens Wiklander struct ts_session { 2100b3b9a2SJens Wiklander TAILQ_ENTRY(ts_session) link_tsd; 223560d990SJens Wiklander struct ts_ctx *ctx; /* Generic TS context */ 2300b3b9a2SJens Wiklander #if defined(CFG_TA_GPROF_SUPPORT) 2400b3b9a2SJens Wiklander struct sample_buf *sbuf; /* Profiling data (PC sampling) */ 2500b3b9a2SJens Wiklander #endif 2600b3b9a2SJens Wiklander #if defined(CFG_FTRACE_SUPPORT) 2700b3b9a2SJens Wiklander struct ftrace_buf *fbuf; /* ftrace buffer */ 2800b3b9a2SJens Wiklander #endif 2936bb435fSBalint Dobszay /* 3036bb435fSBalint Dobszay * Used by PTAs to store session specific information, or used by ldelf 3136bb435fSBalint Dobszay * syscalls to store handlers of opened TA/SP binaries. 3236bb435fSBalint Dobszay */ 3336bb435fSBalint Dobszay void *user_ctx; 34ab5363c6SJens Wiklander bool (*handle_scall)(struct thread_scall_regs *regs); 3500b3b9a2SJens Wiklander }; 3600b3b9a2SJens Wiklander 37f802ab52SJens Wiklander enum ts_gprof_status { 38f802ab52SJens Wiklander TS_GPROF_SUSPEND, 39f802ab52SJens Wiklander TS_GPROF_RESUME, 40f802ab52SJens Wiklander }; 41f802ab52SJens Wiklander 42*5a5d1173SJens Wiklander /* 43*5a5d1173SJens Wiklander * struct ts_ops - Trusted Service operations 44*5a5d1173SJens Wiklander * The operations below are called when: 45*5a5d1173SJens Wiklander * @enter_open_session(): opening a session to the service 46*5a5d1173SJens Wiklander * @enter_invoke_cmd(): invoking a command in the service 47*5a5d1173SJens Wiklander * @enter_close_session(): closing a session to the service 48*5a5d1173SJens Wiklander * @dump_mem_stats(): dumping heap state of the service 49*5a5d1173SJens Wiklander * @dump_state(): dumping active memory mappings 50*5a5d1173SJens Wiklander * @dump_ftrace(): dumping the ftrace data via RPC 51*5a5d1173SJens Wiklander * @release_state(): the service has panicked and as much state 52*5a5d1173SJens Wiklander * as possible need to be released 53*5a5d1173SJens Wiklander * @destroy(): freeing the struct ts_ctx removing all 54*5a5d1173SJens Wiklander * trace of the service 55*5a5d1173SJens Wiklander * @get_instance_id(): a unique ID of the service is needed 56*5a5d1173SJens Wiklander * @handle_scall(): handling a syscall from the service 57*5a5d1173SJens Wiklander * @gprof_set_status(): updating the gprof status of the service 58*5a5d1173SJens Wiklander */ 59ab242291SJens Wiklander struct ts_ops { 6082061b8dSJens Wiklander TEE_Result (*enter_open_session)(struct ts_session *s); 6182061b8dSJens Wiklander TEE_Result (*enter_invoke_cmd)(struct ts_session *s, uint32_t cmd); 62ab242291SJens Wiklander void (*enter_close_session)(struct ts_session *s); 63cb94c145SWeizhao Jiang #if defined(CFG_TA_STATS) 64cb94c145SWeizhao Jiang TEE_Result (*dump_mem_stats)(struct ts_session *s); 65cb94c145SWeizhao Jiang #endif 66ab242291SJens Wiklander void (*dump_state)(struct ts_ctx *ctx); 67ab242291SJens Wiklander void (*dump_ftrace)(struct ts_ctx *ctx); 68*5a5d1173SJens Wiklander void (*release_state)(struct ts_ctx *ctx); 69ab242291SJens Wiklander void (*destroy)(struct ts_ctx *ctx); 70ab242291SJens Wiklander uint32_t (*get_instance_id)(struct ts_ctx *ctx); 71ab5363c6SJens Wiklander bool (*handle_scall)(struct thread_scall_regs *regs); 72f802ab52SJens Wiklander #ifdef CFG_TA_GPROF_SUPPORT 73f802ab52SJens Wiklander void (*gprof_set_status)(enum ts_gprof_status status); 74f802ab52SJens Wiklander #endif 75ab242291SJens Wiklander }; 76ab242291SJens Wiklander 7700b3b9a2SJens Wiklander struct ts_session *ts_get_current_session(void); 7800b3b9a2SJens Wiklander struct ts_session *ts_get_current_session_may_fail(void); 7900b3b9a2SJens Wiklander 8000b3b9a2SJens Wiklander void ts_push_current_session(struct ts_session *sess); 8100b3b9a2SJens Wiklander struct ts_session *ts_pop_current_session(void); 8200b3b9a2SJens Wiklander struct ts_session *ts_get_calling_session(void); 8300b3b9a2SJens Wiklander 8400b3b9a2SJens Wiklander #endif /*__KERNEL_TS_MANAGER_H*/ 85