14f6ad66aSAchin Gupta /* 2*396b339dSManish V Badarkhe * Copyright (c) 2013-2021, 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> 1609d40e0eSAntonio Nino Diaz #include <drivers/console.h> 17*396b339dSManish V Badarkhe #include <drivers/fwu/fwu.h> 183f498b0dSAlexei Fedorov #if MEASURED_BOOT 193f498b0dSAlexei Fedorov #include <drivers/measured_boot/measured_boot.h> 203f498b0dSAlexei Fedorov #endif 21ed108b56SAlexei Fedorov #include <lib/extensions/pauth.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 32dcbfa11bSAntonio Nino Diaz #if !BL2_AT_EL3 3393d81d64SSandrine Bailleux /******************************************************************************* 349d93fc2fSAntonio Nino Diaz * Setup function for BL2. 359d93fc2fSAntonio Nino Diaz ******************************************************************************/ 369d93fc2fSAntonio Nino Diaz void bl2_setup(u_register_t arg0, u_register_t arg1, u_register_t arg2, 379d93fc2fSAntonio Nino Diaz u_register_t arg3) 389d93fc2fSAntonio Nino Diaz { 399d93fc2fSAntonio Nino Diaz /* Perform early platform-specific setup */ 409d93fc2fSAntonio Nino Diaz bl2_early_platform_setup2(arg0, arg1, arg2, arg3); 419d93fc2fSAntonio Nino Diaz 429d93fc2fSAntonio Nino Diaz /* Perform late platform-specific setup */ 439d93fc2fSAntonio Nino Diaz bl2_plat_arch_setup(); 44ed108b56SAlexei Fedorov 45ed108b56SAlexei Fedorov #if CTX_INCLUDE_PAUTH_REGS 46ed108b56SAlexei Fedorov /* 47ed108b56SAlexei Fedorov * Assert that the ARMv8.3-PAuth registers are present or an access 48ed108b56SAlexei Fedorov * fault will be triggered when they are being saved or restored. 49ed108b56SAlexei Fedorov */ 50ed108b56SAlexei Fedorov assert(is_armv8_3_pauth_present()); 51ed108b56SAlexei Fedorov #endif /* CTX_INCLUDE_PAUTH_REGS */ 529d93fc2fSAntonio Nino Diaz } 539d93fc2fSAntonio Nino Diaz 54dcbfa11bSAntonio Nino Diaz #else /* if BL2_AT_EL3 */ 55dcbfa11bSAntonio Nino Diaz /******************************************************************************* 56dcbfa11bSAntonio Nino Diaz * Setup function for BL2 when BL2_AT_EL3=1. 57dcbfa11bSAntonio Nino Diaz ******************************************************************************/ 58dcbfa11bSAntonio Nino Diaz void bl2_el3_setup(u_register_t arg0, u_register_t arg1, u_register_t arg2, 59dcbfa11bSAntonio Nino Diaz u_register_t arg3) 60dcbfa11bSAntonio Nino Diaz { 61dcbfa11bSAntonio Nino Diaz /* Perform early platform-specific setup */ 62dcbfa11bSAntonio Nino Diaz bl2_el3_early_platform_setup(arg0, arg1, arg2, arg3); 63dcbfa11bSAntonio Nino Diaz 64dcbfa11bSAntonio Nino Diaz /* Perform late platform-specific setup */ 65dcbfa11bSAntonio Nino Diaz bl2_el3_plat_arch_setup(); 66ed108b56SAlexei Fedorov 67ed108b56SAlexei Fedorov #if CTX_INCLUDE_PAUTH_REGS 68ed108b56SAlexei Fedorov /* 69ed108b56SAlexei Fedorov * Assert that the ARMv8.3-PAuth registers are present or an access 70ed108b56SAlexei Fedorov * fault will be triggered when they are being saved or restored. 71ed108b56SAlexei Fedorov */ 72ed108b56SAlexei Fedorov assert(is_armv8_3_pauth_present()); 73ed108b56SAlexei Fedorov #endif /* CTX_INCLUDE_PAUTH_REGS */ 74dcbfa11bSAntonio Nino Diaz } 75dcbfa11bSAntonio Nino Diaz #endif /* BL2_AT_EL3 */ 76dcbfa11bSAntonio Nino Diaz 779d93fc2fSAntonio Nino Diaz /******************************************************************************* 7893d81d64SSandrine Bailleux * The only thing to do in BL2 is to load further images and pass control to 7942019bf4SYatharth Kochar * next BL. The memory occupied by BL2 will be reclaimed by BL3x stages. BL2 8042019bf4SYatharth Kochar * runs entirely in S-EL1. 8193d81d64SSandrine Bailleux ******************************************************************************/ 8293d81d64SSandrine Bailleux void bl2_main(void) 8393d81d64SSandrine Bailleux { 8442019bf4SYatharth Kochar entry_point_info_t *next_bl_ep_info; 8593d81d64SSandrine Bailleux 866ad2e461SDan Handley NOTICE("BL2: %s\n", version_string); 876ad2e461SDan Handley NOTICE("BL2: %s\n", build_message); 886ad2e461SDan Handley 8993d81d64SSandrine Bailleux /* Perform remaining generic architectural setup in S-EL1 */ 9093d81d64SSandrine Bailleux bl2_arch_setup(); 9193d81d64SSandrine Bailleux 92*396b339dSManish V Badarkhe #if PSA_FWU_SUPPORT 93*396b339dSManish V Badarkhe fwu_init(); 94*396b339dSManish V Badarkhe #endif /* PSA_FWU_SUPPORT */ 95*396b339dSManish V Badarkhe 96dec840afSJuan Castillo #if TRUSTED_BOARD_BOOT 97dec840afSJuan Castillo /* Initialize authentication module */ 981779ba6bSJuan Castillo auth_mod_init(); 993f498b0dSAlexei Fedorov 1003f498b0dSAlexei Fedorov #if MEASURED_BOOT 1013f498b0dSAlexei Fedorov /* Initialize measured boot module */ 1023f498b0dSAlexei Fedorov measured_boot_init(); 1033f498b0dSAlexei Fedorov 1043f498b0dSAlexei Fedorov #endif /* MEASURED_BOOT */ 105dec840afSJuan Castillo #endif /* TRUSTED_BOARD_BOOT */ 106dec840afSJuan Castillo 1073f498b0dSAlexei Fedorov /* Initialize boot source */ 10801f62b6dSRoberto Vargas bl2_plat_preload_setup(); 10901f62b6dSRoberto Vargas 11042019bf4SYatharth Kochar /* Load the subsequent bootloader images. */ 11142019bf4SYatharth Kochar next_bl_ep_info = bl2_load_images(); 112ef538c6fSJuan Castillo 1133f498b0dSAlexei Fedorov #if MEASURED_BOOT 1143f498b0dSAlexei Fedorov /* Finalize measured boot */ 1153f498b0dSAlexei Fedorov measured_boot_finish(); 1163f498b0dSAlexei Fedorov #endif /* MEASURED_BOOT */ 1173f498b0dSAlexei Fedorov 11801a1f7c2SYann Gautier #if !BL2_AT_EL3 119402b3cf8SJulius Werner #ifndef __aarch64__ 120d48c12e9SYatharth Kochar /* 121d48c12e9SYatharth Kochar * For AArch32 state BL1 and BL2 share the MMU setup. 122d48c12e9SYatharth Kochar * Given that BL2 does not map BL1 regions, MMU needs 123d48c12e9SYatharth Kochar * to be disabled in order to go back to BL1. 124d48c12e9SYatharth Kochar */ 125d48c12e9SYatharth Kochar disable_mmu_icache_secure(); 126402b3cf8SJulius Werner #endif /* !__aarch64__ */ 127d48c12e9SYatharth Kochar 1280b32628eSAntonio Nino Diaz console_flush(); 1290b32628eSAntonio Nino Diaz 130ed108b56SAlexei Fedorov #if ENABLE_PAUTH 131ed108b56SAlexei Fedorov /* 132ed108b56SAlexei Fedorov * Disable pointer authentication before running next boot image 133ed108b56SAlexei Fedorov */ 134ed108b56SAlexei Fedorov pauth_disable_el1(); 135ed108b56SAlexei Fedorov #endif /* ENABLE_PAUTH */ 136ed108b56SAlexei Fedorov 13793d81d64SSandrine Bailleux /* 13842019bf4SYatharth Kochar * Run next BL image via an SMC to BL1. Information on how to pass 13942019bf4SYatharth Kochar * control to the BL32 (if present) and BL33 software images will 14042019bf4SYatharth Kochar * be passed to next BL image as an argument. 14193d81d64SSandrine Bailleux */ 14242019bf4SYatharth Kochar smc(BL1_SMC_RUN_IMAGE, (unsigned long)next_bl_ep_info, 0, 0, 0, 0, 0, 0); 143dcbfa11bSAntonio Nino Diaz #else /* if BL2_AT_EL3 */ 144b1d27b48SRoberto Vargas NOTICE("BL2: Booting " NEXT_IMAGE "\n"); 145b1d27b48SRoberto Vargas print_entry_point_info(next_bl_ep_info); 146b1d27b48SRoberto Vargas console_flush(); 147b1d27b48SRoberto Vargas 148ed108b56SAlexei Fedorov #if ENABLE_PAUTH 149ed108b56SAlexei Fedorov /* 150ed108b56SAlexei Fedorov * Disable pointer authentication before running next boot image 151ed108b56SAlexei Fedorov */ 152ed108b56SAlexei Fedorov pauth_disable_el3(); 153ed108b56SAlexei Fedorov #endif /* ENABLE_PAUTH */ 154ed108b56SAlexei Fedorov 155b1d27b48SRoberto Vargas bl2_run_next_image(next_bl_ep_info); 156dcbfa11bSAntonio Nino Diaz #endif /* BL2_AT_EL3 */ 1574f6ad66aSAchin Gupta } 158