xref: /optee_os/core/include/kernel/thread_private.h (revision 91d4649de98c6beeb8217d40f1fafa50720fe785)
1bd6c9770SJens Wiklander /* SPDX-License-Identifier: BSD-2-Clause */
2bd6c9770SJens Wiklander /*
3bd6c9770SJens Wiklander  * Copyright (c) 2016, Linaro Limited
4bd6c9770SJens Wiklander  * Copyright (c) 2014, STMicroelectronics International N.V.
5bd6c9770SJens Wiklander  */
6bd6c9770SJens Wiklander 
7bd6c9770SJens Wiklander #ifndef __KERNEL_THREAD_PRIVATE_H
8bd6c9770SJens Wiklander #define __KERNEL_THREAD_PRIVATE_H
9bd6c9770SJens Wiklander 
10bd6c9770SJens Wiklander #include <util.h>
11bd6c9770SJens Wiklander #ifndef __ASSEMBLER__
12bd6c9770SJens Wiklander 
13bd6c9770SJens Wiklander #include <kernel/mutex.h>
14bd6c9770SJens Wiklander #include <kernel/thread.h>
15bd6c9770SJens Wiklander #include <kernel/thread_private_arch.h>
16bd6c9770SJens Wiklander #include <mm/core_mmu.h>
17bd6c9770SJens Wiklander #include <mm/pgt_cache.h>
18bd6c9770SJens Wiklander 
19bd6c9770SJens Wiklander enum thread_state {
20bd6c9770SJens Wiklander 	THREAD_STATE_FREE,
21bd6c9770SJens Wiklander 	THREAD_STATE_SUSPENDED,
22bd6c9770SJens Wiklander 	THREAD_STATE_ACTIVE,
23bd6c9770SJens Wiklander };
24bd6c9770SJens Wiklander 
25bd6c9770SJens Wiklander struct thread_shm_cache_entry {
26bd6c9770SJens Wiklander 	struct mobj *mobj;
27bd6c9770SJens Wiklander 	size_t size;
28bd6c9770SJens Wiklander 	enum thread_shm_type type;
29bd6c9770SJens Wiklander 	enum thread_shm_cache_user user;
30bd6c9770SJens Wiklander 	SLIST_ENTRY(thread_shm_cache_entry) link;
31bd6c9770SJens Wiklander };
32bd6c9770SJens Wiklander 
33bd6c9770SJens Wiklander SLIST_HEAD(thread_shm_cache, thread_shm_cache_entry);
34bd6c9770SJens Wiklander 
35bd6c9770SJens Wiklander struct thread_ctx {
36bd6c9770SJens Wiklander 	struct thread_ctx_regs regs;
37bd6c9770SJens Wiklander 	enum thread_state state;
38bd6c9770SJens Wiklander 	vaddr_t stack_va_end;
39bd6c9770SJens Wiklander 	uint32_t flags;
40bd6c9770SJens Wiklander 	struct core_mmu_user_map user_map;
41bd6c9770SJens Wiklander 	bool have_user_map;
4269e63e33SAlvin Chang #if defined(ARM64) || defined(RV64)
43bd6c9770SJens Wiklander 	vaddr_t kern_sp;	/* Saved kernel SP during user TA execution */
44bd6c9770SJens Wiklander #endif
4593dc6b29SJens Wiklander #ifdef CFG_CORE_PAUTH
4693dc6b29SJens Wiklander 	struct thread_pauth_keys keys;
4793dc6b29SJens Wiklander #endif
48bd6c9770SJens Wiklander #ifdef CFG_WITH_VFP
49bd6c9770SJens Wiklander 	struct thread_vfp_state vfp_state;
50bd6c9770SJens Wiklander #endif
51bd6c9770SJens Wiklander 	void *rpc_arg;
52bd6c9770SJens Wiklander 	struct mobj *rpc_mobj;
53bd6c9770SJens Wiklander 	struct thread_shm_cache shm_cache;
54bd6c9770SJens Wiklander 	struct thread_specific_data tsd;
55bd6c9770SJens Wiklander };
56bd6c9770SJens Wiklander #endif /*__ASSEMBLER__*/
57bd6c9770SJens Wiklander 
58bd6c9770SJens Wiklander /* Describes the flags field of struct thread_core_local */
59bd6c9770SJens Wiklander #define THREAD_CLF_SAVED_SHIFT			4
60bd6c9770SJens Wiklander #define THREAD_CLF_CURR_SHIFT			0
61bd6c9770SJens Wiklander #define THREAD_CLF_MASK				0xf
62bd6c9770SJens Wiklander #define THREAD_CLF_TMP_SHIFT			0
63bd6c9770SJens Wiklander #define THREAD_CLF_ABORT_SHIFT			1
64bd6c9770SJens Wiklander #define THREAD_CLF_IRQ_SHIFT			2
65bd6c9770SJens Wiklander #define THREAD_CLF_FIQ_SHIFT			3
66bd6c9770SJens Wiklander 
67bd6c9770SJens Wiklander #define THREAD_CLF_TMP				BIT(THREAD_CLF_TMP_SHIFT)
68bd6c9770SJens Wiklander #define THREAD_CLF_ABORT			BIT(THREAD_CLF_ABORT_SHIFT)
69bd6c9770SJens Wiklander #define THREAD_CLF_IRQ				BIT(THREAD_CLF_IRQ_SHIFT)
70bd6c9770SJens Wiklander #define THREAD_CLF_FIQ				BIT(THREAD_CLF_FIQ_SHIFT)
71bd6c9770SJens Wiklander 
72bd6c9770SJens Wiklander #ifndef __ASSEMBLER__
73bd6c9770SJens Wiklander extern const void *stack_tmp_export;
74bd6c9770SJens Wiklander extern const uint32_t stack_tmp_stride;
75*91d4649dSJens Wiklander extern struct thread_ctx *threads;
76*91d4649dSJens Wiklander extern size_t thread_count;
77a4c2e0cbSJens Wiklander extern struct thread_core_local *thread_core_local;
78a4c2e0cbSJens Wiklander extern unsigned long thread_core_local_pa;
79a4c2e0cbSJens Wiklander extern size_t thread_core_count;
8059724f22SJens Wiklander extern struct thread_core_local *__thread_core_local_new;
8159724f22SJens Wiklander extern size_t __thread_core_count_new;
82bd6c9770SJens Wiklander 
83528dabb2SJerome Forissier #ifdef CFG_WITH_STACK_CANARIES
84528dabb2SJerome Forissier #define STACK_CANARY_SIZE	(4 * sizeof(long))
85528dabb2SJerome Forissier #else
86528dabb2SJerome Forissier #define STACK_CANARY_SIZE	0
87528dabb2SJerome Forissier #endif
88528dabb2SJerome Forissier 
89bd6c9770SJens Wiklander /* Checks stack canaries */
90bd6c9770SJens Wiklander void thread_check_canaries(void);
91bd6c9770SJens Wiklander 
92bd6c9770SJens Wiklander void thread_lock_global(void);
93bd6c9770SJens Wiklander void thread_unlock_global(void);
94bd6c9770SJens Wiklander 
95bd6c9770SJens Wiklander /* Frees the cache of allocated FS RPC memory */
96bd6c9770SJens Wiklander void thread_rpc_shm_cache_clear(struct thread_shm_cache *cache);
97bd6c9770SJens Wiklander #endif /*__ASSEMBLER__*/
98bd6c9770SJens Wiklander #endif /*__KERNEL_THREAD_PRIVATE_H*/
99