diff options
Diffstat (limited to 'bl31/context_mgmt.c')
-rw-r--r-- | bl31/context_mgmt.c | 40 |
1 files changed, 27 insertions, 13 deletions
diff --git a/bl31/context_mgmt.c b/bl31/context_mgmt.c index 8d1396e..eae608c 100644 --- a/bl31/context_mgmt.c +++ b/bl31/context_mgmt.c @@ -31,6 +31,7 @@ #include <arch_helpers.h> #include <assert.h> #include <bl_common.h> +#include <bl31.h> #include <context.h> #include <context_mgmt.h> #include <platform.h> @@ -47,6 +48,9 @@ typedef struct { static context_info_t cm_context_info[PLATFORM_CORE_COUNT]; +/* The per_cpu_ptr_cache_t space allocation */ +static per_cpu_ptr_cache_t per_cpu_ptr_cache_space[PLATFORM_CORE_COUNT]; + /******************************************************************************* * Context management library initialisation routine. This library is used by * runtime services to share pointers to 'cpu_context' structures for the secure @@ -211,21 +215,31 @@ void cm_set_next_eret_context(uint32_t security_state) : : "r" (ctx)); } -/******************************************************************************* - * This function is used to program exception stack in the 'cpu_context' - * structure. This is the initial stack used for taking and handling exceptions - * at EL3. This stack is expected to be initialized once by each security state - ******************************************************************************/ -void cm_init_exception_stack(uint64_t mpidr, uint32_t security_state) +/************************************************************************ + * The following function is used to populate the per cpu pointer cache. + * The pointer will be stored in the tpidr_el3 register. + *************************************************************************/ +void cm_init_pcpu_ptr_cache() { - cpu_context_t *ctx; - el3_state_t *state; + unsigned long mpidr = read_mpidr(); + uint32_t linear_id = platform_get_core_pos(mpidr); + per_cpu_ptr_cache_t *pcpu_ptr_cache; - ctx = cm_get_context(mpidr, security_state); - assert(ctx); + pcpu_ptr_cache = &per_cpu_ptr_cache_space[linear_id]; + assert(pcpu_ptr_cache); + pcpu_ptr_cache->crash_stack = get_crash_stack(mpidr); + + cm_set_pcpu_ptr_cache(pcpu_ptr_cache); +} - /* Set exception stack in the context */ - state = get_el3state_ctx(ctx); - write_ctx_reg(state, CTX_EXCEPTION_SP, get_exception_stack(mpidr)); +void cm_set_pcpu_ptr_cache(const void *pcpu_ptr) +{ + write_tpidr_el3((unsigned long)pcpu_ptr); } + +void *cm_get_pcpu_ptr_cache(void) +{ + return (void *)read_tpidr_el3(); +} + |