xref: /rk3399_ARM-atf/include/arch/aarch32/el3_common_macros.S (revision f5478dedf9e096d9539362b38ceb096b940ba3e2)
1*f5478dedSAntonio Nino Diaz/*
2*f5478dedSAntonio Nino Diaz * Copyright (c) 2016-2018, ARM Limited and Contributors. All rights reserved.
3*f5478dedSAntonio Nino Diaz *
4*f5478dedSAntonio Nino Diaz * SPDX-License-Identifier: BSD-3-Clause
5*f5478dedSAntonio Nino Diaz */
6*f5478dedSAntonio Nino Diaz
7*f5478dedSAntonio Nino Diaz#ifndef EL3_COMMON_MACROS_S
8*f5478dedSAntonio Nino Diaz#define EL3_COMMON_MACROS_S
9*f5478dedSAntonio Nino Diaz
10*f5478dedSAntonio Nino Diaz#include <arch.h>
11*f5478dedSAntonio Nino Diaz#include <asm_macros.S>
12*f5478dedSAntonio Nino Diaz#include <assert_macros.S>
13*f5478dedSAntonio Nino Diaz
14*f5478dedSAntonio Nino Diaz	/*
15*f5478dedSAntonio Nino Diaz	 * Helper macro to initialise EL3 registers we care about.
16*f5478dedSAntonio Nino Diaz	 */
17*f5478dedSAntonio Nino Diaz	.macro el3_arch_init_common
18*f5478dedSAntonio Nino Diaz	/* ---------------------------------------------------------------------
19*f5478dedSAntonio Nino Diaz	 * SCTLR has already been initialised - read current value before
20*f5478dedSAntonio Nino Diaz	 * modifying.
21*f5478dedSAntonio Nino Diaz	 *
22*f5478dedSAntonio Nino Diaz	 * SCTLR.I: Enable the instruction cache.
23*f5478dedSAntonio Nino Diaz	 *
24*f5478dedSAntonio Nino Diaz	 * SCTLR.A: Enable Alignment fault checking. All instructions that load
25*f5478dedSAntonio Nino Diaz	 *  or store one or more registers have an alignment check that the
26*f5478dedSAntonio Nino Diaz	 *  address being accessed is aligned to the size of the data element(s)
27*f5478dedSAntonio Nino Diaz	 *  being accessed.
28*f5478dedSAntonio Nino Diaz	 * ---------------------------------------------------------------------
29*f5478dedSAntonio Nino Diaz	 */
30*f5478dedSAntonio Nino Diaz	ldr	r1, =(SCTLR_I_BIT | SCTLR_A_BIT)
31*f5478dedSAntonio Nino Diaz	ldcopr	r0, SCTLR
32*f5478dedSAntonio Nino Diaz	orr	r0, r0, r1
33*f5478dedSAntonio Nino Diaz	stcopr	r0, SCTLR
34*f5478dedSAntonio Nino Diaz	isb
35*f5478dedSAntonio Nino Diaz
36*f5478dedSAntonio Nino Diaz	/* ---------------------------------------------------------------------
37*f5478dedSAntonio Nino Diaz	 * Initialise SCR, setting all fields rather than relying on the hw.
38*f5478dedSAntonio Nino Diaz	 *
39*f5478dedSAntonio Nino Diaz	 * SCR.SIF: Enabled so that Secure state instruction fetches from
40*f5478dedSAntonio Nino Diaz	 *  Non-secure memory are not permitted.
41*f5478dedSAntonio Nino Diaz	 * ---------------------------------------------------------------------
42*f5478dedSAntonio Nino Diaz	 */
43*f5478dedSAntonio Nino Diaz	ldr	r0, =(SCR_RESET_VAL | SCR_SIF_BIT)
44*f5478dedSAntonio Nino Diaz	stcopr	r0, SCR
45*f5478dedSAntonio Nino Diaz
46*f5478dedSAntonio Nino Diaz	/* -----------------------------------------------------
47*f5478dedSAntonio Nino Diaz	 * Enable the Asynchronous data abort now that the
48*f5478dedSAntonio Nino Diaz	 * exception vectors have been setup.
49*f5478dedSAntonio Nino Diaz	 * -----------------------------------------------------
50*f5478dedSAntonio Nino Diaz	 */
51*f5478dedSAntonio Nino Diaz	cpsie   a
52*f5478dedSAntonio Nino Diaz	isb
53*f5478dedSAntonio Nino Diaz
54*f5478dedSAntonio Nino Diaz	/* ---------------------------------------------------------------------
55*f5478dedSAntonio Nino Diaz	 * Initialise NSACR, setting all the fields, except for the
56*f5478dedSAntonio Nino Diaz	 * IMPLEMENTATION DEFINED field, rather than relying on the hw. Some
57*f5478dedSAntonio Nino Diaz	 * fields are architecturally UNKNOWN on reset.
58*f5478dedSAntonio Nino Diaz	 *
59*f5478dedSAntonio Nino Diaz	 * NSACR_ENABLE_FP_ACCESS: Represents NSACR.cp11 and NSACR.cp10. The
60*f5478dedSAntonio Nino Diaz	 *  cp11 field is ignored, but is set to same value as cp10. The cp10
61*f5478dedSAntonio Nino Diaz	 *  field is set to allow access to Advanced SIMD and floating point
62*f5478dedSAntonio Nino Diaz	 *  features from both Security states.
63*f5478dedSAntonio Nino Diaz	 * ---------------------------------------------------------------------
64*f5478dedSAntonio Nino Diaz	 */
65*f5478dedSAntonio Nino Diaz	ldcopr	r0, NSACR
66*f5478dedSAntonio Nino Diaz	and	r0, r0, #NSACR_IMP_DEF_MASK
67*f5478dedSAntonio Nino Diaz	orr	r0, r0, #(NSACR_RESET_VAL | NSACR_ENABLE_FP_ACCESS)
68*f5478dedSAntonio Nino Diaz	stcopr	r0, NSACR
69*f5478dedSAntonio Nino Diaz	isb
70*f5478dedSAntonio Nino Diaz
71*f5478dedSAntonio Nino Diaz	/* ---------------------------------------------------------------------
72*f5478dedSAntonio Nino Diaz	 * Initialise CPACR, setting all fields rather than relying on hw. Some
73*f5478dedSAntonio Nino Diaz	 * fields are architecturally UNKNOWN on reset.
74*f5478dedSAntonio Nino Diaz	 *
75*f5478dedSAntonio Nino Diaz	 * CPACR.TRCDIS: Trap control for PL0 and PL1 System register accesses
76*f5478dedSAntonio Nino Diaz	 *  to trace registers. Set to zero to allow access.
77*f5478dedSAntonio Nino Diaz	 *
78*f5478dedSAntonio Nino Diaz	 * CPACR_ENABLE_FP_ACCESS: Represents CPACR.cp11 and CPACR.cp10. The
79*f5478dedSAntonio Nino Diaz	 *  cp11 field is ignored, but is set to same value as cp10. The cp10
80*f5478dedSAntonio Nino Diaz	 *  field is set to allow full access from PL0 and PL1 to floating-point
81*f5478dedSAntonio Nino Diaz	 *  and Advanced SIMD features.
82*f5478dedSAntonio Nino Diaz	 * ---------------------------------------------------------------------
83*f5478dedSAntonio Nino Diaz	 */
84*f5478dedSAntonio Nino Diaz	ldr	r0, =((CPACR_RESET_VAL | CPACR_ENABLE_FP_ACCESS) & ~(TRCDIS_BIT))
85*f5478dedSAntonio Nino Diaz	stcopr	r0, CPACR
86*f5478dedSAntonio Nino Diaz	isb
87*f5478dedSAntonio Nino Diaz
88*f5478dedSAntonio Nino Diaz	/* ---------------------------------------------------------------------
89*f5478dedSAntonio Nino Diaz	 * Initialise FPEXC, setting all fields rather than relying on hw. Some
90*f5478dedSAntonio Nino Diaz	 * fields are architecturally UNKNOWN on reset and are set to zero
91*f5478dedSAntonio Nino Diaz	 * except for field(s) listed below.
92*f5478dedSAntonio Nino Diaz	 *
93*f5478dedSAntonio Nino Diaz	 * FPEXC.EN: Enable access to Advanced SIMD and floating point features
94*f5478dedSAntonio Nino Diaz	 *  from all exception levels.
95*f5478dedSAntonio Nino Diaz	 * ---------------------------------------------------------------------
96*f5478dedSAntonio Nino Diaz	 */
97*f5478dedSAntonio Nino Diaz	ldr	r0, =(FPEXC_RESET_VAL | FPEXC_EN_BIT)
98*f5478dedSAntonio Nino Diaz	vmsr	FPEXC, r0
99*f5478dedSAntonio Nino Diaz	isb
100*f5478dedSAntonio Nino Diaz
101*f5478dedSAntonio Nino Diaz#if (ARM_ARCH_MAJOR > 7)
102*f5478dedSAntonio Nino Diaz	/* ---------------------------------------------------------------------
103*f5478dedSAntonio Nino Diaz	 * Initialise SDCR, setting all the fields rather than relying on hw.
104*f5478dedSAntonio Nino Diaz	 *
105*f5478dedSAntonio Nino Diaz	 * SDCR.SPD: Disable AArch32 privileged debug. Debug exceptions from
106*f5478dedSAntonio Nino Diaz	 * Secure EL1 are disabled.
107*f5478dedSAntonio Nino Diaz	 * ---------------------------------------------------------------------
108*f5478dedSAntonio Nino Diaz	 */
109*f5478dedSAntonio Nino Diaz	ldr	r0, =(SDCR_RESET_VAL | SDCR_SPD(SDCR_SPD_DISABLE))
110*f5478dedSAntonio Nino Diaz	stcopr	r0, SDCR
111*f5478dedSAntonio Nino Diaz#endif
112*f5478dedSAntonio Nino Diaz
113*f5478dedSAntonio Nino Diaz	/*
114*f5478dedSAntonio Nino Diaz	 * If Data Independent Timing (DIT) functionality is implemented,
115*f5478dedSAntonio Nino Diaz	 * always enable DIT in EL3
116*f5478dedSAntonio Nino Diaz	 */
117*f5478dedSAntonio Nino Diaz	ldcopr	r0, ID_PFR0
118*f5478dedSAntonio Nino Diaz	and	r0, r0, #(ID_PFR0_DIT_MASK << ID_PFR0_DIT_SHIFT)
119*f5478dedSAntonio Nino Diaz	cmp	r0, #ID_PFR0_DIT_SUPPORTED
120*f5478dedSAntonio Nino Diaz	bne	1f
121*f5478dedSAntonio Nino Diaz	mrs	r0, cpsr
122*f5478dedSAntonio Nino Diaz	orr	r0, r0, #CPSR_DIT_BIT
123*f5478dedSAntonio Nino Diaz	msr	cpsr_cxsf, r0
124*f5478dedSAntonio Nino Diaz1:
125*f5478dedSAntonio Nino Diaz	.endm
126*f5478dedSAntonio Nino Diaz
127*f5478dedSAntonio Nino Diaz/* -----------------------------------------------------------------------------
128*f5478dedSAntonio Nino Diaz * This is the super set of actions that need to be performed during a cold boot
129*f5478dedSAntonio Nino Diaz * or a warm boot in EL3. This code is shared by BL1 and BL32 (SP_MIN).
130*f5478dedSAntonio Nino Diaz *
131*f5478dedSAntonio Nino Diaz * This macro will always perform reset handling, architectural initialisations
132*f5478dedSAntonio Nino Diaz * and stack setup. The rest of the actions are optional because they might not
133*f5478dedSAntonio Nino Diaz * be needed, depending on the context in which this macro is called. This is
134*f5478dedSAntonio Nino Diaz * why this macro is parameterised ; each parameter allows to enable/disable
135*f5478dedSAntonio Nino Diaz * some actions.
136*f5478dedSAntonio Nino Diaz *
137*f5478dedSAntonio Nino Diaz *  _init_sctlr:
138*f5478dedSAntonio Nino Diaz *	Whether the macro needs to initialise the SCTLR register including
139*f5478dedSAntonio Nino Diaz *	configuring the endianness of data accesses.
140*f5478dedSAntonio Nino Diaz *
141*f5478dedSAntonio Nino Diaz *  _warm_boot_mailbox:
142*f5478dedSAntonio Nino Diaz *	Whether the macro needs to detect the type of boot (cold/warm). The
143*f5478dedSAntonio Nino Diaz *	detection is based on the platform entrypoint address : if it is zero
144*f5478dedSAntonio Nino Diaz *	then it is a cold boot, otherwise it is a warm boot. In the latter case,
145*f5478dedSAntonio Nino Diaz *	this macro jumps on the platform entrypoint address.
146*f5478dedSAntonio Nino Diaz *
147*f5478dedSAntonio Nino Diaz *  _secondary_cold_boot:
148*f5478dedSAntonio Nino Diaz *	Whether the macro needs to identify the CPU that is calling it: primary
149*f5478dedSAntonio Nino Diaz *	CPU or secondary CPU. The primary CPU will be allowed to carry on with
150*f5478dedSAntonio Nino Diaz *	the platform initialisations, while the secondaries will be put in a
151*f5478dedSAntonio Nino Diaz *	platform-specific state in the meantime.
152*f5478dedSAntonio Nino Diaz *
153*f5478dedSAntonio Nino Diaz *	If the caller knows this macro will only be called by the primary CPU
154*f5478dedSAntonio Nino Diaz *	then this parameter can be defined to 0 to skip this step.
155*f5478dedSAntonio Nino Diaz *
156*f5478dedSAntonio Nino Diaz * _init_memory:
157*f5478dedSAntonio Nino Diaz *	Whether the macro needs to initialise the memory.
158*f5478dedSAntonio Nino Diaz *
159*f5478dedSAntonio Nino Diaz * _init_c_runtime:
160*f5478dedSAntonio Nino Diaz *	Whether the macro needs to initialise the C runtime environment.
161*f5478dedSAntonio Nino Diaz *
162*f5478dedSAntonio Nino Diaz * _exception_vectors:
163*f5478dedSAntonio Nino Diaz *	Address of the exception vectors to program in the VBAR_EL3 register.
164*f5478dedSAntonio Nino Diaz * -----------------------------------------------------------------------------
165*f5478dedSAntonio Nino Diaz */
166*f5478dedSAntonio Nino Diaz	.macro el3_entrypoint_common					\
167*f5478dedSAntonio Nino Diaz		_init_sctlr, _warm_boot_mailbox, _secondary_cold_boot,	\
168*f5478dedSAntonio Nino Diaz		_init_memory, _init_c_runtime, _exception_vectors
169*f5478dedSAntonio Nino Diaz
170*f5478dedSAntonio Nino Diaz	/* Make sure we are in Secure Mode */
171*f5478dedSAntonio Nino Diaz#if ENABLE_ASSERTIONS
172*f5478dedSAntonio Nino Diaz	ldcopr	r0, SCR
173*f5478dedSAntonio Nino Diaz	tst	r0, #SCR_NS_BIT
174*f5478dedSAntonio Nino Diaz	ASM_ASSERT(eq)
175*f5478dedSAntonio Nino Diaz#endif
176*f5478dedSAntonio Nino Diaz
177*f5478dedSAntonio Nino Diaz	.if \_init_sctlr
178*f5478dedSAntonio Nino Diaz		/* -------------------------------------------------------------
179*f5478dedSAntonio Nino Diaz		 * This is the initialisation of SCTLR and so must ensure that
180*f5478dedSAntonio Nino Diaz		 * all fields are explicitly set rather than relying on hw. Some
181*f5478dedSAntonio Nino Diaz		 * fields reset to an IMPLEMENTATION DEFINED value.
182*f5478dedSAntonio Nino Diaz		 *
183*f5478dedSAntonio Nino Diaz		 * SCTLR.TE: Set to zero so that exceptions to an Exception
184*f5478dedSAntonio Nino Diaz		 *  Level executing at PL1 are taken to A32 state.
185*f5478dedSAntonio Nino Diaz		 *
186*f5478dedSAntonio Nino Diaz		 * SCTLR.EE: Set the CPU endianness before doing anything that
187*f5478dedSAntonio Nino Diaz		 *  might involve memory reads or writes. Set to zero to select
188*f5478dedSAntonio Nino Diaz		 *  Little Endian.
189*f5478dedSAntonio Nino Diaz		 *
190*f5478dedSAntonio Nino Diaz		 * SCTLR.V: Set to zero to select the normal exception vectors
191*f5478dedSAntonio Nino Diaz		 *  with base address held in VBAR.
192*f5478dedSAntonio Nino Diaz		 *
193*f5478dedSAntonio Nino Diaz		 * SCTLR.DSSBS: Set to zero to disable speculation store bypass
194*f5478dedSAntonio Nino Diaz		 *  safe behaviour upon exception entry to EL3.
195*f5478dedSAntonio Nino Diaz		 * -------------------------------------------------------------
196*f5478dedSAntonio Nino Diaz		 */
197*f5478dedSAntonio Nino Diaz		ldr     r0, =(SCTLR_RESET_VAL & ~(SCTLR_TE_BIT | SCTLR_EE_BIT | \
198*f5478dedSAntonio Nino Diaz				SCTLR_V_BIT | SCTLR_DSSBS_BIT))
199*f5478dedSAntonio Nino Diaz		stcopr	r0, SCTLR
200*f5478dedSAntonio Nino Diaz		isb
201*f5478dedSAntonio Nino Diaz	.endif /* _init_sctlr */
202*f5478dedSAntonio Nino Diaz
203*f5478dedSAntonio Nino Diaz	/* Switch to monitor mode */
204*f5478dedSAntonio Nino Diaz	cps	#MODE32_mon
205*f5478dedSAntonio Nino Diaz	isb
206*f5478dedSAntonio Nino Diaz
207*f5478dedSAntonio Nino Diaz	.if \_warm_boot_mailbox
208*f5478dedSAntonio Nino Diaz		/* -------------------------------------------------------------
209*f5478dedSAntonio Nino Diaz		 * This code will be executed for both warm and cold resets.
210*f5478dedSAntonio Nino Diaz		 * Now is the time to distinguish between the two.
211*f5478dedSAntonio Nino Diaz		 * Query the platform entrypoint address and if it is not zero
212*f5478dedSAntonio Nino Diaz		 * then it means it is a warm boot so jump to this address.
213*f5478dedSAntonio Nino Diaz		 * -------------------------------------------------------------
214*f5478dedSAntonio Nino Diaz		 */
215*f5478dedSAntonio Nino Diaz		bl	plat_get_my_entrypoint
216*f5478dedSAntonio Nino Diaz		cmp	r0, #0
217*f5478dedSAntonio Nino Diaz		bxne	r0
218*f5478dedSAntonio Nino Diaz	.endif /* _warm_boot_mailbox */
219*f5478dedSAntonio Nino Diaz
220*f5478dedSAntonio Nino Diaz	/* ---------------------------------------------------------------------
221*f5478dedSAntonio Nino Diaz	 * Set the exception vectors (VBAR/MVBAR).
222*f5478dedSAntonio Nino Diaz	 * ---------------------------------------------------------------------
223*f5478dedSAntonio Nino Diaz	 */
224*f5478dedSAntonio Nino Diaz	ldr	r0, =\_exception_vectors
225*f5478dedSAntonio Nino Diaz	stcopr	r0, VBAR
226*f5478dedSAntonio Nino Diaz	stcopr	r0, MVBAR
227*f5478dedSAntonio Nino Diaz	isb
228*f5478dedSAntonio Nino Diaz
229*f5478dedSAntonio Nino Diaz	/* ---------------------------------------------------------------------
230*f5478dedSAntonio Nino Diaz	 * It is a cold boot.
231*f5478dedSAntonio Nino Diaz	 * Perform any processor specific actions upon reset e.g. cache, TLB
232*f5478dedSAntonio Nino Diaz	 * invalidations etc.
233*f5478dedSAntonio Nino Diaz	 * ---------------------------------------------------------------------
234*f5478dedSAntonio Nino Diaz	 */
235*f5478dedSAntonio Nino Diaz	bl	reset_handler
236*f5478dedSAntonio Nino Diaz
237*f5478dedSAntonio Nino Diaz	el3_arch_init_common
238*f5478dedSAntonio Nino Diaz
239*f5478dedSAntonio Nino Diaz	.if \_secondary_cold_boot
240*f5478dedSAntonio Nino Diaz		/* -------------------------------------------------------------
241*f5478dedSAntonio Nino Diaz		 * Check if this is a primary or secondary CPU cold boot.
242*f5478dedSAntonio Nino Diaz		 * The primary CPU will set up the platform while the
243*f5478dedSAntonio Nino Diaz		 * secondaries are placed in a platform-specific state until the
244*f5478dedSAntonio Nino Diaz		 * primary CPU performs the necessary actions to bring them out
245*f5478dedSAntonio Nino Diaz		 * of that state and allows entry into the OS.
246*f5478dedSAntonio Nino Diaz		 * -------------------------------------------------------------
247*f5478dedSAntonio Nino Diaz		 */
248*f5478dedSAntonio Nino Diaz		bl	plat_is_my_cpu_primary
249*f5478dedSAntonio Nino Diaz		cmp	r0, #0
250*f5478dedSAntonio Nino Diaz		bne	do_primary_cold_boot
251*f5478dedSAntonio Nino Diaz
252*f5478dedSAntonio Nino Diaz		/* This is a cold boot on a secondary CPU */
253*f5478dedSAntonio Nino Diaz		bl	plat_secondary_cold_boot_setup
254*f5478dedSAntonio Nino Diaz		/* plat_secondary_cold_boot_setup() is not supposed to return */
255*f5478dedSAntonio Nino Diaz		no_ret	plat_panic_handler
256*f5478dedSAntonio Nino Diaz
257*f5478dedSAntonio Nino Diaz	do_primary_cold_boot:
258*f5478dedSAntonio Nino Diaz	.endif /* _secondary_cold_boot */
259*f5478dedSAntonio Nino Diaz
260*f5478dedSAntonio Nino Diaz	/* ---------------------------------------------------------------------
261*f5478dedSAntonio Nino Diaz	 * Initialize memory now. Secondary CPU initialization won't get to this
262*f5478dedSAntonio Nino Diaz	 * point.
263*f5478dedSAntonio Nino Diaz	 * ---------------------------------------------------------------------
264*f5478dedSAntonio Nino Diaz	 */
265*f5478dedSAntonio Nino Diaz
266*f5478dedSAntonio Nino Diaz	.if \_init_memory
267*f5478dedSAntonio Nino Diaz		bl	platform_mem_init
268*f5478dedSAntonio Nino Diaz	.endif /* _init_memory */
269*f5478dedSAntonio Nino Diaz
270*f5478dedSAntonio Nino Diaz	/* ---------------------------------------------------------------------
271*f5478dedSAntonio Nino Diaz	 * Init C runtime environment:
272*f5478dedSAntonio Nino Diaz	 *   - Zero-initialise the NOBITS sections. There are 2 of them:
273*f5478dedSAntonio Nino Diaz	 *       - the .bss section;
274*f5478dedSAntonio Nino Diaz	 *       - the coherent memory section (if any).
275*f5478dedSAntonio Nino Diaz	 *   - Relocate the data section from ROM to RAM, if required.
276*f5478dedSAntonio Nino Diaz	 * ---------------------------------------------------------------------
277*f5478dedSAntonio Nino Diaz	 */
278*f5478dedSAntonio Nino Diaz	.if \_init_c_runtime
279*f5478dedSAntonio Nino Diaz#if defined(IMAGE_BL32) || (defined(IMAGE_BL2) && BL2_AT_EL3)
280*f5478dedSAntonio Nino Diaz		/* -----------------------------------------------------------------
281*f5478dedSAntonio Nino Diaz		 * Invalidate the RW memory used by the image. This
282*f5478dedSAntonio Nino Diaz		 * includes the data and NOBITS sections. This is done to
283*f5478dedSAntonio Nino Diaz		 * safeguard against possible corruption of this memory by
284*f5478dedSAntonio Nino Diaz		 * dirty cache lines in a system cache as a result of use by
285*f5478dedSAntonio Nino Diaz		 * an earlier boot loader stage.
286*f5478dedSAntonio Nino Diaz		 * -----------------------------------------------------------------
287*f5478dedSAntonio Nino Diaz		 */
288*f5478dedSAntonio Nino Diaz		ldr	r0, =__RW_START__
289*f5478dedSAntonio Nino Diaz		ldr	r1, =__RW_END__
290*f5478dedSAntonio Nino Diaz		sub	r1, r1, r0
291*f5478dedSAntonio Nino Diaz		bl	inv_dcache_range
292*f5478dedSAntonio Nino Diaz#endif
293*f5478dedSAntonio Nino Diaz
294*f5478dedSAntonio Nino Diaz		ldr	r0, =__BSS_START__
295*f5478dedSAntonio Nino Diaz		ldr	r1, =__BSS_SIZE__
296*f5478dedSAntonio Nino Diaz		bl	zeromem
297*f5478dedSAntonio Nino Diaz
298*f5478dedSAntonio Nino Diaz#if USE_COHERENT_MEM
299*f5478dedSAntonio Nino Diaz		ldr	r0, =__COHERENT_RAM_START__
300*f5478dedSAntonio Nino Diaz		ldr	r1, =__COHERENT_RAM_UNALIGNED_SIZE__
301*f5478dedSAntonio Nino Diaz		bl	zeromem
302*f5478dedSAntonio Nino Diaz#endif
303*f5478dedSAntonio Nino Diaz
304*f5478dedSAntonio Nino Diaz#ifdef IMAGE_BL1
305*f5478dedSAntonio Nino Diaz		/* -----------------------------------------------------
306*f5478dedSAntonio Nino Diaz		 * Copy data from ROM to RAM.
307*f5478dedSAntonio Nino Diaz		 * -----------------------------------------------------
308*f5478dedSAntonio Nino Diaz		 */
309*f5478dedSAntonio Nino Diaz		ldr	r0, =__DATA_RAM_START__
310*f5478dedSAntonio Nino Diaz		ldr	r1, =__DATA_ROM_START__
311*f5478dedSAntonio Nino Diaz		ldr	r2, =__DATA_SIZE__
312*f5478dedSAntonio Nino Diaz		bl	memcpy4
313*f5478dedSAntonio Nino Diaz#endif
314*f5478dedSAntonio Nino Diaz	.endif /* _init_c_runtime */
315*f5478dedSAntonio Nino Diaz
316*f5478dedSAntonio Nino Diaz	/* ---------------------------------------------------------------------
317*f5478dedSAntonio Nino Diaz	 * Allocate a stack whose memory will be marked as Normal-IS-WBWA when
318*f5478dedSAntonio Nino Diaz	 * the MMU is enabled. There is no risk of reading stale stack memory
319*f5478dedSAntonio Nino Diaz	 * after enabling the MMU as only the primary CPU is running at the
320*f5478dedSAntonio Nino Diaz	 * moment.
321*f5478dedSAntonio Nino Diaz	 * ---------------------------------------------------------------------
322*f5478dedSAntonio Nino Diaz	 */
323*f5478dedSAntonio Nino Diaz	bl	plat_set_my_stack
324*f5478dedSAntonio Nino Diaz
325*f5478dedSAntonio Nino Diaz#if STACK_PROTECTOR_ENABLED
326*f5478dedSAntonio Nino Diaz	.if \_init_c_runtime
327*f5478dedSAntonio Nino Diaz	bl	update_stack_protector_canary
328*f5478dedSAntonio Nino Diaz	.endif /* _init_c_runtime */
329*f5478dedSAntonio Nino Diaz#endif
330*f5478dedSAntonio Nino Diaz	.endm
331*f5478dedSAntonio Nino Diaz
332*f5478dedSAntonio Nino Diaz#endif /* EL3_COMMON_MACROS_S */
333