mirror of
https://github.com/ARM-software/arm-trusted-firmware.git
synced 2025-04-18 10:34:19 +00:00

When ENABLE_RUNTIME_INSTRUMENTATION flag is set timestamps are captured and output to the fvp console at various boot stages using the PMF library (which are based on aarch timers). Timestamps are captured at entry and exit points for Bl1, Bl2 and, Bl3 respectively. Change-Id: I7c0c502e5dbf73d711700b2fe0085ca3eb9346d2 Signed-off-by: Thaddeus Serna <Thaddeus.Gonzalez-Serna@arm.com>
169 lines
4.5 KiB
C
169 lines
4.5 KiB
C
/*
|
|
* Copyright (c) 2013-2023, 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/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
|
|
|
|
#if RESET_TO_BL2
|
|
/*******************************************************************************
|
|
* Setup function for BL2 when RESET_TO_BL2=1
|
|
******************************************************************************/
|
|
void bl2_el3_setup(u_register_t arg0, u_register_t arg1, u_register_t arg2,
|
|
u_register_t arg3)
|
|
{
|
|
/* Perform early platform-specific setup */
|
|
bl2_el3_early_platform_setup(arg0, arg1, arg2, arg3);
|
|
|
|
/* Perform late platform-specific setup */
|
|
bl2_el3_plat_arch_setup();
|
|
|
|
#if CTX_INCLUDE_PAUTH_REGS
|
|
/*
|
|
* Assert that the ARMv8.3-PAuth registers are present or an access
|
|
* fault will be triggered when they are being saved or restored.
|
|
*/
|
|
assert(is_armv8_3_pauth_present());
|
|
#endif /* CTX_INCLUDE_PAUTH_REGS */
|
|
}
|
|
#else /* RESET_TO_BL2 */
|
|
|
|
/*******************************************************************************
|
|
* Setup function for BL2 when RESET_TO_BL2=0
|
|
******************************************************************************/
|
|
void bl2_setup(u_register_t arg0, u_register_t arg1, u_register_t arg2,
|
|
u_register_t arg3)
|
|
{
|
|
/* Perform early platform-specific setup */
|
|
bl2_early_platform_setup2(arg0, arg1, arg2, arg3);
|
|
|
|
/* Perform late platform-specific setup */
|
|
bl2_plat_arch_setup();
|
|
|
|
#if CTX_INCLUDE_PAUTH_REGS
|
|
/*
|
|
* Assert that the ARMv8.3-PAuth registers are present or an access
|
|
* fault will be triggered when they are being saved or restored.
|
|
*/
|
|
assert(is_armv8_3_pauth_present());
|
|
#endif /* CTX_INCLUDE_PAUTH_REGS */
|
|
}
|
|
#endif /* RESET_TO_BL2 */
|
|
|
|
/*******************************************************************************
|
|
* 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. BL2
|
|
* runs entirely in S-EL1.
|
|
******************************************************************************/
|
|
void bl2_main(void)
|
|
{
|
|
entry_point_info_t *next_bl_ep_info;
|
|
|
|
#if ENABLE_RUNTIME_INSTRUMENTATION
|
|
PMF_CAPTURE_TIMESTAMP(bl_svc, BL2_ENTRY, PMF_CACHE_MAINT);
|
|
#endif
|
|
|
|
NOTICE("BL2: %s\n", 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();
|
|
|
|
#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__ */
|
|
|
|
#if ENABLE_PAUTH
|
|
/*
|
|
* Disable pointer authentication before running next boot image
|
|
*/
|
|
pauth_disable_el1();
|
|
#endif /* ENABLE_PAUTH */
|
|
|
|
#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();
|
|
|
|
#if ENABLE_PAUTH
|
|
/*
|
|
* Disable pointer authentication before running next boot image
|
|
*/
|
|
pauth_disable_el3();
|
|
#endif /* ENABLE_PAUTH */
|
|
|
|
bl2_run_next_image(next_bl_ep_info);
|
|
#endif /* BL2_RUNS_AT_EL3 */
|
|
}
|