aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSandrine Bailleux <sandrine.bailleux@arm.com>2014-06-05 17:37:22 +0100
committerSandrine Bailleux <sandrine.bailleux@arm.com>2014-06-05 17:39:40 +0100
commit4be58a282d7e3dd7164a25d9ecc7791c4f047afb (patch)
tree927c6ef6cde4b90dc2a1fd1b461016724c031c33
parentae4ed84bb1019b996fddb53a154f2257266ac28d (diff)
downloadarm-trusted-firmware-4be58a282d7e3dd7164a25d9ecc7791c4f047afb.tar.gz
juno: Move BL3-1 arguments from normal DRAM to trusted RAM
On Juno, BL3-1 arguments used to sit at the beginning of the normal DRAM. This patch moves them in trusted RAM. BL2 now allocates them as a platform-specific static variable. BL3-1 then copies them internally before the MMU is enabled. Change-Id: I5cf526edfab5b49925b685092ff78506a5882f49
-rw-r--r--plat/juno/bl2_plat_setup.c53
-rw-r--r--plat/juno/bl31_plat_setup.c26
-rw-r--r--plat/juno/platform.h4
3 files changed, 37 insertions, 46 deletions
diff --git a/plat/juno/bl2_plat_setup.c b/plat/juno/bl2_plat_setup.c
index 07e2944..5f70322 100644
--- a/plat/juno/bl2_plat_setup.c
+++ b/plat/juno/bl2_plat_setup.c
@@ -76,11 +76,9 @@ __attribute__ ((aligned(PLATFORM_CACHE_LINE_SIZE),
section("tzfw_coherent_mem")));
/*******************************************************************************
- * Reference to structures which holds the arguments which need to be passed
- * to BL31
+ * Structure which holds the arguments which need to be passed to BL3-1
******************************************************************************/
-static bl31_params_t *bl2_to_bl31_params;
-static entry_point_info_t *bl31_ep_info;
+static bl2_to_bl31_params_mem_t bl31_params_mem;
meminfo_t *bl2_plat_sec_mem_layout(void)
{
@@ -98,46 +96,41 @@ meminfo_t *bl2_plat_sec_mem_layout(void)
******************************************************************************/
bl31_params_t *bl2_plat_get_bl31_params(void)
{
- bl2_to_bl31_params_mem_t *bl31_params_mem;
+ bl31_params_t *bl2_to_bl31_params;
/*
- * Allocate the memory for all the arguments that needs to
- * be passed to BL31
+ * Initialise the memory for all the arguments that needs to
+ * be passed to BL3-1
*/
- bl31_params_mem = (bl2_to_bl31_params_mem_t *)PARAMS_BASE;
- memset((void *)PARAMS_BASE, 0, sizeof(bl2_to_bl31_params_mem_t));
+ memset(&bl31_params_mem, 0, sizeof(bl2_to_bl31_params_mem_t));
/* Assign memory for TF related information */
- bl2_to_bl31_params = &bl31_params_mem->bl31_params;
+ bl2_to_bl31_params = &bl31_params_mem.bl31_params;
SET_PARAM_HEAD(bl2_to_bl31_params, PARAM_BL31, VERSION_1, 0);
- /* Fill BL31 related information */
- bl31_ep_info = &bl31_params_mem->bl31_ep_info;
- bl2_to_bl31_params->bl31_image_info = &bl31_params_mem->bl31_image_info;
+ /* Fill BL3-1 related information */
+ bl2_to_bl31_params->bl31_image_info = &bl31_params_mem.bl31_image_info;
SET_PARAM_HEAD(bl2_to_bl31_params->bl31_image_info, PARAM_IMAGE_BINARY,
VERSION_1, 0);
- /* Fill BL32 related information if it exists */
- if (BL32_BASE) {
- bl2_to_bl31_params->bl32_ep_info =
- &bl31_params_mem->bl32_ep_info;
- SET_PARAM_HEAD(bl2_to_bl31_params->bl32_ep_info,
- PARAM_EP, VERSION_1, 0);
- bl2_to_bl31_params->bl32_image_info =
- &bl31_params_mem->bl32_image_info;
- SET_PARAM_HEAD(bl2_to_bl31_params->bl32_image_info,
- PARAM_IMAGE_BINARY,
- VERSION_1, 0);
- }
+ /* Fill BL3-2 related information if it exists */
+#if BL32_BASE
+ bl2_to_bl31_params->bl32_ep_info = &bl31_params_mem.bl32_ep_info;
+ SET_PARAM_HEAD(bl2_to_bl31_params->bl32_ep_info, PARAM_EP,
+ VERSION_1, 0);
+ bl2_to_bl31_params->bl32_image_info = &bl31_params_mem.bl32_image_info;
+ SET_PARAM_HEAD(bl2_to_bl31_params->bl32_image_info, PARAM_IMAGE_BINARY,
+ VERSION_1, 0);
+#endif
- /* Fill BL33 related information */
- bl2_to_bl31_params->bl33_ep_info = &bl31_params_mem->bl33_ep_info;
+ /* Fill BL3-3 related information */
+ bl2_to_bl31_params->bl33_ep_info = &bl31_params_mem.bl33_ep_info;
SET_PARAM_HEAD(bl2_to_bl31_params->bl33_ep_info,
PARAM_EP, VERSION_1, 0);
/* UEFI expects to receive the primary CPU MPID (through x0) */
bl2_to_bl31_params->bl33_ep_info->args.arg0 = PRIMARY_CPU;
- bl2_to_bl31_params->bl33_image_info = &bl31_params_mem->bl33_image_info;
+ bl2_to_bl31_params->bl33_image_info = &bl31_params_mem.bl33_image_info;
SET_PARAM_HEAD(bl2_to_bl31_params->bl33_image_info, PARAM_IMAGE_BINARY,
VERSION_1, 0);
@@ -150,7 +143,7 @@ bl31_params_t *bl2_plat_get_bl31_params(void)
******************************************************************************/
struct entry_point_info *bl2_plat_get_bl31_ep_info(void)
{
- return bl31_ep_info;
+ return &bl31_params_mem.bl31_ep_info;
}
/*******************************************************************************
@@ -253,7 +246,7 @@ void bl2_platform_setup(void)
/* Flush the TF params and the TF plat params */
void bl2_plat_flush_bl31_params(void)
{
- flush_dcache_range((unsigned long)PARAMS_BASE,
+ flush_dcache_range((unsigned long)&bl31_params_mem,
sizeof(bl2_to_bl31_params_mem_t));
}
diff --git a/plat/juno/bl31_plat_setup.c b/plat/juno/bl31_plat_setup.c
index 94ba806..1ab2d98 100644
--- a/plat/juno/bl31_plat_setup.c
+++ b/plat/juno/bl31_plat_setup.c
@@ -68,10 +68,11 @@ extern unsigned long __COHERENT_RAM_END__;
#define BL31_COHERENT_RAM_LIMIT (unsigned long)(&__COHERENT_RAM_END__)
/******************************************************************************
- * Reference to structures which hold the arguments that have been passed to
- * BL31 from BL2.
+ * Placeholder variables for copying the arguments that have been passed to
+ * BL3-1 from BL2.
******************************************************************************/
-static bl31_params_t *bl2_to_bl31_params;
+static entry_point_info_t bl32_ep_info;
+static entry_point_info_t bl33_ep_info;
/*******************************************************************************
* Return a pointer to the 'entry_point_info' structure of the next image for
@@ -83,9 +84,7 @@ entry_point_info_t *bl31_get_next_image_info(uint32_t type)
{
entry_point_info_t *next_image_info;
- next_image_info = (type == NON_SECURE) ?
- bl2_to_bl31_params->bl33_ep_info :
- bl2_to_bl31_params->bl32_ep_info;
+ next_image_info = (type == NON_SECURE) ? &bl33_ep_info : &bl32_ep_info;
/* None of the images on this platform can have 0x0 as the entrypoint */
if (next_image_info->pc)
@@ -98,10 +97,9 @@ entry_point_info_t *bl31_get_next_image_info(uint32_t type)
* Perform any BL3-1 specific platform actions. Here is an opportunity to copy
* parameters passed by the calling EL (S-EL1 in BL2 & S-EL3 in BL1) before they
* are lost (potentially). This needs to be done before the MMU is initialized
- * so that the memory layout can be used while creating page tables. The 'data'
- * parameter is not used since all the information is contained in 'from_bl2'.
- * Also, BL2 has flushed this information to memory, so we are guaranteed to
- * pick up good data
+ * so that the memory layout can be used while creating page tables. Also, BL2
+ * has flushed this information to memory, so we are guaranteed to pick up good
+ * data
******************************************************************************/
void bl31_early_platform_setup(bl31_params_t *from_bl2,
void *plat_params_from_bl2)
@@ -112,8 +110,12 @@ void bl31_early_platform_setup(bl31_params_t *from_bl2,
assert(from_bl2->h.type == PARAM_BL31);
assert(from_bl2->h.version >= VERSION_1);
- bl2_to_bl31_params = from_bl2;
-
+ /*
+ * Copy BL3-2 and BL3-3 entry point information.
+ * They are stored in Secure RAM, in BL2's address space.
+ */
+ bl32_ep_info = *from_bl2->bl32_ep_info;
+ bl33_ep_info = *from_bl2->bl33_ep_info;
}
/*******************************************************************************
diff --git a/plat/juno/platform.h b/plat/juno/platform.h
index 927efd3..ca9eb60 100644
--- a/plat/juno/platform.h
+++ b/plat/juno/platform.h
@@ -134,10 +134,6 @@
#define DRAM_BASE 0x80000000
#define DRAM_SIZE 0x80000000
-/* Base address where parameters to BL31 are stored */
-/* Juno TODO: Move BL3-1 arguments somewhere in trusted memory */
-#define PARAMS_BASE DRAM_BASE
-
/* Memory mapped Generic timer interfaces */
#define SYS_CNTCTL_BASE 0x2a430000