xref: /optee_os/core/include/kernel/ts_manager.h (revision 5a5d1173d9cec195cc8dec790c1343b5dfcc3d3c)
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