/* * Copyright (c) 2016-2019, ARM Limited and Contributors. All rights reserved. * * SPDX-License-Identifier: BSD-3-Clause */ #include #include #include #include #include #include #include .globl bl1_vector_table .globl bl1_entrypoint /* ----------------------------------------------------- * Setup the vector table to support SVC & MON mode. * ----------------------------------------------------- */ vector_base bl1_vector_table b bl1_entrypoint b report_exception /* Undef */ b bl1_aarch32_smc_handler /* SMC call */ b report_exception /* Prefetch abort */ b report_exception /* Data abort */ b report_exception /* Reserved */ b report_exception /* IRQ */ b report_exception /* FIQ */ /* ----------------------------------------------------- * bl1_entrypoint() is the entry point into the trusted * firmware code when a cpu is released from warm or * cold reset. * ----------------------------------------------------- */ func bl1_entrypoint /* --------------------------------------------------------------------- * If the reset address is programmable then bl1_entrypoint() is * executed only on the cold boot path. Therefore, we can skip the warm * boot mailbox mechanism. * --------------------------------------------------------------------- */ 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=bl1_vector_table /* ----------------------------------------------------- * Perform BL1 setup * ----------------------------------------------------- */ bl bl1_setup /* ----------------------------------------------------- * Jump to main function. * ----------------------------------------------------- */ bl bl1_main /* ----------------------------------------------------- * Jump to next image. * ----------------------------------------------------- */ /* * Get the smc_context for next BL image, * program the gp/system registers and save it in `r4`. */ bl smc_get_next_ctx mov r4, r0 /* Only turn-off MMU if going to secure world */ ldr r5, [r4, #SMC_CTX_SCR] tst r5, #SCR_NS_BIT bne skip_mmu_off /* * MMU needs to be disabled because both BL1 and BL2/BL2U execute * in PL1, and therefore share the same address space. * BL2/BL2U will initialize the address space according to its * own requirement. */ bl disable_mmu_icache_secure stcopr r0, TLBIALL dsb sy isb skip_mmu_off: /* Restore smc_context from `r4` and exit secure monitor mode. */ mov r0, r4 monitor_exit endfunc bl1_entrypoint