From aaba4f28278d20912ddcf32a49ba1c42adec3d2e Mon Sep 17 00:00:00 2001 From: Andrew Thoelke Date: Mon, 2 Jun 2014 10:00:25 +0100 Subject: [PATCH] Move CPU context pointers into cpu_data Moving the context pointers for each CPU into the per-cpu data allows for much more efficient access to the contexts for the current CPU. Change-Id: Id784e210d63cbdcddb44ac1591617ce668dbc29f --- bl31/context_mgmt.c | 42 +++---------------------------------- include/bl31/context.h | 1 + include/bl31/context_mgmt.h | 31 +++++++++++++++++++++++++-- include/bl31/cpu_data.h | 4 +++- 4 files changed, 36 insertions(+), 42 deletions(-) diff --git a/bl31/context_mgmt.c b/bl31/context_mgmt.c index 59be748c..67a6e037 100644 --- a/bl31/context_mgmt.c +++ b/bl31/context_mgmt.c @@ -35,21 +35,12 @@ #include #include #include +#include #include #include #include #include -/******************************************************************************* - * Data structure which holds the pointers to non-secure and secure security - * state contexts for each cpu. It is aligned to the cache line boundary to - * allow efficient concurrent manipulation of these pointers on different cpus - ******************************************************************************/ -typedef struct { - void *ptr[2]; -} __aligned (CACHE_WRITEBACK_GRANULE) context_info_t; - -static context_info_t cm_context_info[PLATFORM_CORE_COUNT]; /******************************************************************************* * Context management library initialisation routine. This library is used by @@ -79,25 +70,9 @@ void cm_init() ******************************************************************************/ void *cm_get_context_by_mpidr(uint64_t mpidr, uint32_t security_state) { - uint32_t linear_id = platform_get_core_pos(mpidr); - - assert(security_state <= NON_SECURE); - - return cm_context_info[linear_id].ptr[security_state]; -} - -/******************************************************************************* - * This function returns a pointer to the most recent 'cpu_context' structure - * for the calling CPU that was set as the context for the specified security - * state. NULL is returned if no such structure has been specified. - ******************************************************************************/ -void *cm_get_context(uint32_t security_state) -{ - uint32_t linear_id = platform_get_core_pos(read_mpidr()); - assert(security_state <= NON_SECURE); - return cm_context_info[linear_id].ptr[security_state]; + return get_cpu_data_by_mpidr(mpidr, cpu_context[security_state]); } /******************************************************************************* @@ -106,20 +81,9 @@ void *cm_get_context(uint32_t security_state) ******************************************************************************/ void cm_set_context_by_mpidr(uint64_t mpidr, void *context, uint32_t security_state) { - uint32_t linear_id = platform_get_core_pos(mpidr); - assert(security_state <= NON_SECURE); - cm_context_info[linear_id].ptr[security_state] = context; -} - -/******************************************************************************* - * This function sets the pointer to the current 'cpu_context' structure for the - * specified security state for the calling CPU - ******************************************************************************/ -void cm_set_context(void *context, uint32_t security_state) -{ - cm_set_context_by_mpidr(read_mpidr(), context, security_state); + set_cpu_data_by_mpidr(mpidr, cpu_context[security_state], context); } /******************************************************************************* diff --git a/include/bl31/context.h b/include/bl31/context.h index b889f681..c0230b86 100644 --- a/include/bl31/context.h +++ b/include/bl31/context.h @@ -188,6 +188,7 @@ #ifndef __ASSEMBLY__ #include +#include /* for CACHE_WRITEBACK_GRANULE */ #include /* diff --git a/include/bl31/context_mgmt.h b/include/bl31/context_mgmt.h index ca9d9fac..ade2fa1d 100644 --- a/include/bl31/context_mgmt.h +++ b/include/bl31/context_mgmt.h @@ -31,6 +31,7 @@ #ifndef __CM_H__ #define __CM_H__ +#include #include /******************************************************************************* @@ -38,11 +39,11 @@ ******************************************************************************/ void cm_init(void); void *cm_get_context_by_mpidr(uint64_t mpidr, uint32_t security_state); -void *cm_get_context(uint32_t security_state); +static inline void *cm_get_context(uint32_t security_state); void cm_set_context_by_mpidr(uint64_t mpidr, void *context, uint32_t security_state); -void cm_set_context(void *context, uint32_t security_state); +static inline void cm_set_context(void *context, uint32_t security_state); void cm_el3_sysregs_context_save(uint32_t security_state); void cm_el3_sysregs_context_restore(uint32_t security_state); void cm_el1_sysregs_context_save(uint32_t security_state); @@ -56,4 +57,30 @@ void cm_write_scr_el3_bit(uint32_t security_state, void cm_set_next_eret_context(uint32_t security_state); uint32_t cm_get_scr_el3(uint32_t security_state); +/* Inline definitions */ + +/******************************************************************************* + * This function returns a pointer to the most recent 'cpu_context' structure + * for the calling CPU that was set as the context for the specified security + * state. NULL is returned if no such structure has been specified. + ******************************************************************************/ +void *cm_get_context(uint32_t security_state) +{ + assert(security_state <= NON_SECURE); + + return get_cpu_data(cpu_context[security_state]); +} + +/******************************************************************************* + * This function sets the pointer to the current 'cpu_context' structure for the + * specified security state for the calling CPU + ******************************************************************************/ +void cm_set_context(void *context, uint32_t security_state) +{ + assert(security_state <= NON_SECURE); + + set_cpu_data(cpu_context[security_state], context); +} + + #endif /* __CM_H__ */ diff --git a/include/bl31/cpu_data.h b/include/bl31/cpu_data.h index 2d256e49..5f45f144 100644 --- a/include/bl31/cpu_data.h +++ b/include/bl31/cpu_data.h @@ -32,7 +32,7 @@ #define __CPU_DATA_H__ /* Offsets for the cpu_data structure */ -#define CPU_DATA_CRASH_STACK_OFFSET 0x0 +#define CPU_DATA_CRASH_STACK_OFFSET 0x10 #define CPU_DATA_LOG2SIZE 6 #ifndef __ASSEMBLY__ @@ -47,6 +47,7 @@ /******************************************************************************* * Cache of frequently used per-cpu data: + * Pointers to non-secure and secure security state contexts * Address of the crash stack * It is aligned to the cache line boundary to allow efficient concurrent * manipulation of these pointers on different cpus @@ -59,6 +60,7 @@ ******************************************************************************/ typedef struct cpu_data { + void *cpu_context[2]; uint64_t crash_stack; } __aligned(CACHE_WRITEBACK_GRANULE) cpu_data_t; -- 2.30.2