diff options
author | Sandrine Bailleux <sandrine.bailleux@arm.com> | 2015-03-26 11:07:09 +0000 |
---|---|---|
committer | Dan Handley <dan.handley@arm.com> | 2015-04-13 17:10:46 +0100 |
commit | bcb79b9041ebe08a18c67181798f4c139786bb27 (patch) | |
tree | 647fdabd3f19e67f32932a14e6a60b6d97e524c1 /bl2 | |
parent | 9c7eecce726c2089494a4e4b31374a34a34ec7f0 (diff) |
Panic if platform specific BL3-0 handling fails
The return value of bl2_plat_handle_bl30() used to be ignored.
This patch modifies the function load_bl30() so that it now
checks this return value and returns it to bl2_main().
This patch also unifies the error handling code across the
load_blx() functions so that they return a status code in all
cases and bl2_main() has the sole responsibility of panicking
if appropriate.
Change-Id: I2b26cdf65afa443b48c7da1fa7da8db956071bfb
Diffstat (limited to 'bl2')
-rw-r--r-- | bl2/bl2_main.c | 129 |
1 files changed, 68 insertions, 61 deletions
diff --git a/bl2/bl2_main.c b/bl2/bl2_main.c index 29ca0a5a..fb79f042 100644 --- a/bl2/bl2_main.c +++ b/bl2/bl2_main.c @@ -205,23 +205,28 @@ static int load_bl30(void) &bl30_image_info, NULL); - if (e == 0) { + if (e) + return e; + #if TRUSTED_BOARD_BOOT - e = auth_verify_obj(AUTH_BL30_IMG, - bl30_image_info.image_base, - bl30_image_info.image_size); - if (e) { - ERROR("Failed to authenticate BL3-0 image.\n"); - panic(); - } - - /* After working with data, invalidate the data cache */ - inv_dcache_range(bl30_image_info.image_base, - (size_t)bl30_image_info.image_size); + e = auth_verify_obj(AUTH_BL30_IMG, + bl30_image_info.image_base, + bl30_image_info.image_size); + if (e) { + ERROR("Failed to authenticate BL3-0 image.\n"); + return e; + } + + /* After working with data, invalidate the data cache */ + inv_dcache_range(bl30_image_info.image_base, + (size_t)bl30_image_info.image_size); #endif /* TRUSTED_BOARD_BOOT */ - /* The subsequent handling of BL3-0 is platform specific */ - bl2_plat_handle_bl30(&bl30_image_info); + /* The subsequent handling of BL3-0 is platform specific */ + e = bl2_plat_handle_bl30(&bl30_image_info); + if (e) { + ERROR("Failure in platform-specific handling of BL3-0 image.\n"); + return e; } #endif /* BL30_BASE */ @@ -256,25 +261,25 @@ static int load_bl31(bl31_params_t *bl2_to_bl31_params, BL31_BASE, bl2_to_bl31_params->bl31_image_info, bl31_ep_info); + if (e) + return e; - if (e == 0) { #if TRUSTED_BOARD_BOOT - e = auth_verify_obj(AUTH_BL31_IMG, - bl2_to_bl31_params->bl31_image_info->image_base, - bl2_to_bl31_params->bl31_image_info->image_size); - if (e) { - ERROR("Failed to authenticate BL3-1 image.\n"); - panic(); - } - - /* After working with data, invalidate the data cache */ - inv_dcache_range(bl2_to_bl31_params->bl31_image_info->image_base, + e = auth_verify_obj(AUTH_BL31_IMG, + bl2_to_bl31_params->bl31_image_info->image_base, + bl2_to_bl31_params->bl31_image_info->image_size); + if (e) { + ERROR("Failed to authenticate BL3-1 image.\n"); + return e; + } + + /* After working with data, invalidate the data cache */ + inv_dcache_range(bl2_to_bl31_params->bl31_image_info->image_base, (size_t)bl2_to_bl31_params->bl31_image_info->image_size); #endif /* TRUSTED_BOARD_BOOT */ - bl2_plat_set_bl31_ep_info(bl2_to_bl31_params->bl31_image_info, - bl31_ep_info); - } + bl2_plat_set_bl31_ep_info(bl2_to_bl31_params->bl31_image_info, + bl31_ep_info); return e; } @@ -309,30 +314,31 @@ static int load_bl32(bl31_params_t *bl2_to_bl31_params) bl2_to_bl31_params->bl32_image_info, bl2_to_bl31_params->bl32_ep_info); - if (e == 0) { + if (e) + return e; + #if TRUSTED_BOARD_BOOT - /* Image is present. Check if there is a valid certificate */ - if (bl32_cert_error) { - ERROR("Failed to authenticate BL3-2 certificates.\n"); - panic(); - } - - e = auth_verify_obj(AUTH_BL32_IMG, - bl2_to_bl31_params->bl32_image_info->image_base, - bl2_to_bl31_params->bl32_image_info->image_size); - if (e) { - ERROR("Failed to authenticate BL3-2 image.\n"); - panic(); - } - /* After working with data, invalidate the data cache */ - inv_dcache_range(bl2_to_bl31_params->bl32_image_info->image_base, + /* Image is present. Check if there is a valid certificate */ + if (bl32_cert_error) { + ERROR("Failed to authenticate BL3-2 certificates.\n"); + return bl32_cert_error; + } + + e = auth_verify_obj(AUTH_BL32_IMG, + bl2_to_bl31_params->bl32_image_info->image_base, + bl2_to_bl31_params->bl32_image_info->image_size); + if (e) { + ERROR("Failed to authenticate BL3-2 image.\n"); + return e; + } + /* After working with data, invalidate the data cache */ + inv_dcache_range(bl2_to_bl31_params->bl32_image_info->image_base, (size_t)bl2_to_bl31_params->bl32_image_info->image_size); #endif /* TRUSTED_BOARD_BOOT */ - bl2_plat_set_bl32_ep_info( - bl2_to_bl31_params->bl32_image_info, - bl2_to_bl31_params->bl32_ep_info); - } + bl2_plat_set_bl32_ep_info( + bl2_to_bl31_params->bl32_image_info, + bl2_to_bl31_params->bl32_ep_info); #endif /* BL32_BASE */ return e; @@ -361,23 +367,24 @@ static int load_bl33(bl31_params_t *bl2_to_bl31_params) bl2_to_bl31_params->bl33_image_info, bl2_to_bl31_params->bl33_ep_info); - if (e == 0) { + if (e) + return e; + #if TRUSTED_BOARD_BOOT - e = auth_verify_obj(AUTH_BL33_IMG, - bl2_to_bl31_params->bl33_image_info->image_base, - bl2_to_bl31_params->bl33_image_info->image_size); - if (e) { - ERROR("Failed to authenticate BL3-3 image.\n"); - panic(); - } - /* After working with data, invalidate the data cache */ - inv_dcache_range(bl2_to_bl31_params->bl33_image_info->image_base, + e = auth_verify_obj(AUTH_BL33_IMG, + bl2_to_bl31_params->bl33_image_info->image_base, + bl2_to_bl31_params->bl33_image_info->image_size); + if (e) { + ERROR("Failed to authenticate BL3-3 image.\n"); + return e; + } + /* After working with data, invalidate the data cache */ + inv_dcache_range(bl2_to_bl31_params->bl33_image_info->image_base, (size_t)bl2_to_bl31_params->bl33_image_info->image_size); #endif /* TRUSTED_BOARD_BOOT */ - bl2_plat_set_bl33_ep_info(bl2_to_bl31_params->bl33_image_info, - bl2_to_bl31_params->bl33_ep_info); - } + bl2_plat_set_bl33_ep_info(bl2_to_bl31_params->bl33_image_info, + bl2_to_bl31_params->bl33_ep_info); return e; } |