/* SPDX-License-Identifier: BSD-2-Clause */ /* * Copyright (c) 2014, STMicroelectronics International N.V. * Copyright (c) 2017-2020, Linaro Limited * Copyright (c) 2020, Arm Limited */ #ifndef __KERNEL_TS_MANAGER_H #define __KERNEL_TS_MANAGER_H #include #include struct ts_ctx { TEE_UUID uuid; const struct ts_ops *ops; }; struct thread_scall_regs; struct ts_session { TAILQ_ENTRY(ts_session) link_tsd; struct ts_ctx *ctx; /* Generic TS context */ #if defined(CFG_TA_GPROF_SUPPORT) struct sample_buf *sbuf; /* Profiling data (PC sampling) */ #endif #if defined(CFG_FTRACE_SUPPORT) struct ftrace_buf *fbuf; /* ftrace buffer */ #endif /* * Used by PTAs to store session specific information, or used by ldelf * syscalls to store handlers of opened TA/SP binaries. */ void *user_ctx; bool (*handle_scall)(struct thread_scall_regs *regs); }; enum ts_gprof_status { TS_GPROF_SUSPEND, TS_GPROF_RESUME, }; /* * struct ts_ops - Trusted Service operations * The operations below are called when: * @enter_open_session(): opening a session to the service * @enter_invoke_cmd(): invoking a command in the service * @enter_close_session(): closing a session to the service * @dump_mem_stats(): dumping heap state of the service * @dump_state(): dumping active memory mappings * @dump_ftrace(): dumping the ftrace data via RPC * @release_state(): the service has panicked and as much state * as possible need to be released * @destroy(): freeing the struct ts_ctx removing all * trace of the service * @get_instance_id(): a unique ID of the service is needed * @handle_scall(): handling a syscall from the service * @gprof_set_status(): updating the gprof status of the service */ struct ts_ops { TEE_Result (*enter_open_session)(struct ts_session *s); TEE_Result (*enter_invoke_cmd)(struct ts_session *s, uint32_t cmd); void (*enter_close_session)(struct ts_session *s); #if defined(CFG_TA_STATS) TEE_Result (*dump_mem_stats)(struct ts_session *s); #endif void (*dump_state)(struct ts_ctx *ctx); void (*dump_ftrace)(struct ts_ctx *ctx); void (*release_state)(struct ts_ctx *ctx); void (*destroy)(struct ts_ctx *ctx); uint32_t (*get_instance_id)(struct ts_ctx *ctx); bool (*handle_scall)(struct thread_scall_regs *regs); #ifdef CFG_TA_GPROF_SUPPORT void (*gprof_set_status)(enum ts_gprof_status status); #endif }; struct ts_session *ts_get_current_session(void); struct ts_session *ts_get_current_session_may_fail(void); void ts_push_current_session(struct ts_session *sess); struct ts_session *ts_pop_current_session(void); struct ts_session *ts_get_calling_session(void); #endif /*__KERNEL_TS_MANAGER_H*/