14f6ad66aSAchin Gupta /* 2ec7c29abSBoyan Karatotev * Copyright (c) 2013-2025, 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> 14758ccb80SChris Kay #include <common/build_message.h> 1509d40e0eSAntonio Nino Diaz #include <common/debug.h> 1609d40e0eSAntonio Nino Diaz #include <drivers/auth/auth_mod.h> 170aa0b3afSManish V Badarkhe #include <drivers/auth/crypto_mod.h> 1809d40e0eSAntonio Nino Diaz #include <drivers/console.h> 19396b339dSManish V Badarkhe #include <drivers/fwu/fwu.h> 20ed8f06ddSthagon01-arm #include <lib/bootmarker_capture.h> 21ed108b56SAlexei Fedorov #include <lib/extensions/pauth.h> 22ed8f06ddSthagon01-arm #include <lib/pmf/pmf.h> 2309d40e0eSAntonio Nino Diaz #include <plat/common/platform.h> 2409d40e0eSAntonio Nino Diaz 255b827a8fSDan Handley #include "bl2_private.h" 264f6ad66aSAchin Gupta 27402b3cf8SJulius Werner #ifdef __aarch64__ 28b1d27b48SRoberto Vargas #define NEXT_IMAGE "BL31" 29402b3cf8SJulius Werner #else 30402b3cf8SJulius Werner #define NEXT_IMAGE "BL32" 31b1d27b48SRoberto Vargas #endif 3293d81d64SSandrine Bailleux 33ed8f06ddSthagon01-arm #if ENABLE_RUNTIME_INSTRUMENTATION 34ed8f06ddSthagon01-arm PMF_REGISTER_SERVICE(bl_svc, PMF_RT_INSTR_SVC_ID, 35ed8f06ddSthagon01-arm BL_TOTAL_IDS, PMF_DUMP_ENABLE); 36ed8f06ddSthagon01-arm #endif 37ed8f06ddSthagon01-arm 3893d81d64SSandrine Bailleux /******************************************************************************* 39*d158d425SBoyan Karatotev * The only thing to do in BL2 is to load further images and pass control to 40*d158d425SBoyan Karatotev * next BL. The memory occupied by BL2 will be reclaimed by BL3x stages. 41dcbfa11bSAntonio Nino Diaz ******************************************************************************/ 42*d158d425SBoyan Karatotev void __no_pauth bl2_main(u_register_t arg0, u_register_t arg1, u_register_t arg2, 43dcbfa11bSAntonio Nino Diaz u_register_t arg3) 44dcbfa11bSAntonio Nino Diaz { 45*d158d425SBoyan Karatotev entry_point_info_t *next_bl_ep_info; 46*d158d425SBoyan Karatotev 47ae770fedSYann Gautier /* Enable early console if EARLY_CONSOLE flag is enabled */ 48ae770fedSYann Gautier plat_setup_early_console(); 49*d158d425SBoyan Karatotev #if RESET_TO_BL2 50ae770fedSYann Gautier 51dcbfa11bSAntonio Nino Diaz /* Perform early platform-specific setup */ 52dcbfa11bSAntonio Nino Diaz bl2_el3_early_platform_setup(arg0, arg1, arg2, arg3); 53dcbfa11bSAntonio Nino Diaz 54dcbfa11bSAntonio Nino Diaz /* Perform late platform-specific setup */ 55dcbfa11bSAntonio Nino Diaz bl2_el3_plat_arch_setup(); 5642d4d3baSArvind Ram Prakash #else /* RESET_TO_BL2 */ 576c09af9fSZelalem Aweke /* Perform early platform-specific setup */ 586c09af9fSZelalem Aweke bl2_early_platform_setup2(arg0, arg1, arg2, arg3); 596c09af9fSZelalem Aweke 606c09af9fSZelalem Aweke /* Perform late platform-specific setup */ 616c09af9fSZelalem Aweke bl2_plat_arch_setup(); 6242d4d3baSArvind Ram Prakash #endif /* RESET_TO_BL2 */ 63dcbfa11bSAntonio Nino Diaz 64*d158d425SBoyan Karatotev if (is_feat_pauth_supported()) { 65*d158d425SBoyan Karatotev #if BL2_RUNS_AT_EL3 66*d158d425SBoyan Karatotev pauth_init_enable_el3(); 67*d158d425SBoyan Karatotev #else 68*d158d425SBoyan Karatotev pauth_init_enable_el1(); 69*d158d425SBoyan Karatotev #endif 70*d158d425SBoyan Karatotev } 7193d81d64SSandrine Bailleux 72ed8f06ddSthagon01-arm #if ENABLE_RUNTIME_INSTRUMENTATION 73ed8f06ddSthagon01-arm PMF_CAPTURE_TIMESTAMP(bl_svc, BL2_ENTRY, PMF_CACHE_MAINT); 74ed8f06ddSthagon01-arm #endif 75ed8f06ddSthagon01-arm 76758ccb80SChris Kay NOTICE("BL2: %s\n", build_version_string); 776ad2e461SDan Handley NOTICE("BL2: %s\n", build_message); 786ad2e461SDan Handley 7993d81d64SSandrine Bailleux /* Perform remaining generic architectural setup in S-EL1 */ 8093d81d64SSandrine Bailleux bl2_arch_setup(); 8193d81d64SSandrine Bailleux 82396b339dSManish V Badarkhe #if PSA_FWU_SUPPORT 83396b339dSManish V Badarkhe fwu_init(); 84396b339dSManish V Badarkhe #endif /* PSA_FWU_SUPPORT */ 85396b339dSManish V Badarkhe 860aa0b3afSManish V Badarkhe crypto_mod_init(); 870aa0b3afSManish V Badarkhe 88dec840afSJuan Castillo /* Initialize authentication module */ 891779ba6bSJuan Castillo auth_mod_init(); 90dec840afSJuan Castillo 9147bf3ac3SManish V Badarkhe /* Initialize the Measured Boot backend */ 9247bf3ac3SManish V Badarkhe bl2_plat_mboot_init(); 9347bf3ac3SManish V Badarkhe 943f498b0dSAlexei Fedorov /* Initialize boot source */ 9501f62b6dSRoberto Vargas bl2_plat_preload_setup(); 9601f62b6dSRoberto Vargas 9742019bf4SYatharth Kochar /* Load the subsequent bootloader images. */ 9842019bf4SYatharth Kochar next_bl_ep_info = bl2_load_images(); 99ef538c6fSJuan Castillo 10047bf3ac3SManish V Badarkhe /* Teardown the Measured Boot backend */ 10147bf3ac3SManish V Badarkhe bl2_plat_mboot_finish(); 1023f498b0dSAlexei Fedorov 103055c97afSLauren Wehrmeister crypto_mod_finish(); 104055c97afSLauren Wehrmeister 10542d4d3baSArvind Ram Prakash #if !BL2_RUNS_AT_EL3 106402b3cf8SJulius Werner #ifndef __aarch64__ 107d48c12e9SYatharth Kochar /* 108d48c12e9SYatharth Kochar * For AArch32 state BL1 and BL2 share the MMU setup. 109d48c12e9SYatharth Kochar * Given that BL2 does not map BL1 regions, MMU needs 110d48c12e9SYatharth Kochar * to be disabled in order to go back to BL1. 111d48c12e9SYatharth Kochar */ 112d48c12e9SYatharth Kochar disable_mmu_icache_secure(); 113402b3cf8SJulius Werner #endif /* !__aarch64__ */ 114d48c12e9SYatharth Kochar 115ed108b56SAlexei Fedorov /* 116ed108b56SAlexei Fedorov * Disable pointer authentication before running next boot image 117ed108b56SAlexei Fedorov */ 1188d9f5f25SBoyan Karatotev if (is_feat_pauth_supported()) { 119ed108b56SAlexei Fedorov pauth_disable_el1(); 1208d9f5f25SBoyan Karatotev } 121ed108b56SAlexei Fedorov 122ed8f06ddSthagon01-arm #if ENABLE_RUNTIME_INSTRUMENTATION 123ed8f06ddSthagon01-arm PMF_CAPTURE_TIMESTAMP(bl_svc, BL2_EXIT, PMF_CACHE_MAINT); 124ed8f06ddSthagon01-arm #endif 125ed8f06ddSthagon01-arm 126ed8f06ddSthagon01-arm console_flush(); 127ed8f06ddSthagon01-arm 12893d81d64SSandrine Bailleux /* 12942019bf4SYatharth Kochar * Run next BL image via an SMC to BL1. Information on how to pass 13042019bf4SYatharth Kochar * control to the BL32 (if present) and BL33 software images will 13142019bf4SYatharth Kochar * be passed to next BL image as an argument. 13293d81d64SSandrine Bailleux */ 13342019bf4SYatharth Kochar smc(BL1_SMC_RUN_IMAGE, (unsigned long)next_bl_ep_info, 0, 0, 0, 0, 0, 0); 13442d4d3baSArvind Ram Prakash #else /* if BL2_RUNS_AT_EL3 */ 13542d4d3baSArvind Ram Prakash 136b1d27b48SRoberto Vargas NOTICE("BL2: Booting " NEXT_IMAGE "\n"); 137b1d27b48SRoberto Vargas print_entry_point_info(next_bl_ep_info); 138ed8f06ddSthagon01-arm #if ENABLE_RUNTIME_INSTRUMENTATION 139ed8f06ddSthagon01-arm PMF_CAPTURE_TIMESTAMP(bl_svc, BL2_EXIT, PMF_CACHE_MAINT); 140ed8f06ddSthagon01-arm #endif 141b1d27b48SRoberto Vargas console_flush(); 142b1d27b48SRoberto Vargas 143ed108b56SAlexei Fedorov /* 144ed108b56SAlexei Fedorov * Disable pointer authentication before running next boot image 145ed108b56SAlexei Fedorov */ 1468d9f5f25SBoyan Karatotev if (is_feat_pauth_supported()) { 147ed108b56SAlexei Fedorov pauth_disable_el3(); 1488d9f5f25SBoyan Karatotev } 149ed108b56SAlexei Fedorov 150b1d27b48SRoberto Vargas bl2_run_next_image(next_bl_ep_info); 15142d4d3baSArvind Ram Prakash #endif /* BL2_RUNS_AT_EL3 */ 1524f6ad66aSAchin Gupta } 153