• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2015-2017, ARM Limited and Contributors. All rights reserved.
3  *
4  * SPDX-License-Identifier: BSD-3-Clause
5  */
6 
7 #ifndef __TLKD_PRIVATE_H__
8 #define __TLKD_PRIVATE_H__
9 
10 #include <arch.h>
11 #include <context.h>
12 #include <interrupt_mgmt.h>
13 #include <platform_def.h>
14 #include <psci.h>
15 
16 /*
17  * This flag is used by the TLKD to determine if the SP is servicing a yielding
18  * SMC request prior to programming the next entry into the SP e.g. if SP
19  * execution is preempted by a non-secure interrupt and handed control to the
20  * normal world. If another request which is distinct from what the SP was
21  * previously doing arrives, then this flag will be help the TLKD to either
22  * reject the new request or service it while ensuring that the previous context
23  * is not corrupted.
24  */
25 #define YIELD_SMC_ACTIVE_FLAG_SHIFT	2
26 #define YIELD_SMC_ACTIVE_FLAG_MASK	1
27 #define get_yield_smc_active_flag(state)				\
28 			(((state) >> YIELD_SMC_ACTIVE_FLAG_SHIFT)	\
29 			& YIELD_SMC_ACTIVE_FLAG_MASK)
30 #define set_yield_smc_active_flag(state)	((state) |=		\
31 					 (1 << YIELD_SMC_ACTIVE_FLAG_SHIFT))
32 #define clr_yield_smc_active_flag(state)	((state) &=		\
33 					 ~(YIELD_SMC_ACTIVE_FLAG_MASK	\
34 					 << YIELD_SMC_ACTIVE_FLAG_SHIFT))
35 
36 /*******************************************************************************
37  * Translate virtual address received from the NS world
38  ******************************************************************************/
39 #define TLK_TRANSLATE_NS_VADDR		4
40 
41 /*******************************************************************************
42  * Secure Payload execution state information i.e. aarch32 or aarch64
43  ******************************************************************************/
44 #define SP_AARCH32		MODE_RW_32
45 #define SP_AARCH64		MODE_RW_64
46 
47 /*******************************************************************************
48  * Number of cpus that the present on this platform. TODO: Rely on a topology
49  * tree to determine this in the future to avoid assumptions about mpidr
50  * allocation
51  ******************************************************************************/
52 #define TLKD_CORE_COUNT		PLATFORM_CORE_COUNT
53 
54 /*******************************************************************************
55  * Constants that allow assembler code to preserve callee-saved registers of the
56  * C runtime context while performing a security state switch.
57  ******************************************************************************/
58 #define TLKD_C_RT_CTX_X19		0x0
59 #define TLKD_C_RT_CTX_X20		0x8
60 #define TLKD_C_RT_CTX_X21		0x10
61 #define TLKD_C_RT_CTX_X22		0x18
62 #define TLKD_C_RT_CTX_X23		0x20
63 #define TLKD_C_RT_CTX_X24		0x28
64 #define TLKD_C_RT_CTX_X25		0x30
65 #define TLKD_C_RT_CTX_X26		0x38
66 #define TLKD_C_RT_CTX_X27		0x40
67 #define TLKD_C_RT_CTX_X28		0x48
68 #define TLKD_C_RT_CTX_X29		0x50
69 #define TLKD_C_RT_CTX_X30		0x58
70 #define TLKD_C_RT_CTX_SIZE		0x60
71 #define TLKD_C_RT_CTX_ENTRIES		(TLKD_C_RT_CTX_SIZE >> DWORD_SHIFT)
72 
73 #ifndef __ASSEMBLY__
74 
75 #include <cassert.h>
76 #include <stdint.h>
77 
78 /* AArch64 callee saved general purpose register context structure. */
79 DEFINE_REG_STRUCT(c_rt_regs, TLKD_C_RT_CTX_ENTRIES);
80 
81 /*
82  * Compile time assertion to ensure that both the compiler and linker
83  * have the same double word aligned view of the size of the C runtime
84  * register context.
85  */
86 CASSERT(TLKD_C_RT_CTX_SIZE == sizeof(c_rt_regs_t),	\
87 	assert_tlkd_c_rt_regs_size_mismatch);
88 
89 /*******************************************************************************
90  * Structure which helps the SPD to maintain the per-cpu state of the SP.
91  * 'state'          - collection of flags to track SP state e.g. on/off
92  * 'mpidr'          - mpidr to associate a context with a cpu
93  * 'c_rt_ctx'       - stack address to restore C runtime context from after
94  *                    returning from a synchronous entry into the SP.
95  * 'cpu_ctx'        - space to maintain SP architectural state
96  * 'saved_tsp_args' - space to store arguments for TSP arithmetic operations
97  *                    which will queried using the TSP_GET_ARGS SMC by TSP.
98  ******************************************************************************/
99 typedef struct tlk_context {
100 	uint32_t state;
101 	uint64_t mpidr;
102 	uint64_t c_rt_ctx;
103 	cpu_context_t cpu_ctx;
104 } tlk_context_t;
105 
106 /*******************************************************************************
107  * Function & Data prototypes
108  ******************************************************************************/
109 uint64_t tlkd_va_translate(uintptr_t va, int type);
110 uint64_t tlkd_enter_sp(uint64_t *c_rt_ctx);
111 void __dead2 tlkd_exit_sp(uint64_t c_rt_ctx, uint64_t ret);
112 uint64_t tlkd_synchronous_sp_entry(tlk_context_t *tlk_ctx);
113 void __dead2 tlkd_synchronous_sp_exit(tlk_context_t *tlk_ctx,
114 			uint64_t ret);
115 void tlkd_init_tlk_ep_state(struct entry_point_info *tlk_entry_point,
116 				uint32_t rw,
117 				uint64_t pc,
118 				tlk_context_t *tlk_ctx);
119 
120 #endif /*__ASSEMBLY__*/
121 
122 #endif /* __TLKD_PRIVATE_H__ */
123