1 /* 2 * Copyright (c) 2013-2021, Arm Limited and Contributors. All rights reserved. 3 * 4 * SPDX-License-Identifier: BSD-3-Clause 5 */ 6 7 #include <assert.h> 8 9 #include <bl31/bl31.h> 10 #include <common/bl_common.h> 11 #include <context.h> 12 #include <lib/el3_runtime/context_mgmt.h> 13 #include <lib/el3_runtime/cpu_data.h> 14 15 /******************************************************************************* 16 * This function returns a pointer to the most recent 'cpu_context' structure 17 * for the calling CPU that was set as the context for the specified security 18 * state. NULL is returned if no such structure has been specified. 19 ******************************************************************************/ 20 void *cm_get_context(uint32_t security_state) 21 { 22 assert(sec_state_is_valid(security_state)); 23 24 return get_cpu_data(cpu_context[get_cpu_context_index(security_state)]); 25 } 26 27 /******************************************************************************* 28 * This function sets the pointer to the current 'cpu_context' structure for the 29 * specified security state for the calling CPU 30 ******************************************************************************/ 31 void cm_set_context(void *context, uint32_t security_state) 32 { 33 assert(sec_state_is_valid(security_state)); 34 35 set_cpu_data(cpu_context[get_cpu_context_index(security_state)], 36 context); 37 } 38 39 /******************************************************************************* 40 * This function returns a pointer to the most recent 'cpu_context' structure 41 * for the CPU identified by `cpu_idx` that was set as the context for the 42 * specified security state. NULL is returned if no such structure has been 43 * specified. 44 ******************************************************************************/ 45 void *cm_get_context_by_index(unsigned int cpu_idx, 46 unsigned int security_state) 47 { 48 assert(sec_state_is_valid(security_state)); 49 50 return get_cpu_data_by_index(cpu_idx, 51 cpu_context[get_cpu_context_index(security_state)]); 52 } 53 54 /******************************************************************************* 55 * This function sets the pointer to the current 'cpu_context' structure for the 56 * specified security state for the CPU identified by CPU index. 57 ******************************************************************************/ 58 void cm_set_context_by_index(unsigned int cpu_idx, void *context, 59 unsigned int security_state) 60 { 61 assert(sec_state_is_valid(security_state)); 62 63 set_cpu_data_by_index(cpu_idx, 64 cpu_context[get_cpu_context_index(security_state)], 65 context); 66 } 67