diff options
author | Andrew Thoelke <andrew.thoelke@arm.com> | 2014-06-02 10:00:25 +0100 |
---|---|---|
committer | Andrew Thoelke <andrew.thoelke@arm.com> | 2014-06-16 21:34:47 +0100 |
commit | aaba4f28278d20912ddcf32a49ba1c42adec3d2e (patch) | |
tree | e3434951206c924cfcf0123b1044d71d48cd7bf5 /include | |
parent | 5e910074245fa180cfbe70d3c8bceeff1eaa026e (diff) | |
download | trusted-firmware-a-aaba4f28278d20912ddcf32a49ba1c42adec3d2e.tar.gz |
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
Diffstat (limited to 'include')
-rw-r--r-- | include/bl31/context.h | 1 | ||||
-rw-r--r-- | include/bl31/context_mgmt.h | 31 | ||||
-rw-r--r-- | include/bl31/cpu_data.h | 4 |
3 files changed, 33 insertions, 3 deletions
diff --git a/include/bl31/context.h b/include/bl31/context.h index b889f68195..c0230b86a3 100644 --- a/include/bl31/context.h +++ b/include/bl31/context.h @@ -188,6 +188,7 @@ #ifndef __ASSEMBLY__ #include <cassert.h> +#include <platform_def.h> /* for CACHE_WRITEBACK_GRANULE */ #include <stdint.h> /* diff --git a/include/bl31/context_mgmt.h b/include/bl31/context_mgmt.h index ca9d9facd5..ade2fa1da3 100644 --- a/include/bl31/context_mgmt.h +++ b/include/bl31/context_mgmt.h @@ -31,6 +31,7 @@ #ifndef __CM_H__ #define __CM_H__ +#include <cpu_data.h> #include <stdint.h> /******************************************************************************* @@ -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 2d256e4935..5f45f144af 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; |