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 @@ 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 @@ ******************************************************************************/ 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 @@ ******************************************************************************/ 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 @@ /* 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 @@ #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 *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 @@ * 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 @@ 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