Home | History | Annotate | Download | only in bl31
      1 /*
      2  * Copyright (c) 2013-2016, ARM Limited and Contributors. All rights reserved.
      3  *
      4  * SPDX-License-Identifier: BSD-3-Clause
      5  */
      6 
      7 #include <assert.h>
      8 #include <bl31.h>
      9 #include <bl_common.h>
     10 #include <context.h>
     11 #include <context_mgmt.h>
     12 #include <cpu_data.h>
     13 #include <platform.h>
     14 
     15 
     16 /*******************************************************************************
     17  * This function returns a pointer to the most recent 'cpu_context' structure
     18  * for the calling CPU that was set as the context for the specified security
     19  * state. NULL is returned if no such structure has been specified.
     20  ******************************************************************************/
     21 void *cm_get_context(uint32_t security_state)
     22 {
     23 	assert(security_state <= NON_SECURE);
     24 
     25 	return get_cpu_data(cpu_context[security_state]);
     26 }
     27 
     28 /*******************************************************************************
     29  * This function sets the pointer to the current 'cpu_context' structure for the
     30  * specified security state for the calling CPU
     31  ******************************************************************************/
     32 void cm_set_context(void *context, uint32_t security_state)
     33 {
     34 	assert(security_state <= NON_SECURE);
     35 
     36 	set_cpu_data(cpu_context[security_state], 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, cpu_context[security_state]);
     51 }
     52 
     53 /*******************************************************************************
     54  * This function sets the pointer to the current 'cpu_context' structure for the
     55  * specified security state for the CPU identified by CPU index.
     56  ******************************************************************************/
     57 void cm_set_context_by_index(unsigned int cpu_idx, void *context,
     58 				unsigned int security_state)
     59 {
     60 	assert(sec_state_is_valid(security_state));
     61 
     62 	set_cpu_data_by_index(cpu_idx, cpu_context[security_state], context);
     63 }
     64 
     65 #if !ERROR_DEPRECATED
     66 /*
     67  * These context management helpers are deprecated but are maintained for use
     68  * by SPDs which have not migrated to the new API. If ERROR_DEPRECATED
     69  * is enabled, these are excluded from the build so as to force users to
     70  * migrate to the new API.
     71  */
     72 
     73 /*******************************************************************************
     74  * This function returns a pointer to the most recent 'cpu_context' structure
     75  * for the CPU identified by MPIDR that was set as the context for the specified
     76  * security state. NULL is returned if no such structure has been specified.
     77  ******************************************************************************/
     78 void *cm_get_context_by_mpidr(uint64_t mpidr, uint32_t security_state)
     79 {
     80 	assert(sec_state_is_valid(security_state));
     81 
     82 	return cm_get_context_by_index(platform_get_core_pos(mpidr), security_state);
     83 }
     84 
     85 /*******************************************************************************
     86  * This function sets the pointer to the current 'cpu_context' structure for the
     87  * specified security state for the CPU identified by MPIDR
     88  ******************************************************************************/
     89 void cm_set_context_by_mpidr(uint64_t mpidr, void *context, uint32_t security_state)
     90 {
     91 	assert(sec_state_is_valid(security_state));
     92 
     93 	cm_set_context_by_index(platform_get_core_pos(mpidr),
     94 						 context, security_state);
     95 }
     96 
     97 /*******************************************************************************
     98  * The following function provides a compatibility function for SPDs using the
     99  * existing cm library routines. This function is expected to be invoked for
    100  * initializing the cpu_context for the CPU specified by MPIDR for first use.
    101  ******************************************************************************/
    102 void cm_init_context(unsigned long mpidr, const entry_point_info_t *ep)
    103 {
    104 	if ((mpidr & MPIDR_AFFINITY_MASK) ==
    105 			(read_mpidr_el1() & MPIDR_AFFINITY_MASK))
    106 		cm_init_my_context(ep);
    107 	else
    108 		cm_init_context_by_index(platform_get_core_pos(mpidr), ep);
    109 }
    110 #endif
    111