diff --git a/Makefile b/Makefile index 83b8808..06422ea 100644 --- a/Makefile +++ b/Makefile @@ -192,8 +192,8 @@ common/${ARCH}/debug.S \ lib/${ARCH}/cache_helpers.S \ lib/${ARCH}/misc_helpers.S \ + plat/common/plat_bl_common.c \ plat/common/plat_log_common.c \ - plat/common/platform_helpers_default.c \ plat/common/${ARCH}/plat_common.c \ plat/common/${ARCH}/platform_helpers.S \ ${COMPILER_RT_SRCS} \ diff --git a/bl1/bl1_fwu.c b/bl1/bl1_fwu.c index 07a7fc8..3878083 100644 --- a/bl1/bl1_fwu.c +++ b/bl1/bl1_fwu.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015-2017, ARM Limited and Contributors. All rights reserved. + * Copyright (c) 2015-2018, ARM Limited and Contributors. All rights reserved. * * SPDX-License-Identifier: BSD-3-Clause */ @@ -350,6 +350,15 @@ return -ENOMEM; } + /* Allow the platform to handle pre-image load before copying */ + if (image_desc->state == IMAGE_STATE_RESET) { + if (bl1_plat_handle_pre_image_load(image_id) != 0) { + ERROR("BL1-FWU: Failure in pre-image load of image id %d\n", + image_id); + return -EPERM; + } + } + /* Everything looks sane. Go ahead and copy the block of data. */ dest_addr = image_desc->image_info.image_base + image_desc->copied_size; memcpy((void *) dest_addr, (const void *) image_src, block_size); @@ -474,6 +483,18 @@ /* Indicate that image is in authenticated state. */ image_desc->state = IMAGE_STATE_AUTHENTICATED; + /* Allow the platform to handle post-image load */ + result = bl1_plat_handle_post_image_load(image_id); + if (result != 0) { + ERROR("BL1-FWU: Failure %d in post-image load of image id %d\n", + result, image_id); + /* + * Panic here as the platform handling of post-image load is + * not correct. + */ + plat_error_handler(result); + } + /* * Flush image_info to memory so that other * secure world images can see changes. diff --git a/bl1/bl1_main.c b/bl1/bl1_main.c index 91b5f0b..fe09070 100644 --- a/bl1/bl1_main.c +++ b/bl1/bl1_main.c @@ -177,13 +177,13 @@ INFO("BL1: Loading BL2\n"); -#if LOAD_IMAGE_V2 - err = bl1_plat_handle_pre_image_load(); + err = bl1_plat_handle_pre_image_load(BL2_IMAGE_ID); if (err) { ERROR("Failure in pre image load handling of BL2 (%d)\n", err); plat_error_handler(err); } +#if LOAD_IMAGE_V2 err = load_auth_image(BL2_IMAGE_ID, image_info); #else /* Load the BL2 image */ @@ -200,14 +200,14 @@ plat_error_handler(err); } -#if LOAD_IMAGE_V2 /* Allow platform to handle image information. */ - err = bl1_plat_handle_post_image_load(); + err = bl1_plat_handle_post_image_load(BL2_IMAGE_ID); if (err) { ERROR("Failure in post image load handling of BL2 (%d)\n", err); plat_error_handler(err); } +#if LOAD_IMAGE_V2 /* * Create a new layout of memory for BL2 as seen by BL1 i.e. * tell it the amount of total and free memory available. diff --git a/bl2/bl2.mk b/bl2/bl2.mk index 9d75286..a856fb7 100644 --- a/bl2/bl2.mk +++ b/bl2/bl2.mk @@ -29,7 +29,6 @@ else BL2_SOURCES += bl2/${ARCH}/bl2_el3_entrypoint.S \ bl2/${ARCH}/bl2_el3_exceptions.S \ - plat/common/plat_bl2_el3_common.c \ lib/cpus/${ARCH}/cpu_helpers.S \ lib/cpus/errata_report.c BL2_LINKERFILE := bl2/bl2_el3.ld.S diff --git a/docs/porting-guide.rst b/docs/porting-guide.rst index de05e03..71c7a93 100644 --- a/docs/porting-guide.rst +++ b/docs/porting-guide.rst @@ -1264,24 +1264,24 @@ :: - Argument : void + Argument : unsigned int image_id Return : int This function can be used by the platforms to update/use image information -for BL2. This function is currently invoked in BL1 before loading BL2, -when LOAD\_IMAGE\_V2 is enabled. +corresponding to ``image_id``. This function is invoked in BL1, both in cold +boot and FWU code path, before loading the image. Function : bl1\_plat\_handle\_post\_image\_load() [optional] ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ :: - Argument : void + Argument : unsigned int image_id Return : int This function can be used by the platforms to update/use image information -for BL2. This function is currently invoked in BL1 after loading BL2, -when LOAD\_IMAGE\_V2 is enabled. +corresponding to ``image_id``. This function is invoked in BL1, both in cold +boot and FWU code path, after loading and authenticating the image. Function : bl1\_plat\_fwu\_done() [optional] ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ diff --git a/include/plat/common/platform.h b/include/plat/common/platform.h index e2f1cfd..5c06725 100644 --- a/include/plat/common/platform.h +++ b/include/plat/common/platform.h @@ -155,15 +155,12 @@ */ __dead2 void bl1_plat_fwu_done(void *client_cookie, void *reserved); -#if LOAD_IMAGE_V2 /* - * This function can be used by the platforms to update/use image - * information for BL2. + * This BL1 function can be used by the platforms to update/use image + * information for a given `image_id`. */ -int bl1_plat_handle_pre_image_load(void); -int bl1_plat_handle_post_image_load(void); - -#endif /* LOAD_IMAGE_V2 */ +int bl1_plat_handle_pre_image_load(unsigned int image_id); +int bl1_plat_handle_post_image_load(unsigned int image_id); /******************************************************************************* * Mandatory BL2 functions diff --git a/plat/common/plat_bl1_common.c b/plat/common/plat_bl1_common.c index b92cf54..cee34ae 100644 --- a/plat/common/plat_bl1_common.c +++ b/plat/common/plat_bl1_common.c @@ -9,6 +9,7 @@ #include #include #include +#include #include /* @@ -21,6 +22,8 @@ #pragma weak bl1_plat_set_ep_info #pragma weak bl1_plat_get_image_desc #pragma weak bl1_plat_fwu_done +#pragma weak bl1_plat_handle_pre_image_load +#pragma weak bl1_plat_handle_post_image_load unsigned int bl1_plat_get_next_image_id(void) @@ -35,6 +38,16 @@ } +int bl1_plat_handle_pre_image_load(unsigned int image_id) +{ + return 0; +} + +int bl1_plat_handle_post_image_load(unsigned int image_id) +{ + return 0; +} + /* * Following is the default definition that always * returns BL2 image details. diff --git a/plat/common/plat_bl2_el3_common.c b/plat/common/plat_bl2_el3_common.c deleted file mode 100644 index 358a02d..0000000 --- a/plat/common/plat_bl2_el3_common.c +++ /dev/null @@ -1,24 +0,0 @@ -/* - * Copyright (c) 2017, ARM Limited and Contributors. All rights reserved. - * - * SPDX-License-Identifier: BSD-3-Clause - */ - -#include -#include -#include -#include -#include -#include - -/* - * The following platform functions are weakly defined. They - * are default implementations that allow BL2 to compile in - * absence of real definitions. The Platforms may override - * with more complex definitions. - */ -#pragma weak bl2_el3_plat_prepare_exit - -void bl2_el3_plat_prepare_exit(void) -{ -} diff --git a/plat/common/plat_bl_common.c b/plat/common/plat_bl_common.c new file mode 100644 index 0000000..4123df3 --- /dev/null +++ b/plat/common/plat_bl_common.c @@ -0,0 +1,51 @@ +/* + * Copyright (c) 2018, ARM Limited and Contributors. All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#include +#include +#include +#include +#include + +/* + * The following platform functions are weakly defined. The Platforms + * may redefine with strong definition. + */ +#pragma weak bl2_el3_plat_prepare_exit +#pragma weak plat_error_handler +#pragma weak bl2_plat_preload_setup +#pragma weak bl2_plat_handle_pre_image_load +#pragma weak bl2_plat_handle_post_image_load +#pragma weak plat_try_next_boot_source + +void bl2_el3_plat_prepare_exit(void) +{ +} + +void __dead2 plat_error_handler(int err) +{ + while (1) + wfi(); +} + +void bl2_plat_preload_setup(void) +{ +} + +int bl2_plat_handle_pre_image_load(unsigned int image_id) +{ + return 0; +} + +int bl2_plat_handle_post_image_load(unsigned int image_id) +{ + return 0; +} + +int plat_try_next_boot_source(void) +{ + return 0; +} diff --git a/plat/common/platform_helpers_default.c b/plat/common/platform_helpers_default.c deleted file mode 100644 index ce1a731..0000000 --- a/plat/common/platform_helpers_default.c +++ /dev/null @@ -1,55 +0,0 @@ -/* - * Copyright (c) 2013-2018, ARM Limited and Contributors. All rights reserved. - * - * SPDX-License-Identifier: BSD-3-Clause - */ - -#include -#include - -/* - * Placeholder functions which can be redefined by each platfrom. - */ - -#pragma weak plat_error_handler -#pragma weak bl1_plat_handle_pre_image_load -#pragma weak bl1_plat_handle_post_image_load -#pragma weak bl2_plat_preload_setup -#pragma weak bl2_plat_handle_pre_image_load -#pragma weak bl2_plat_handle_post_image_load -#pragma weak plat_try_next_boot_source - -void __dead2 plat_error_handler(int err) -{ - while (1) - wfi(); -} - -int bl1_plat_handle_pre_image_load(void) -{ - return 0; -} - -int bl1_plat_handle_post_image_load(void) -{ - return 0; -} - -void bl2_plat_preload_setup(void) -{ -} - -int bl2_plat_handle_pre_image_load(unsigned int image_id) -{ - return 0; -} - -int bl2_plat_handle_post_image_load(unsigned int image_id) -{ - return 0; -} - -int plat_try_next_boot_source(void) -{ - return 0; -}