• David Cunado's avatar
    Fully initialise essential control registers · 18f2efd6
    David Cunado authored
    
    This patch updates the el3_arch_init_common macro so that it fully
    initialises essential control registers rather then relying on hardware
    to set the reset values.
    
    The context management functions are also updated to fully initialise
    the appropriate control registers when initialising the non-secure and
    secure context structures and when preparing to leave EL3 for a lower
    EL.
    
    This gives better alignement with the ARM ARM which states that software
    must initialise RES0 and RES1 fields with 0 / 1.
    
    This patch also corrects the following typos:
    
    "NASCR definitions" -> "NSACR definitions"
    
    Change-Id: Ia8940b8351dc27bc09e2138b011e249655041cfc
    Signed-off-by: default avatarDavid Cunado <david.cunado@arm.com>
    18f2efd6
bl1_entrypoint.S 2.81 KB
/*
 * Copyright (c) 2016-2017, ARM Limited and Contributors. All rights reserved.
 *
 * SPDX-License-Identifier: BSD-3-Clause
 */

#include <arch.h>
#include <asm_macros.S>
#include <bl_common.h>
#include <context.h>
#include <el3_common_macros.S>
#include <smcc_helpers.h>
#include <smcc_macros.S>

	.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 early platform setup & platform
	 * specific early arch. setup e.g. mmu setup
	 * -----------------------------------------------------
	 */
	bl	bl1_early_platform_setup
	bl	bl1_plat_arch_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