mirror of
https://github.com/ARM-software/arm-trusted-firmware.git
synced 2026-07-06 23:51:23 +00:00
All BLs have a bl_setup() for things that need to happen early, a fall back into assembly and then bl_main() for the main functionality. This was necessary in order to fiddle with PAuth related things that tend to break C calls. Since then PAuth's enablement has seen a lot of refactoring and this is now worked around cleanly so the distinction can be removed. The only tradeoff is that this requires pauth to not be used for the top-level main function. There are two main benefits to doing this: First, code is easier to understand as it's all together and the entrypoint is smaller. Second, the compiler gets to see more of the code and apply optimisations (importantly LTO). Change-Id: Iddb93551115a2048988017547eb7b8db441dbd37 Signed-off-by: Boyan Karatotev <boyan.karatotev@arm.com>
153 lines
3.8 KiB
C
153 lines
3.8 KiB
C
/*
|
|
* Copyright (c) 2013-2025, Arm Limited and Contributors. All rights reserved.
|
|
*
|
|
* SPDX-License-Identifier: BSD-3-Clause
|
|
*/
|
|
|
|
#include <assert.h>
|
|
|
|
#include <arch_helpers.h>
|
|
#include <arch_features.h>
|
|
#include <bl1/bl1.h>
|
|
#include <bl2/bl2.h>
|
|
#include <common/bl_common.h>
|
|
#include <common/build_message.h>
|
|
#include <common/debug.h>
|
|
#include <drivers/auth/auth_mod.h>
|
|
#include <drivers/auth/crypto_mod.h>
|
|
#include <drivers/console.h>
|
|
#include <drivers/fwu/fwu.h>
|
|
#include <lib/bootmarker_capture.h>
|
|
#include <lib/extensions/pauth.h>
|
|
#include <lib/pmf/pmf.h>
|
|
#include <plat/common/platform.h>
|
|
|
|
#include "bl2_private.h"
|
|
|
|
#ifdef __aarch64__
|
|
#define NEXT_IMAGE "BL31"
|
|
#else
|
|
#define NEXT_IMAGE "BL32"
|
|
#endif
|
|
|
|
#if ENABLE_RUNTIME_INSTRUMENTATION
|
|
PMF_REGISTER_SERVICE(bl_svc, PMF_RT_INSTR_SVC_ID,
|
|
BL_TOTAL_IDS, PMF_DUMP_ENABLE);
|
|
#endif
|
|
|
|
/*******************************************************************************
|
|
* The only thing to do in BL2 is to load further images and pass control to
|
|
* next BL. The memory occupied by BL2 will be reclaimed by BL3x stages.
|
|
******************************************************************************/
|
|
void __no_pauth bl2_main(u_register_t arg0, u_register_t arg1, u_register_t arg2,
|
|
u_register_t arg3)
|
|
{
|
|
entry_point_info_t *next_bl_ep_info;
|
|
|
|
/* Enable early console if EARLY_CONSOLE flag is enabled */
|
|
plat_setup_early_console();
|
|
#if RESET_TO_BL2
|
|
|
|
/* Perform early platform-specific setup */
|
|
bl2_el3_early_platform_setup(arg0, arg1, arg2, arg3);
|
|
|
|
/* Perform late platform-specific setup */
|
|
bl2_el3_plat_arch_setup();
|
|
#else /* RESET_TO_BL2 */
|
|
/* Perform early platform-specific setup */
|
|
bl2_early_platform_setup2(arg0, arg1, arg2, arg3);
|
|
|
|
/* Perform late platform-specific setup */
|
|
bl2_plat_arch_setup();
|
|
#endif /* RESET_TO_BL2 */
|
|
|
|
if (is_feat_pauth_supported()) {
|
|
#if BL2_RUNS_AT_EL3
|
|
pauth_init_enable_el3();
|
|
#else
|
|
pauth_init_enable_el1();
|
|
#endif
|
|
}
|
|
|
|
#if ENABLE_RUNTIME_INSTRUMENTATION
|
|
PMF_CAPTURE_TIMESTAMP(bl_svc, BL2_ENTRY, PMF_CACHE_MAINT);
|
|
#endif
|
|
|
|
NOTICE("BL2: %s\n", build_version_string);
|
|
NOTICE("BL2: %s\n", build_message);
|
|
|
|
/* Perform remaining generic architectural setup in S-EL1 */
|
|
bl2_arch_setup();
|
|
|
|
#if PSA_FWU_SUPPORT
|
|
fwu_init();
|
|
#endif /* PSA_FWU_SUPPORT */
|
|
|
|
crypto_mod_init();
|
|
|
|
/* Initialize authentication module */
|
|
auth_mod_init();
|
|
|
|
/* Initialize the Measured Boot backend */
|
|
bl2_plat_mboot_init();
|
|
|
|
/* Initialize boot source */
|
|
bl2_plat_preload_setup();
|
|
|
|
/* Load the subsequent bootloader images. */
|
|
next_bl_ep_info = bl2_load_images();
|
|
|
|
/* Teardown the Measured Boot backend */
|
|
bl2_plat_mboot_finish();
|
|
|
|
crypto_mod_finish();
|
|
|
|
#if !BL2_RUNS_AT_EL3
|
|
#ifndef __aarch64__
|
|
/*
|
|
* For AArch32 state BL1 and BL2 share the MMU setup.
|
|
* Given that BL2 does not map BL1 regions, MMU needs
|
|
* to be disabled in order to go back to BL1.
|
|
*/
|
|
disable_mmu_icache_secure();
|
|
#endif /* !__aarch64__ */
|
|
|
|
/*
|
|
* Disable pointer authentication before running next boot image
|
|
*/
|
|
if (is_feat_pauth_supported()) {
|
|
pauth_disable_el1();
|
|
}
|
|
|
|
#if ENABLE_RUNTIME_INSTRUMENTATION
|
|
PMF_CAPTURE_TIMESTAMP(bl_svc, BL2_EXIT, PMF_CACHE_MAINT);
|
|
#endif
|
|
|
|
console_flush();
|
|
|
|
/*
|
|
* Run next BL image via an SMC to BL1. Information on how to pass
|
|
* control to the BL32 (if present) and BL33 software images will
|
|
* be passed to next BL image as an argument.
|
|
*/
|
|
smc(BL1_SMC_RUN_IMAGE, (unsigned long)next_bl_ep_info, 0, 0, 0, 0, 0, 0);
|
|
#else /* if BL2_RUNS_AT_EL3 */
|
|
|
|
NOTICE("BL2: Booting " NEXT_IMAGE "\n");
|
|
print_entry_point_info(next_bl_ep_info);
|
|
#if ENABLE_RUNTIME_INSTRUMENTATION
|
|
PMF_CAPTURE_TIMESTAMP(bl_svc, BL2_EXIT, PMF_CACHE_MAINT);
|
|
#endif
|
|
console_flush();
|
|
|
|
/*
|
|
* Disable pointer authentication before running next boot image
|
|
*/
|
|
if (is_feat_pauth_supported()) {
|
|
pauth_disable_el3();
|
|
}
|
|
|
|
bl2_run_next_image(next_bl_ep_info);
|
|
#endif /* BL2_RUNS_AT_EL3 */
|
|
}
|