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