xref: /arm-trusted-firmware/include/lib/el3_runtime/context_mgmt.h (revision 91f16700b400a8c0651d24a598fc48ee2997a0d7)
1*91f16700Schasinglulu /*
2*91f16700Schasinglulu  * Copyright (c) 2013-2023, Arm Limited and Contributors. All rights reserved.
3*91f16700Schasinglulu  *
4*91f16700Schasinglulu  * SPDX-License-Identifier: BSD-3-Clause
5*91f16700Schasinglulu  */
6*91f16700Schasinglulu 
7*91f16700Schasinglulu #ifndef CONTEXT_MGMT_H
8*91f16700Schasinglulu #define CONTEXT_MGMT_H
9*91f16700Schasinglulu 
10*91f16700Schasinglulu #include <assert.h>
11*91f16700Schasinglulu #include <context.h>
12*91f16700Schasinglulu #include <stdint.h>
13*91f16700Schasinglulu 
14*91f16700Schasinglulu #include <arch.h>
15*91f16700Schasinglulu 
16*91f16700Schasinglulu /*******************************************************************************
17*91f16700Schasinglulu  * Forward declarations
18*91f16700Schasinglulu  ******************************************************************************/
19*91f16700Schasinglulu struct entry_point_info;
20*91f16700Schasinglulu 
21*91f16700Schasinglulu /*******************************************************************************
22*91f16700Schasinglulu  * Function & variable prototypes
23*91f16700Schasinglulu  ******************************************************************************/
24*91f16700Schasinglulu void cm_init(void);
25*91f16700Schasinglulu void *cm_get_context_by_index(unsigned int cpu_idx,
26*91f16700Schasinglulu 			      unsigned int security_state);
27*91f16700Schasinglulu void cm_set_context_by_index(unsigned int cpu_idx,
28*91f16700Schasinglulu 			     void *context,
29*91f16700Schasinglulu 			     unsigned int security_state);
30*91f16700Schasinglulu void *cm_get_context(uint32_t security_state);
31*91f16700Schasinglulu void cm_set_context(void *context, uint32_t security_state);
32*91f16700Schasinglulu void cm_init_my_context(const struct entry_point_info *ep);
33*91f16700Schasinglulu void cm_init_context_by_index(unsigned int cpu_idx,
34*91f16700Schasinglulu 			      const struct entry_point_info *ep);
35*91f16700Schasinglulu void cm_setup_context(cpu_context_t *ctx, const struct entry_point_info *ep);
36*91f16700Schasinglulu void cm_prepare_el3_exit(uint32_t security_state);
37*91f16700Schasinglulu void cm_prepare_el3_exit_ns(void);
38*91f16700Schasinglulu 
39*91f16700Schasinglulu #ifdef __aarch64__
40*91f16700Schasinglulu #if IMAGE_BL31
41*91f16700Schasinglulu void cm_manage_extensions_el3(void);
42*91f16700Schasinglulu void manage_extensions_nonsecure_per_world(void);
43*91f16700Schasinglulu #endif
44*91f16700Schasinglulu #if CTX_INCLUDE_EL2_REGS
45*91f16700Schasinglulu void cm_el2_sysregs_context_save(uint32_t security_state);
46*91f16700Schasinglulu void cm_el2_sysregs_context_restore(uint32_t security_state);
47*91f16700Schasinglulu #endif
48*91f16700Schasinglulu 
49*91f16700Schasinglulu void cm_el1_sysregs_context_save(uint32_t security_state);
50*91f16700Schasinglulu void cm_el1_sysregs_context_restore(uint32_t security_state);
51*91f16700Schasinglulu void cm_set_elr_el3(uint32_t security_state, uintptr_t entrypoint);
52*91f16700Schasinglulu void cm_set_elr_spsr_el3(uint32_t security_state,
53*91f16700Schasinglulu 			uintptr_t entrypoint, uint32_t spsr);
54*91f16700Schasinglulu void cm_write_scr_el3_bit(uint32_t security_state,
55*91f16700Schasinglulu 			  uint32_t bit_pos,
56*91f16700Schasinglulu 			  uint32_t value);
57*91f16700Schasinglulu void cm_set_next_eret_context(uint32_t security_state);
58*91f16700Schasinglulu u_register_t cm_get_scr_el3(uint32_t security_state);
59*91f16700Schasinglulu 
60*91f16700Schasinglulu /* Inline definitions */
61*91f16700Schasinglulu 
62*91f16700Schasinglulu /*******************************************************************************
63*91f16700Schasinglulu  * This function is used to program the context that's used for exception
64*91f16700Schasinglulu  * return. This initializes the SP_EL3 to a pointer to a 'cpu_context' set for
65*91f16700Schasinglulu  * the required security state
66*91f16700Schasinglulu  ******************************************************************************/
67*91f16700Schasinglulu static inline void cm_set_next_context(void *context)
68*91f16700Schasinglulu {
69*91f16700Schasinglulu #if ENABLE_ASSERTIONS
70*91f16700Schasinglulu 	uint64_t sp_mode;
71*91f16700Schasinglulu 
72*91f16700Schasinglulu 	/*
73*91f16700Schasinglulu 	 * Check that this function is called with SP_EL0 as the stack
74*91f16700Schasinglulu 	 * pointer
75*91f16700Schasinglulu 	 */
76*91f16700Schasinglulu 	__asm__ volatile("mrs	%0, SPSel\n"
77*91f16700Schasinglulu 			 : "=r" (sp_mode));
78*91f16700Schasinglulu 
79*91f16700Schasinglulu 	assert(sp_mode == MODE_SP_EL0);
80*91f16700Schasinglulu #endif /* ENABLE_ASSERTIONS */
81*91f16700Schasinglulu 
82*91f16700Schasinglulu 	__asm__ volatile("msr	spsel, #1\n"
83*91f16700Schasinglulu 			 "mov	sp, %0\n"
84*91f16700Schasinglulu 			 "msr	spsel, #0\n"
85*91f16700Schasinglulu 			 : : "r" (context));
86*91f16700Schasinglulu }
87*91f16700Schasinglulu 
88*91f16700Schasinglulu #else
89*91f16700Schasinglulu void *cm_get_next_context(void);
90*91f16700Schasinglulu void cm_set_next_context(void *context);
91*91f16700Schasinglulu static inline void cm_manage_extensions_el3(void) {}
92*91f16700Schasinglulu static inline void manage_extensions_nonsecure_per_world(void) {}
93*91f16700Schasinglulu #endif /* __aarch64__ */
94*91f16700Schasinglulu 
95*91f16700Schasinglulu #endif /* CONTEXT_MGMT_H */
96