From 23ff9baa7e01eac3a451f2e8ed768c9b90d3567a Mon Sep 17 00:00:00 2001 From: Vikram Kanigiri Date: Tue, 13 May 2014 14:42:08 +0100 Subject: Introduce macros to manipulate the SPSR This patch introduces macros (SPSR_64 and SPSR_32) to create a SPSR for both aarch32 and aarch64 execution states. These macros allow the user to set fields in the SPSR depending upon its format. The make_spsr() function which did not allow manipulation of all the fields in the aarch32 SPSR has been replaced by these new macros. Change-Id: I9425dda0923e8d5f03d03ddb8fa0e28392c4c61e --- bl1/bl1_main.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'bl1/bl1_main.c') diff --git a/bl1/bl1_main.c b/bl1/bl1_main.c index de7bc318..ecf25506 100644 --- a/bl1/bl1_main.c +++ b/bl1/bl1_main.c @@ -95,7 +95,7 @@ void bl1_main(void) if (bl2_base) { bl1_arch_next_el_setup(); - spsr = make_spsr(MODE_EL1, MODE_SP_ELX, MODE_RW_64); + spsr = SPSR_64(MODE_EL1, MODE_SP_ELX, DISABLE_ALL_EXCEPTIONS); printf("Booting trusted firmware boot loader stage 2\n\r"); #if DEBUG printf("BL2 address = 0x%llx \n\r", (unsigned long long) bl2_base); -- cgit v1.2.3 From 29fb905d5f36a415a170a4bffeadf13b5f084345 Mon Sep 17 00:00:00 2001 From: Vikram Kanigiri Date: Thu, 15 May 2014 18:27:15 +0100 Subject: Rework handover interface between BL stages This patch reworks the handover interface from: BL1 to BL2 and BL2 to BL3-1. It removes the raise_el(), change_el(), drop_el() and run_image() functions as they catered for code paths that were never exercised. BL1 calls bl1_run_bl2() to jump into BL2 instead of doing the same by calling run_image(). Similarly, BL2 issues the SMC to transfer execution to BL3-1 through BL1 directly. Only x0 and x1 are used to pass arguments to BL31. These arguments and parameters for running BL3-1 are passed through a reference to a 'el_change_info_t' structure. They were being passed value in general purpose registers earlier. Change-Id: Id4fd019a19a9595de063766d4a66295a2c9307e1 --- bl1/bl1_main.c | 61 ++++++++++++++++++++++++++++++++++++++++++---------------- 1 file changed, 44 insertions(+), 17 deletions(-) (limited to 'bl1/bl1_main.c') diff --git a/bl1/bl1_main.c b/bl1/bl1_main.c index ecf25506..80e52ca1 100644 --- a/bl1/bl1_main.c +++ b/bl1/bl1_main.c @@ -37,6 +37,34 @@ #include #include "bl1_private.h" +/******************************************************************************* + * Runs BL2 from the given entry point. It results in dropping the + * exception level + ******************************************************************************/ +static void __dead2 bl1_run_bl2(el_change_info_t *bl2_ep) +{ + bl1_arch_next_el_setup(); + + /* Tell next EL what we want done */ + bl2_ep->args.arg0 = RUN_IMAGE; + + if (bl2_ep->security_state == NON_SECURE) + change_security_state(bl2_ep->security_state); + + write_spsr_el3(bl2_ep->spsr); + write_elr_el3(bl2_ep->entrypoint); + + eret(bl2_ep->args.arg0, + bl2_ep->args.arg1, + bl2_ep->args.arg2, + bl2_ep->args.arg3, + bl2_ep->args.arg4, + bl2_ep->args.arg5, + bl2_ep->args.arg6, + bl2_ep->args.arg7); +} + + /******************************************************************************* * Function to perform late architectural and platform specific initialization. * It also locates and loads the BL2 raw binary image in the trusted DRAM. Only @@ -50,9 +78,10 @@ void bl1_main(void) unsigned long sctlr_el3 = read_sctlr_el3(); #endif unsigned long bl2_base; - unsigned int load_type = TOP_LOAD, spsr; + unsigned int load_type = TOP_LOAD; meminfo_t *bl1_tzram_layout; meminfo_t *bl2_tzram_layout = 0x0; + el_change_info_t bl2_ep = {0}; /* * Ensure that MMU/Caches and coherency are turned on @@ -94,20 +123,19 @@ void bl1_main(void) bl2_base); if (bl2_base) { - bl1_arch_next_el_setup(); - spsr = SPSR_64(MODE_EL1, MODE_SP_ELX, DISABLE_ALL_EXCEPTIONS); + bl2_ep.spsr = + SPSR_64(MODE_EL1, MODE_SP_ELX, DISABLE_ALL_EXCEPTIONS); + bl2_ep.entrypoint = bl2_base; + bl2_ep.security_state = SECURE; + bl2_ep.args.arg1 = (unsigned long)bl2_tzram_layout; printf("Booting trusted firmware boot loader stage 2\n\r"); #if DEBUG printf("BL2 address = 0x%llx \n\r", (unsigned long long) bl2_base); - printf("BL2 cpsr = 0x%x \n\r", spsr); + printf("BL2 cpsr = 0x%x \n\r", bl2_ep.spsr); printf("BL2 memory layout address = 0x%llx \n\r", (unsigned long long) bl2_tzram_layout); #endif - run_image(bl2_base, - spsr, - SECURE, - (void *) bl2_tzram_layout, - NULL); + bl1_run_bl2(&bl2_ep); } /* @@ -122,17 +150,16 @@ void bl1_main(void) * Temporary function to print the fact that BL2 has done its job and BL31 is * about to be loaded. This is needed as long as printfs cannot be used ******************************************************************************/ -void display_boot_progress(unsigned long entrypoint, - unsigned long spsr, - unsigned long mem_layout, - unsigned long ns_image_info) +void display_boot_progress(el_change_info_t *bl31_ep_info) { printf("Booting trusted firmware boot loader stage 3\n\r"); #if DEBUG - printf("BL31 address = 0x%llx \n\r", (unsigned long long) entrypoint); - printf("BL31 cpsr = 0x%llx \n\r", (unsigned long long)spsr); - printf("BL31 memory layout address = 0x%llx \n\r", (unsigned long long)mem_layout); - printf("BL31 non-trusted image info address = 0x%llx\n\r", (unsigned long long)ns_image_info); + printf("BL31 address = 0x%llx\n", + (unsigned long long)bl31_ep_info->entrypoint); + printf("BL31 cpsr = 0x%llx\n", + (unsigned long long)bl31_ep_info->spsr); + printf("BL31 args address = 0x%llx\n", + (unsigned long long)bl31_ep_info->args.arg0); #endif return; } -- cgit v1.2.3 From 4112bfa0c223eda73af1cfe57ca7dc926f767dd8 Mon Sep 17 00:00:00 2001 From: Vikram Kanigiri Date: Tue, 15 Apr 2014 18:08:08 +0100 Subject: Populate BL31 input parameters as per new spec This patch is based on spec published at https://github.com/ARM-software/tf-issues/issues/133 It rearranges the bl31_args struct into bl31_params and bl31_plat_params which provide the information needed for Trusted firmware and platform specific data via x0 and x1 On the FVP platform BL3-1 params and BL3-1 plat params and its constituents are stored at the start of TZDRAM. The information about memory availability and size for BL3-1, BL3-2 and BL3-3 is moved into platform specific data. Change-Id: I8b32057a3d0dd3968ea26c2541a0714177820da9 --- bl1/bl1_main.c | 76 +++++++++++++++++++++++++++++++--------------------------- 1 file changed, 41 insertions(+), 35 deletions(-) (limited to 'bl1/bl1_main.c') diff --git a/bl1/bl1_main.c b/bl1/bl1_main.c index 80e52ca1..da81839b 100644 --- a/bl1/bl1_main.c +++ b/bl1/bl1_main.c @@ -33,6 +33,7 @@ #include #include #include +#include #include #include #include "bl1_private.h" @@ -41,18 +42,18 @@ * Runs BL2 from the given entry point. It results in dropping the * exception level ******************************************************************************/ -static void __dead2 bl1_run_bl2(el_change_info_t *bl2_ep) +static void __dead2 bl1_run_bl2(entry_point_info_t *bl2_ep) { bl1_arch_next_el_setup(); /* Tell next EL what we want done */ bl2_ep->args.arg0 = RUN_IMAGE; - if (bl2_ep->security_state == NON_SECURE) - change_security_state(bl2_ep->security_state); + if (GET_SECURITY_STATE(bl2_ep->h.attr) == NON_SECURE) + change_security_state(GET_SECURITY_STATE(bl2_ep->h.attr)); write_spsr_el3(bl2_ep->spsr); - write_elr_el3(bl2_ep->entrypoint); + write_elr_el3(bl2_ep->pc); eret(bl2_ep->args.arg0, bl2_ep->args.arg1, @@ -77,11 +78,12 @@ void bl1_main(void) #if DEBUG unsigned long sctlr_el3 = read_sctlr_el3(); #endif - unsigned long bl2_base; unsigned int load_type = TOP_LOAD; + image_info_t bl2_image_info = { {0} }; + entry_point_info_t bl2_ep = { {0} }; meminfo_t *bl1_tzram_layout; meminfo_t *bl2_tzram_layout = 0x0; - el_change_info_t bl2_ep = {0}; + int err; /* * Ensure that MMU/Caches and coherency are turned on @@ -100,15 +102,28 @@ void bl1_main(void) printf(FIRMWARE_WELCOME_STR); printf("%s\n\r", build_message); + SET_PARAM_HEAD(&bl2_image_info, PARAM_IMAGE_BINARY, VERSION_1, 0); + SET_PARAM_HEAD(&bl2_ep, PARAM_EP, VERSION_1, 0); + /* * Find out how much free trusted ram remains after BL1 load * & load the BL2 image at its top */ bl1_tzram_layout = bl1_plat_sec_mem_layout(); - bl2_base = load_image(bl1_tzram_layout, + err = load_image(bl1_tzram_layout, (const char *) BL2_IMAGE_NAME, - load_type, BL2_BASE); - + load_type, + BL2_BASE, + &bl2_image_info, + &bl2_ep); + if (err) { + /* + * TODO: print failure to load BL2 but also add a tzwdog timer + * which will reset the system eventually. + */ + printf("Failed to load boot loader stage 2 (BL2) firmware.\n"); + panic(); + } /* * Create a new layout of memory for BL2 as seen by BL1 i.e. * tell it the amount of total and free memory available. @@ -120,29 +135,20 @@ void bl1_main(void) init_bl2_mem_layout(bl1_tzram_layout, bl2_tzram_layout, load_type, - bl2_base); - - if (bl2_base) { - bl2_ep.spsr = - SPSR_64(MODE_EL1, MODE_SP_ELX, DISABLE_ALL_EXCEPTIONS); - bl2_ep.entrypoint = bl2_base; - bl2_ep.security_state = SECURE; - bl2_ep.args.arg1 = (unsigned long)bl2_tzram_layout; - printf("Booting trusted firmware boot loader stage 2\n\r"); + bl2_image_info.image_base); + + bl1_plat_set_bl2_ep_info(&bl2_image_info, &bl2_ep); + bl2_ep.args.arg1 = (unsigned long)bl2_tzram_layout; + printf("Booting trusted firmware boot loader stage 2\n"); #if DEBUG - printf("BL2 address = 0x%llx \n\r", (unsigned long long) bl2_base); - printf("BL2 cpsr = 0x%x \n\r", bl2_ep.spsr); - printf("BL2 memory layout address = 0x%llx \n\r", - (unsigned long long) bl2_tzram_layout); + printf("BL2 address = 0x%llx\n", + (unsigned long long) bl2_ep.pc); + printf("BL2 cpsr = 0x%x\n", bl2_ep.spsr); + printf("BL2 memory layout address = 0x%llx\n", + (unsigned long long) bl2_tzram_layout); #endif - bl1_run_bl2(&bl2_ep); - } + bl1_run_bl2(&bl2_ep); - /* - * TODO: print failure to load BL2 but also add a tzwdog timer - * which will reset the system eventually. - */ - printf("Failed to load boot loader stage 2 (BL2) firmware.\n\r"); return; } @@ -150,16 +156,16 @@ void bl1_main(void) * Temporary function to print the fact that BL2 has done its job and BL31 is * about to be loaded. This is needed as long as printfs cannot be used ******************************************************************************/ -void display_boot_progress(el_change_info_t *bl31_ep_info) +void display_boot_progress(entry_point_info_t *bl31_ep_info) { printf("Booting trusted firmware boot loader stage 3\n\r"); #if DEBUG - printf("BL31 address = 0x%llx\n", - (unsigned long long)bl31_ep_info->entrypoint); - printf("BL31 cpsr = 0x%llx\n", - (unsigned long long)bl31_ep_info->spsr); - printf("BL31 args address = 0x%llx\n", + printf("BL31 address = 0x%llx\n", (unsigned long long)bl31_ep_info->pc); + printf("BL31 cpsr = 0x%llx\n", (unsigned long long)bl31_ep_info->spsr); + printf("BL31 params address = 0x%llx\n", (unsigned long long)bl31_ep_info->args.arg0); + printf("BL31 plat params address = 0x%llx\n", + (unsigned long long)bl31_ep_info->args.arg1); #endif return; } -- cgit v1.2.3