diff --git a/bl2/bl2_main.c b/bl2/bl2_main.c index 46c70a123261f06a9626e85d43843346192ef1fe..691973f269ccf0aa1376d56663414c3b1fb9a857 100644 --- a/bl2/bl2_main.c +++ b/bl2/bl2_main.c @@ -38,24 +38,6 @@ #include #include "bl2_private.h" -/******************************************************************************* - * Runs BL31 from the given entry point. It jumps to a higher exception level - * through an SMC. - ******************************************************************************/ -static void __dead2 bl2_run_bl31(entry_point_info_t *bl31_ep_info, - unsigned long arg1, - unsigned long arg2) -{ - /* Set the args pointer */ - bl31_ep_info->args.arg0 = arg1; - bl31_ep_info->args.arg1 = arg2; - - /* Flush the params to be passed to memory */ - bl2_plat_flush_bl31_params(); - - smc(RUN_IMAGE, (unsigned long)bl31_ep_info, 0, 0, 0, 0, 0, 0); -} - /******************************************************************************* * The only thing to do in BL2 is to load further images and pass control to @@ -91,6 +73,9 @@ void bl2_main(void) bl2_to_bl31_params = bl2_plat_get_bl31_params(); bl31_ep_info = bl2_plat_get_bl31_ep_info(); + /* Set the X0 parameter to bl31 */ + bl31_ep_info->args.arg0 = (unsigned long)bl2_to_bl31_params; + /* * Load BL31. BL1 tells BL2 whether it has been TOP or BOTTOM loaded. * To avoid fragmentation of trusted SRAM memory, BL31 is always @@ -163,10 +148,13 @@ void bl2_main(void) } #endif /* BL32_BASE */ + /* Flush the params to be passed to memory */ + bl2_plat_flush_bl31_params(); + /* * Run BL31 via an SMC to BL1. Information on how to pass control to * the BL32 (if present) and BL33 software images will be passed to * BL31 as an argument. */ - bl2_run_bl31(bl31_ep_info, (unsigned long)bl2_to_bl31_params, 0); + smc(RUN_IMAGE, (unsigned long)bl31_ep_info, 0, 0, 0, 0, 0, 0); } diff --git a/plat/fvp/bl2_fvp_setup.c b/plat/fvp/bl2_fvp_setup.c index e18cf7ddb43ca800095a39d7b03d7c2044c11a06..72580f9a8647511c84d239a8ce14c55c00e778a9 100644 --- a/plat/fvp/bl2_fvp_setup.c +++ b/plat/fvp/bl2_fvp_setup.c @@ -156,6 +156,9 @@ bl31_params_t *bl2_plat_get_bl31_params(void) ******************************************************************************/ struct entry_point_info *bl2_plat_get_bl31_ep_info(void) { +#if DEBUG + bl31_ep_info->args.arg1 = FVP_BL31_PLAT_PARAM_VAL; +#endif return bl31_ep_info; } diff --git a/plat/fvp/bl31_fvp_setup.c b/plat/fvp/bl31_fvp_setup.c index 5169bd76bd33fa8151dce09a734b1e6e5eb0f85c..6554ec32d1379fbda07f6915bdb6e510dc3af6d1 100644 --- a/plat/fvp/bl31_fvp_setup.c +++ b/plat/fvp/bl31_fvp_setup.c @@ -159,6 +159,7 @@ void bl31_early_platform_setup(bl31_params_t *from_bl2, assert(from_bl2->h.version >= VERSION_1); bl2_to_bl31_params = from_bl2; + assert(((unsigned long)plat_params_from_bl2) == FVP_BL31_PLAT_PARAM_VAL); #endif } diff --git a/plat/fvp/fvp_def.h b/plat/fvp/fvp_def.h index 9072a220b0b2dff9fd8fb2f5d4e5dfc03adc5aa2..04ba6116f9eb5146f7e81717eefff8d3f27d904b 100644 --- a/plat/fvp/fvp_def.h +++ b/plat/fvp/fvp_def.h @@ -115,6 +115,9 @@ /* Load address of BL33 in the FVP port */ #define NS_IMAGE_OFFSET (DRAM1_BASE + 0x8000000) /* DRAM + 128MB */ +/* Special value used to verify platform parameters from BL2 to BL3-1 */ +#define FVP_BL31_PLAT_PARAM_VAL 0x0f1e2d3c4b5a6978ULL + /* * V2M sysled bit definitions. The values written to this * register are defined in arch.h & runtime_svc.h. Only