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 ******************************************************************************/
cm_get_context(uint32_t security_state)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 ******************************************************************************/
cm_set_context(void * context,uint32_t security_state)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 ******************************************************************************/
cm_get_context_by_index(unsigned int cpu_idx,unsigned int security_state)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 ******************************************************************************/
cm_set_context_by_index(unsigned int cpu_idx,void * context,unsigned int security_state)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