mirror of
https://github.com/CTCaer/switch-l4t-atf.git
synced 2025-01-06 10:18:55 +00:00
47bf3ac31e
Right now, the measured boot driver is strongly coupled with the TCG event log driver. It would not be possible to push the measurements somewhere else, for instance to a physical TPM. To enable this latter use case, turn the driver's init and teardown functions into platform hooks. Call them bl2_plat_mboot_init()/finish(). This allows each platform to implement them appropriately, depending on the type of measured boot backend they use. For example, on a platform with a physical TPM, the plat_mboot_init() hook would startup the TPM and setup it underlying bus (e.g. SPI). Move the current implementation of the init and teardown function to the FVP platform layer. Finally move the conditional compilation logic (#if MEASURED_BOOT) out of bl2_main() to improve its readability. Provide a dummy implementation in the case measured boot is not included in the build. Change-Id: Ib6474cb5a9c1e3d4a30c7f228431b22d1a6e85e3 Signed-off-by: Sandrine Bailleux <sandrine.bailleux@arm.com> Signed-off-by: Manish V Badarkhe <Manish.Badarkhe@arm.com>
149 lines
4.1 KiB
C
149 lines
4.1 KiB
C
/*
|
|
* Copyright (c) 2013-2021, 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/console.h>
|
|
#include <drivers/fwu/fwu.h>
|
|
#include <lib/extensions/pauth.h>
|
|
#include <plat/common/platform.h>
|
|
|
|
#include "bl2_private.h"
|
|
|
|
#ifdef __aarch64__
|
|
#define NEXT_IMAGE "BL31"
|
|
#else
|
|
#define NEXT_IMAGE "BL32"
|
|
#endif
|
|
|
|
#if BL2_AT_EL3
|
|
/*******************************************************************************
|
|
* Setup function for BL2 when BL2_AT_EL3=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 /* BL2_AT_EL3 */
|
|
/*******************************************************************************
|
|
* Setup function for BL2 when BL2_AT_EL3=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 /* BL2_AT_EL3 */
|
|
|
|
/*******************************************************************************
|
|
* 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;
|
|
|
|
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 */
|
|
|
|
#if TRUSTED_BOARD_BOOT
|
|
/* Initialize authentication module */
|
|
auth_mod_init();
|
|
#endif /* TRUSTED_BOARD_BOOT */
|
|
|
|
/* 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_AT_EL3 && !ENABLE_RME
|
|
#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__ */
|
|
|
|
console_flush();
|
|
|
|
#if ENABLE_PAUTH
|
|
/*
|
|
* Disable pointer authentication before running next boot image
|
|
*/
|
|
pauth_disable_el1();
|
|
#endif /* ENABLE_PAUTH */
|
|
|
|
/*
|
|
* 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_AT_EL3 || ENABLE_RME */
|
|
NOTICE("BL2: Booting " NEXT_IMAGE "\n");
|
|
print_entry_point_info(next_bl_ep_info);
|
|
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_AT_EL3 && ENABLE_RME */
|
|
}
|