Merge pull request #138 from athoelke/at/cpu-context

Move CPU context pointers into cpu_data
diff --git a/bl31/context_mgmt.c b/bl31/context_mgmt.c
index 59be748..67a6e03 100644
--- a/bl31/context_mgmt.c
+++ b/bl31/context_mgmt.c
@@ -35,21 +35,12 @@
 #include <bl31.h>
 #include <context.h>
 #include <context_mgmt.h>
+#include <cpu_data.h>
 #include <interrupt_mgmt.h>
 #include <platform.h>
 #include <platform_def.h>
 #include <runtime_svc.h>
 
-/*******************************************************************************
- * 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_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_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 b889f68..c0230b8 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 ca9d9fa..ade2fa1 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_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 2d256e4..5f45f14 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;