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