14f6ad66aSAchin Gupta /* 2*ae770fedSYann Gautier * Copyright (c) 2013-2024, Arm Limited and Contributors. All rights reserved. 34f6ad66aSAchin Gupta * 482cb2c1aSdp-arm * SPDX-License-Identifier: BSD-3-Clause 54f6ad66aSAchin Gupta */ 64f6ad66aSAchin Gupta 7ed108b56SAlexei Fedorov #include <assert.h> 8ed108b56SAlexei Fedorov 94f6ad66aSAchin Gupta #include <arch_helpers.h> 10ed108b56SAlexei Fedorov #include <arch_features.h> 1109d40e0eSAntonio Nino Diaz #include <bl1/bl1.h> 1209d40e0eSAntonio Nino Diaz #include <bl2/bl2.h> 1309d40e0eSAntonio Nino Diaz #include <common/bl_common.h> 1409d40e0eSAntonio Nino Diaz #include <common/debug.h> 1509d40e0eSAntonio Nino Diaz #include <drivers/auth/auth_mod.h> 160aa0b3afSManish V Badarkhe #include <drivers/auth/crypto_mod.h> 1709d40e0eSAntonio Nino Diaz #include <drivers/console.h> 18396b339dSManish V Badarkhe #include <drivers/fwu/fwu.h> 19ed8f06ddSthagon01-arm #include <lib/bootmarker_capture.h> 20ed108b56SAlexei Fedorov #include <lib/extensions/pauth.h> 21ed8f06ddSthagon01-arm #include <lib/pmf/pmf.h> 2209d40e0eSAntonio Nino Diaz #include <plat/common/platform.h> 2309d40e0eSAntonio Nino Diaz 245b827a8fSDan Handley #include "bl2_private.h" 254f6ad66aSAchin Gupta 26402b3cf8SJulius Werner #ifdef __aarch64__ 27b1d27b48SRoberto Vargas #define NEXT_IMAGE "BL31" 28402b3cf8SJulius Werner #else 29402b3cf8SJulius Werner #define NEXT_IMAGE "BL32" 30b1d27b48SRoberto Vargas #endif 3193d81d64SSandrine Bailleux 32ed8f06ddSthagon01-arm #if ENABLE_RUNTIME_INSTRUMENTATION 33ed8f06ddSthagon01-arm PMF_REGISTER_SERVICE(bl_svc, PMF_RT_INSTR_SVC_ID, 34ed8f06ddSthagon01-arm BL_TOTAL_IDS, PMF_DUMP_ENABLE); 35ed8f06ddSthagon01-arm #endif 36ed8f06ddSthagon01-arm 3742d4d3baSArvind Ram Prakash #if RESET_TO_BL2 3893d81d64SSandrine Bailleux /******************************************************************************* 3942d4d3baSArvind Ram Prakash * Setup function for BL2 when RESET_TO_BL2=1 40dcbfa11bSAntonio Nino Diaz ******************************************************************************/ 41dcbfa11bSAntonio Nino Diaz void bl2_el3_setup(u_register_t arg0, u_register_t arg1, u_register_t arg2, 42dcbfa11bSAntonio Nino Diaz u_register_t arg3) 43dcbfa11bSAntonio Nino Diaz { 44*ae770fedSYann Gautier /* Enable early console if EARLY_CONSOLE flag is enabled */ 45*ae770fedSYann Gautier plat_setup_early_console(); 46*ae770fedSYann Gautier 47dcbfa11bSAntonio Nino Diaz /* Perform early platform-specific setup */ 48dcbfa11bSAntonio Nino Diaz bl2_el3_early_platform_setup(arg0, arg1, arg2, arg3); 49dcbfa11bSAntonio Nino Diaz 50dcbfa11bSAntonio Nino Diaz /* Perform late platform-specific setup */ 51dcbfa11bSAntonio Nino Diaz bl2_el3_plat_arch_setup(); 52ed108b56SAlexei Fedorov 53ed108b56SAlexei Fedorov #if CTX_INCLUDE_PAUTH_REGS 54ed108b56SAlexei Fedorov /* 55ed108b56SAlexei Fedorov * Assert that the ARMv8.3-PAuth registers are present or an access 56ed108b56SAlexei Fedorov * fault will be triggered when they are being saved or restored. 57ed108b56SAlexei Fedorov */ 58ed108b56SAlexei Fedorov assert(is_armv8_3_pauth_present()); 59ed108b56SAlexei Fedorov #endif /* CTX_INCLUDE_PAUTH_REGS */ 60dcbfa11bSAntonio Nino Diaz } 6142d4d3baSArvind Ram Prakash #else /* RESET_TO_BL2 */ 6242d4d3baSArvind Ram Prakash 636c09af9fSZelalem Aweke /******************************************************************************* 6442d4d3baSArvind Ram Prakash * Setup function for BL2 when RESET_TO_BL2=0 656c09af9fSZelalem Aweke ******************************************************************************/ 666c09af9fSZelalem Aweke void bl2_setup(u_register_t arg0, u_register_t arg1, u_register_t arg2, 676c09af9fSZelalem Aweke u_register_t arg3) 686c09af9fSZelalem Aweke { 69*ae770fedSYann Gautier /* Enable early console if EARLY_CONSOLE flag is enabled */ 70*ae770fedSYann Gautier plat_setup_early_console(); 71*ae770fedSYann Gautier 726c09af9fSZelalem Aweke /* Perform early platform-specific setup */ 736c09af9fSZelalem Aweke bl2_early_platform_setup2(arg0, arg1, arg2, arg3); 746c09af9fSZelalem Aweke 756c09af9fSZelalem Aweke /* Perform late platform-specific setup */ 766c09af9fSZelalem Aweke bl2_plat_arch_setup(); 776c09af9fSZelalem Aweke 786c09af9fSZelalem Aweke #if CTX_INCLUDE_PAUTH_REGS 796c09af9fSZelalem Aweke /* 806c09af9fSZelalem Aweke * Assert that the ARMv8.3-PAuth registers are present or an access 816c09af9fSZelalem Aweke * fault will be triggered when they are being saved or restored. 826c09af9fSZelalem Aweke */ 836c09af9fSZelalem Aweke assert(is_armv8_3_pauth_present()); 846c09af9fSZelalem Aweke #endif /* CTX_INCLUDE_PAUTH_REGS */ 856c09af9fSZelalem Aweke } 8642d4d3baSArvind Ram Prakash #endif /* RESET_TO_BL2 */ 87dcbfa11bSAntonio Nino Diaz 889d93fc2fSAntonio Nino Diaz /******************************************************************************* 8993d81d64SSandrine Bailleux * The only thing to do in BL2 is to load further images and pass control to 9042019bf4SYatharth Kochar * next BL. The memory occupied by BL2 will be reclaimed by BL3x stages. BL2 9142019bf4SYatharth Kochar * runs entirely in S-EL1. 9293d81d64SSandrine Bailleux ******************************************************************************/ 9393d81d64SSandrine Bailleux void bl2_main(void) 9493d81d64SSandrine Bailleux { 9542019bf4SYatharth Kochar entry_point_info_t *next_bl_ep_info; 9693d81d64SSandrine Bailleux 97ed8f06ddSthagon01-arm #if ENABLE_RUNTIME_INSTRUMENTATION 98ed8f06ddSthagon01-arm PMF_CAPTURE_TIMESTAMP(bl_svc, BL2_ENTRY, PMF_CACHE_MAINT); 99ed8f06ddSthagon01-arm #endif 100ed8f06ddSthagon01-arm 1016ad2e461SDan Handley NOTICE("BL2: %s\n", version_string); 1026ad2e461SDan Handley NOTICE("BL2: %s\n", build_message); 1036ad2e461SDan Handley 10493d81d64SSandrine Bailleux /* Perform remaining generic architectural setup in S-EL1 */ 10593d81d64SSandrine Bailleux bl2_arch_setup(); 10693d81d64SSandrine Bailleux 107396b339dSManish V Badarkhe #if PSA_FWU_SUPPORT 108396b339dSManish V Badarkhe fwu_init(); 109396b339dSManish V Badarkhe #endif /* PSA_FWU_SUPPORT */ 110396b339dSManish V Badarkhe 1110aa0b3afSManish V Badarkhe crypto_mod_init(); 1120aa0b3afSManish V Badarkhe 113dec840afSJuan Castillo /* Initialize authentication module */ 1141779ba6bSJuan Castillo auth_mod_init(); 115dec840afSJuan Castillo 11647bf3ac3SManish V Badarkhe /* Initialize the Measured Boot backend */ 11747bf3ac3SManish V Badarkhe bl2_plat_mboot_init(); 11847bf3ac3SManish V Badarkhe 1193f498b0dSAlexei Fedorov /* Initialize boot source */ 12001f62b6dSRoberto Vargas bl2_plat_preload_setup(); 12101f62b6dSRoberto Vargas 12242019bf4SYatharth Kochar /* Load the subsequent bootloader images. */ 12342019bf4SYatharth Kochar next_bl_ep_info = bl2_load_images(); 124ef538c6fSJuan Castillo 12547bf3ac3SManish V Badarkhe /* Teardown the Measured Boot backend */ 12647bf3ac3SManish V Badarkhe bl2_plat_mboot_finish(); 1273f498b0dSAlexei Fedorov 12842d4d3baSArvind Ram Prakash #if !BL2_RUNS_AT_EL3 129402b3cf8SJulius Werner #ifndef __aarch64__ 130d48c12e9SYatharth Kochar /* 131d48c12e9SYatharth Kochar * For AArch32 state BL1 and BL2 share the MMU setup. 132d48c12e9SYatharth Kochar * Given that BL2 does not map BL1 regions, MMU needs 133d48c12e9SYatharth Kochar * to be disabled in order to go back to BL1. 134d48c12e9SYatharth Kochar */ 135d48c12e9SYatharth Kochar disable_mmu_icache_secure(); 136402b3cf8SJulius Werner #endif /* !__aarch64__ */ 137d48c12e9SYatharth Kochar 138ed108b56SAlexei Fedorov #if ENABLE_PAUTH 139ed108b56SAlexei Fedorov /* 140ed108b56SAlexei Fedorov * Disable pointer authentication before running next boot image 141ed108b56SAlexei Fedorov */ 142ed108b56SAlexei Fedorov pauth_disable_el1(); 143ed108b56SAlexei Fedorov #endif /* ENABLE_PAUTH */ 144ed108b56SAlexei Fedorov 145ed8f06ddSthagon01-arm #if ENABLE_RUNTIME_INSTRUMENTATION 146ed8f06ddSthagon01-arm PMF_CAPTURE_TIMESTAMP(bl_svc, BL2_EXIT, PMF_CACHE_MAINT); 147ed8f06ddSthagon01-arm #endif 148ed8f06ddSthagon01-arm 149ed8f06ddSthagon01-arm console_flush(); 150ed8f06ddSthagon01-arm 15193d81d64SSandrine Bailleux /* 15242019bf4SYatharth Kochar * Run next BL image via an SMC to BL1. Information on how to pass 15342019bf4SYatharth Kochar * control to the BL32 (if present) and BL33 software images will 15442019bf4SYatharth Kochar * be passed to next BL image as an argument. 15593d81d64SSandrine Bailleux */ 15642019bf4SYatharth Kochar smc(BL1_SMC_RUN_IMAGE, (unsigned long)next_bl_ep_info, 0, 0, 0, 0, 0, 0); 15742d4d3baSArvind Ram Prakash #else /* if BL2_RUNS_AT_EL3 */ 15842d4d3baSArvind Ram Prakash 159b1d27b48SRoberto Vargas NOTICE("BL2: Booting " NEXT_IMAGE "\n"); 160b1d27b48SRoberto Vargas print_entry_point_info(next_bl_ep_info); 161ed8f06ddSthagon01-arm #if ENABLE_RUNTIME_INSTRUMENTATION 162ed8f06ddSthagon01-arm PMF_CAPTURE_TIMESTAMP(bl_svc, BL2_EXIT, PMF_CACHE_MAINT); 163ed8f06ddSthagon01-arm #endif 164b1d27b48SRoberto Vargas console_flush(); 165b1d27b48SRoberto Vargas 166ed108b56SAlexei Fedorov #if ENABLE_PAUTH 167ed108b56SAlexei Fedorov /* 168ed108b56SAlexei Fedorov * Disable pointer authentication before running next boot image 169ed108b56SAlexei Fedorov */ 170ed108b56SAlexei Fedorov pauth_disable_el3(); 171ed108b56SAlexei Fedorov #endif /* ENABLE_PAUTH */ 172ed108b56SAlexei Fedorov 173b1d27b48SRoberto Vargas bl2_run_next_image(next_bl_ep_info); 17442d4d3baSArvind Ram Prakash #endif /* BL2_RUNS_AT_EL3 */ 1754f6ad66aSAchin Gupta } 176