/* * Copyright (c) 2017-2019, ARM Limited and Contributors. All rights reserved. * * SPDX-License-Identifier: BSD-3-Clause */ #include #include #include #include .globl bl2_entrypoint .globl bl2_run_next_image func bl2_entrypoint /* Save arguments x0-x3 from previous Boot loader */ mov r9, r0 mov r10, r1 mov r11, r2 mov r12, r3 el3_entrypoint_common \ _init_sctlr=1 \ _warm_boot_mailbox=!PROGRAMMABLE_RESET_ADDRESS \ _secondary_cold_boot=!COLD_BOOT_SINGLE_CPU \ _init_memory=1 \ _init_c_runtime=1 \ _exception_vectors=bl2_vector_table /* * Restore parameters of boot rom */ mov r0, r9 mov r1, r10 mov r2, r11 mov r3, r12 /* --------------------------------------------- * Perform BL2 setup * --------------------------------------------- */ bl bl2_el3_setup /* --------------------------------------------- * Jump to main function. * --------------------------------------------- */ bl bl2_main /* --------------------------------------------- * Should never reach this point. * --------------------------------------------- */ no_ret plat_panic_handler endfunc bl2_entrypoint func bl2_run_next_image mov r8,r0 /* * MMU needs to be disabled because both BL2 and BL32 execute * in PL1, and therefore share the same address space. * BL32 will initialize the address space according to its * own requirement. */ bl disable_mmu_icache_secure stcopr r0, TLBIALL dsb sy isb mov r0, r8 bl bl2_el3_plat_prepare_exit /* * Extract PC and SPSR based on struct `entry_point_info_t` * and load it in LR and SPSR registers respectively. */ ldr lr, [r8, #ENTRY_POINT_INFO_PC_OFFSET] ldr r1, [r8, #(ENTRY_POINT_INFO_PC_OFFSET + 4)] msr spsr_xc, r1 /* Some BL32 stages expect lr_svc to provide the BL33 entry address */ cps #MODE32_svc ldr lr, [r8, #ENTRY_POINT_INFO_LR_SVC_OFFSET] cps #MODE32_mon add r8, r8, #ENTRY_POINT_INFO_ARGS_OFFSET ldm r8, {r0, r1, r2, r3} exception_return endfunc bl2_run_next_image