14f6ad66aSAchin Gupta /* 2*0aa0b3afSManish V Badarkhe * Copyright (c) 2013-2022, 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> 16*0aa0b3afSManish V Badarkhe #include <drivers/auth/crypto_mod.h> 1709d40e0eSAntonio Nino Diaz #include <drivers/console.h> 18396b339dSManish V Badarkhe #include <drivers/fwu/fwu.h> 19ed108b56SAlexei Fedorov #include <lib/extensions/pauth.h> 2009d40e0eSAntonio Nino Diaz #include <plat/common/platform.h> 2109d40e0eSAntonio Nino Diaz 225b827a8fSDan Handley #include "bl2_private.h" 234f6ad66aSAchin Gupta 24402b3cf8SJulius Werner #ifdef __aarch64__ 25b1d27b48SRoberto Vargas #define NEXT_IMAGE "BL31" 26402b3cf8SJulius Werner #else 27402b3cf8SJulius Werner #define NEXT_IMAGE "BL32" 28b1d27b48SRoberto Vargas #endif 2993d81d64SSandrine Bailleux 306c09af9fSZelalem Aweke #if BL2_AT_EL3 3193d81d64SSandrine Bailleux /******************************************************************************* 326c09af9fSZelalem Aweke * Setup function for BL2 when BL2_AT_EL3=1 33dcbfa11bSAntonio Nino Diaz ******************************************************************************/ 34dcbfa11bSAntonio Nino Diaz void bl2_el3_setup(u_register_t arg0, u_register_t arg1, u_register_t arg2, 35dcbfa11bSAntonio Nino Diaz u_register_t arg3) 36dcbfa11bSAntonio Nino Diaz { 37dcbfa11bSAntonio Nino Diaz /* Perform early platform-specific setup */ 38dcbfa11bSAntonio Nino Diaz bl2_el3_early_platform_setup(arg0, arg1, arg2, arg3); 39dcbfa11bSAntonio Nino Diaz 40dcbfa11bSAntonio Nino Diaz /* Perform late platform-specific setup */ 41dcbfa11bSAntonio Nino Diaz bl2_el3_plat_arch_setup(); 42ed108b56SAlexei Fedorov 43ed108b56SAlexei Fedorov #if CTX_INCLUDE_PAUTH_REGS 44ed108b56SAlexei Fedorov /* 45ed108b56SAlexei Fedorov * Assert that the ARMv8.3-PAuth registers are present or an access 46ed108b56SAlexei Fedorov * fault will be triggered when they are being saved or restored. 47ed108b56SAlexei Fedorov */ 48ed108b56SAlexei Fedorov assert(is_armv8_3_pauth_present()); 49ed108b56SAlexei Fedorov #endif /* CTX_INCLUDE_PAUTH_REGS */ 50dcbfa11bSAntonio Nino Diaz } 516c09af9fSZelalem Aweke #else /* BL2_AT_EL3 */ 526c09af9fSZelalem Aweke /******************************************************************************* 536c09af9fSZelalem Aweke * Setup function for BL2 when BL2_AT_EL3=0 546c09af9fSZelalem Aweke ******************************************************************************/ 556c09af9fSZelalem Aweke void bl2_setup(u_register_t arg0, u_register_t arg1, u_register_t arg2, 566c09af9fSZelalem Aweke u_register_t arg3) 576c09af9fSZelalem Aweke { 586c09af9fSZelalem Aweke /* Perform early platform-specific setup */ 596c09af9fSZelalem Aweke bl2_early_platform_setup2(arg0, arg1, arg2, arg3); 606c09af9fSZelalem Aweke 616c09af9fSZelalem Aweke /* Perform late platform-specific setup */ 626c09af9fSZelalem Aweke bl2_plat_arch_setup(); 636c09af9fSZelalem Aweke 646c09af9fSZelalem Aweke #if CTX_INCLUDE_PAUTH_REGS 656c09af9fSZelalem Aweke /* 666c09af9fSZelalem Aweke * Assert that the ARMv8.3-PAuth registers are present or an access 676c09af9fSZelalem Aweke * fault will be triggered when they are being saved or restored. 686c09af9fSZelalem Aweke */ 696c09af9fSZelalem Aweke assert(is_armv8_3_pauth_present()); 706c09af9fSZelalem Aweke #endif /* CTX_INCLUDE_PAUTH_REGS */ 716c09af9fSZelalem Aweke } 72dcbfa11bSAntonio Nino Diaz #endif /* BL2_AT_EL3 */ 73dcbfa11bSAntonio Nino Diaz 749d93fc2fSAntonio Nino Diaz /******************************************************************************* 7593d81d64SSandrine Bailleux * The only thing to do in BL2 is to load further images and pass control to 7642019bf4SYatharth Kochar * next BL. The memory occupied by BL2 will be reclaimed by BL3x stages. BL2 7742019bf4SYatharth Kochar * runs entirely in S-EL1. 7893d81d64SSandrine Bailleux ******************************************************************************/ 7993d81d64SSandrine Bailleux void bl2_main(void) 8093d81d64SSandrine Bailleux { 8142019bf4SYatharth Kochar entry_point_info_t *next_bl_ep_info; 8293d81d64SSandrine Bailleux 836ad2e461SDan Handley NOTICE("BL2: %s\n", version_string); 846ad2e461SDan Handley NOTICE("BL2: %s\n", build_message); 856ad2e461SDan Handley 8693d81d64SSandrine Bailleux /* Perform remaining generic architectural setup in S-EL1 */ 8793d81d64SSandrine Bailleux bl2_arch_setup(); 8893d81d64SSandrine Bailleux 89396b339dSManish V Badarkhe #if PSA_FWU_SUPPORT 90396b339dSManish V Badarkhe fwu_init(); 91396b339dSManish V Badarkhe #endif /* PSA_FWU_SUPPORT */ 92396b339dSManish V Badarkhe 93*0aa0b3afSManish V Badarkhe crypto_mod_init(); 94*0aa0b3afSManish V Badarkhe 95dec840afSJuan Castillo /* Initialize authentication module */ 961779ba6bSJuan Castillo auth_mod_init(); 97dec840afSJuan Castillo 9847bf3ac3SManish V Badarkhe /* Initialize the Measured Boot backend */ 9947bf3ac3SManish V Badarkhe bl2_plat_mboot_init(); 10047bf3ac3SManish V Badarkhe 1013f498b0dSAlexei Fedorov /* Initialize boot source */ 10201f62b6dSRoberto Vargas bl2_plat_preload_setup(); 10301f62b6dSRoberto Vargas 10442019bf4SYatharth Kochar /* Load the subsequent bootloader images. */ 10542019bf4SYatharth Kochar next_bl_ep_info = bl2_load_images(); 106ef538c6fSJuan Castillo 10747bf3ac3SManish V Badarkhe /* Teardown the Measured Boot backend */ 10847bf3ac3SManish V Badarkhe bl2_plat_mboot_finish(); 1093f498b0dSAlexei Fedorov 1106c09af9fSZelalem Aweke #if !BL2_AT_EL3 && !ENABLE_RME 111402b3cf8SJulius Werner #ifndef __aarch64__ 112d48c12e9SYatharth Kochar /* 113d48c12e9SYatharth Kochar * For AArch32 state BL1 and BL2 share the MMU setup. 114d48c12e9SYatharth Kochar * Given that BL2 does not map BL1 regions, MMU needs 115d48c12e9SYatharth Kochar * to be disabled in order to go back to BL1. 116d48c12e9SYatharth Kochar */ 117d48c12e9SYatharth Kochar disable_mmu_icache_secure(); 118402b3cf8SJulius Werner #endif /* !__aarch64__ */ 119d48c12e9SYatharth Kochar 1200b32628eSAntonio Nino Diaz console_flush(); 1210b32628eSAntonio Nino Diaz 122ed108b56SAlexei Fedorov #if ENABLE_PAUTH 123ed108b56SAlexei Fedorov /* 124ed108b56SAlexei Fedorov * Disable pointer authentication before running next boot image 125ed108b56SAlexei Fedorov */ 126ed108b56SAlexei Fedorov pauth_disable_el1(); 127ed108b56SAlexei Fedorov #endif /* ENABLE_PAUTH */ 128ed108b56SAlexei Fedorov 12993d81d64SSandrine Bailleux /* 13042019bf4SYatharth Kochar * Run next BL image via an SMC to BL1. Information on how to pass 13142019bf4SYatharth Kochar * control to the BL32 (if present) and BL33 software images will 13242019bf4SYatharth Kochar * be passed to next BL image as an argument. 13393d81d64SSandrine Bailleux */ 13442019bf4SYatharth Kochar smc(BL1_SMC_RUN_IMAGE, (unsigned long)next_bl_ep_info, 0, 0, 0, 0, 0, 0); 1356c09af9fSZelalem Aweke #else /* if BL2_AT_EL3 || ENABLE_RME */ 136b1d27b48SRoberto Vargas NOTICE("BL2: Booting " NEXT_IMAGE "\n"); 137b1d27b48SRoberto Vargas print_entry_point_info(next_bl_ep_info); 138b1d27b48SRoberto Vargas console_flush(); 139b1d27b48SRoberto Vargas 140ed108b56SAlexei Fedorov #if ENABLE_PAUTH 141ed108b56SAlexei Fedorov /* 142ed108b56SAlexei Fedorov * Disable pointer authentication before running next boot image 143ed108b56SAlexei Fedorov */ 144ed108b56SAlexei Fedorov pauth_disable_el3(); 145ed108b56SAlexei Fedorov #endif /* ENABLE_PAUTH */ 146ed108b56SAlexei Fedorov 147b1d27b48SRoberto Vargas bl2_run_next_image(next_bl_ep_info); 1486c09af9fSZelalem Aweke #endif /* BL2_AT_EL3 && ENABLE_RME */ 1494f6ad66aSAchin Gupta } 150