xref: /rk3399_ARM-atf/bl1/aarch64/bl1_exceptions.S (revision e290a8fcbc836d51566da1607add8a320d0f1a20)
16c595b3dSSandrine Bailleux/*
2*e290a8fcSAlexei Fedorov * Copyright (c) 2013-2019, ARM Limited and Contributors. All rights reserved.
36c595b3dSSandrine Bailleux *
482cb2c1aSdp-arm * SPDX-License-Identifier: BSD-3-Clause
56c595b3dSSandrine Bailleux */
66c595b3dSSandrine Bailleux
76c595b3dSSandrine Bailleux#include <arch.h>
86c595b3dSSandrine Bailleux#include <asm_macros.S>
909d40e0eSAntonio Nino Diaz#include <bl1/bl1.h>
1009d40e0eSAntonio Nino Diaz#include <common/bl_common.h>
117baff11fSYatharth Kochar#include <context.h>
126c595b3dSSandrine Bailleux
13e0ae9fabSSandrine Bailleux/* -----------------------------------------------------------------------------
14e0ae9fabSSandrine Bailleux * Very simple stackless exception handlers used by BL1.
15e0ae9fabSSandrine Bailleux * -----------------------------------------------------------------------------
16e0ae9fabSSandrine Bailleux */
176c595b3dSSandrine Bailleux	.globl	bl1_exceptions
186c595b3dSSandrine Bailleux
19e0ae9fabSSandrine Bailleuxvector_base bl1_exceptions
206c595b3dSSandrine Bailleux
216c595b3dSSandrine Bailleux	/* -----------------------------------------------------
2244804252SSandrine Bailleux	 * Current EL with SP0 : 0x0 - 0x200
236c595b3dSSandrine Bailleux	 * -----------------------------------------------------
246c595b3dSSandrine Bailleux	 */
25e0ae9fabSSandrine Bailleuxvector_entry SynchronousExceptionSP0
266c595b3dSSandrine Bailleux	mov	x0, #SYNC_EXCEPTION_SP_EL0
276c595b3dSSandrine Bailleux	bl	plat_report_exception
28a806dad5SJeenu Viswambharan	no_ret	plat_panic_handler
29a9203edaSRoberto Vargasend_vector_entry SynchronousExceptionSP0
306c595b3dSSandrine Bailleux
31e0ae9fabSSandrine Bailleuxvector_entry IrqSP0
326c595b3dSSandrine Bailleux	mov	x0, #IRQ_SP_EL0
336c595b3dSSandrine Bailleux	bl	plat_report_exception
34a806dad5SJeenu Viswambharan	no_ret	plat_panic_handler
35a9203edaSRoberto Vargasend_vector_entry IrqSP0
366c595b3dSSandrine Bailleux
37e0ae9fabSSandrine Bailleuxvector_entry FiqSP0
386c595b3dSSandrine Bailleux	mov	x0, #FIQ_SP_EL0
396c595b3dSSandrine Bailleux	bl	plat_report_exception
40a806dad5SJeenu Viswambharan	no_ret	plat_panic_handler
41a9203edaSRoberto Vargasend_vector_entry FiqSP0
426c595b3dSSandrine Bailleux
43e0ae9fabSSandrine Bailleuxvector_entry SErrorSP0
446c595b3dSSandrine Bailleux	mov	x0, #SERROR_SP_EL0
456c595b3dSSandrine Bailleux	bl	plat_report_exception
46a806dad5SJeenu Viswambharan	no_ret	plat_panic_handler
47a9203edaSRoberto Vargasend_vector_entry SErrorSP0
486c595b3dSSandrine Bailleux
496c595b3dSSandrine Bailleux	/* -----------------------------------------------------
5044804252SSandrine Bailleux	 * Current EL with SPx: 0x200 - 0x400
516c595b3dSSandrine Bailleux	 * -----------------------------------------------------
526c595b3dSSandrine Bailleux	 */
53e0ae9fabSSandrine Bailleuxvector_entry SynchronousExceptionSPx
546c595b3dSSandrine Bailleux	mov	x0, #SYNC_EXCEPTION_SP_ELX
556c595b3dSSandrine Bailleux	bl	plat_report_exception
56a806dad5SJeenu Viswambharan	no_ret	plat_panic_handler
57a9203edaSRoberto Vargasend_vector_entry SynchronousExceptionSPx
586c595b3dSSandrine Bailleux
59e0ae9fabSSandrine Bailleuxvector_entry IrqSPx
606c595b3dSSandrine Bailleux	mov	x0, #IRQ_SP_ELX
616c595b3dSSandrine Bailleux	bl	plat_report_exception
62a806dad5SJeenu Viswambharan	no_ret	plat_panic_handler
63a9203edaSRoberto Vargasend_vector_entry IrqSPx
646c595b3dSSandrine Bailleux
65e0ae9fabSSandrine Bailleuxvector_entry FiqSPx
666c595b3dSSandrine Bailleux	mov	x0, #FIQ_SP_ELX
676c595b3dSSandrine Bailleux	bl	plat_report_exception
68a806dad5SJeenu Viswambharan	no_ret	plat_panic_handler
69a9203edaSRoberto Vargasend_vector_entry FiqSPx
706c595b3dSSandrine Bailleux
71e0ae9fabSSandrine Bailleuxvector_entry SErrorSPx
726c595b3dSSandrine Bailleux	mov	x0, #SERROR_SP_ELX
736c595b3dSSandrine Bailleux	bl	plat_report_exception
74a806dad5SJeenu Viswambharan	no_ret	plat_panic_handler
75a9203edaSRoberto Vargasend_vector_entry SErrorSPx
766c595b3dSSandrine Bailleux
776c595b3dSSandrine Bailleux	/* -----------------------------------------------------
7844804252SSandrine Bailleux	 * Lower EL using AArch64 : 0x400 - 0x600
796c595b3dSSandrine Bailleux	 * -----------------------------------------------------
806c595b3dSSandrine Bailleux	 */
81e0ae9fabSSandrine Bailleuxvector_entry SynchronousExceptionA64
820c8d4fefSAchin Gupta	/* Enable the SError interrupt */
830c8d4fefSAchin Gupta	msr	daifclr, #DAIF_ABT_BIT
840c8d4fefSAchin Gupta
857baff11fSYatharth Kochar	str	x30, [sp, #CTX_GPREGS_OFFSET + CTX_GPREG_LR]
867baff11fSYatharth Kochar
871fe4d453SSandrine Bailleux	/* Expect only SMC exceptions */
887baff11fSYatharth Kochar	mrs	x30, esr_el3
897baff11fSYatharth Kochar	ubfx	x30, x30, #ESR_EC_SHIFT, #ESR_EC_LENGTH
907baff11fSYatharth Kochar	cmp	x30, #EC_AARCH64_SMC
911fe4d453SSandrine Bailleux	b.ne	unexpected_sync_exception
9229fb905dSVikram Kanigiri
931fe4d453SSandrine Bailleux	b	smc_handler64
94a9203edaSRoberto Vargasend_vector_entry SynchronousExceptionA64
956c595b3dSSandrine Bailleux
96e0ae9fabSSandrine Bailleuxvector_entry IrqA64
976c595b3dSSandrine Bailleux	mov	x0, #IRQ_AARCH64
986c595b3dSSandrine Bailleux	bl	plat_report_exception
99a806dad5SJeenu Viswambharan	no_ret	plat_panic_handler
100a9203edaSRoberto Vargasend_vector_entry IrqA64
1016c595b3dSSandrine Bailleux
102e0ae9fabSSandrine Bailleuxvector_entry FiqA64
1036c595b3dSSandrine Bailleux	mov	x0, #FIQ_AARCH64
1046c595b3dSSandrine Bailleux	bl	plat_report_exception
105a806dad5SJeenu Viswambharan	no_ret	plat_panic_handler
106a9203edaSRoberto Vargasend_vector_entry FiqA64
1076c595b3dSSandrine Bailleux
108e0ae9fabSSandrine Bailleuxvector_entry SErrorA64
1096c595b3dSSandrine Bailleux	mov	x0, #SERROR_AARCH64
1106c595b3dSSandrine Bailleux	bl	plat_report_exception
111a806dad5SJeenu Viswambharan	no_ret	plat_panic_handler
112a9203edaSRoberto Vargasend_vector_entry SErrorA64
1136c595b3dSSandrine Bailleux
1146c595b3dSSandrine Bailleux	/* -----------------------------------------------------
11544804252SSandrine Bailleux	 * Lower EL using AArch32 : 0x600 - 0x800
1166c595b3dSSandrine Bailleux	 * -----------------------------------------------------
1176c595b3dSSandrine Bailleux	 */
118e0ae9fabSSandrine Bailleuxvector_entry SynchronousExceptionA32
1196c595b3dSSandrine Bailleux	mov	x0, #SYNC_EXCEPTION_AARCH32
1206c595b3dSSandrine Bailleux	bl	plat_report_exception
121a806dad5SJeenu Viswambharan	no_ret	plat_panic_handler
122a9203edaSRoberto Vargasend_vector_entry SynchronousExceptionA32
1236c595b3dSSandrine Bailleux
124e0ae9fabSSandrine Bailleuxvector_entry IrqA32
1256c595b3dSSandrine Bailleux	mov	x0, #IRQ_AARCH32
1266c595b3dSSandrine Bailleux	bl	plat_report_exception
127a806dad5SJeenu Viswambharan	no_ret	plat_panic_handler
128a9203edaSRoberto Vargasend_vector_entry IrqA32
1296c595b3dSSandrine Bailleux
130e0ae9fabSSandrine Bailleuxvector_entry FiqA32
1316c595b3dSSandrine Bailleux	mov	x0, #FIQ_AARCH32
1326c595b3dSSandrine Bailleux	bl	plat_report_exception
133a806dad5SJeenu Viswambharan	no_ret	plat_panic_handler
134a9203edaSRoberto Vargasend_vector_entry FiqA32
1356c595b3dSSandrine Bailleux
136e0ae9fabSSandrine Bailleuxvector_entry SErrorA32
1376c595b3dSSandrine Bailleux	mov	x0, #SERROR_AARCH32
1386c595b3dSSandrine Bailleux	bl	plat_report_exception
139a806dad5SJeenu Viswambharan	no_ret	plat_panic_handler
140a9203edaSRoberto Vargasend_vector_entry SErrorA32
1411fe4d453SSandrine Bailleux
1421fe4d453SSandrine Bailleux
1431fe4d453SSandrine Bailleuxfunc smc_handler64
14448bfb88eSYatharth Kochar
1457baff11fSYatharth Kochar	/* ----------------------------------------------
14648bfb88eSYatharth Kochar	 * Detect if this is a RUN_IMAGE or other SMC.
14748bfb88eSYatharth Kochar	 * ----------------------------------------------
14848bfb88eSYatharth Kochar	 */
14948bfb88eSYatharth Kochar	mov	x30, #BL1_SMC_RUN_IMAGE
15048bfb88eSYatharth Kochar	cmp	x30, x0
15148bfb88eSYatharth Kochar	b.ne	smc_handler
15248bfb88eSYatharth Kochar
15348bfb88eSYatharth Kochar	/* ------------------------------------------------
15448bfb88eSYatharth Kochar	 * Make sure only Secure world reaches here.
15548bfb88eSYatharth Kochar	 * ------------------------------------------------
15648bfb88eSYatharth Kochar	 */
15748bfb88eSYatharth Kochar	mrs	x30, scr_el3
15848bfb88eSYatharth Kochar	tst	x30, #SCR_NS_BIT
15948bfb88eSYatharth Kochar	b.ne	unexpected_sync_exception
16048bfb88eSYatharth Kochar
16148bfb88eSYatharth Kochar	/* ----------------------------------------------
16248bfb88eSYatharth Kochar	 * Handling RUN_IMAGE SMC. First switch back to
16348bfb88eSYatharth Kochar	 * SP_EL0 for the C runtime stack.
1647baff11fSYatharth Kochar	 * ----------------------------------------------
1657baff11fSYatharth Kochar	 */
1667baff11fSYatharth Kochar	ldr	x30, [sp, #CTX_EL3STATE_OFFSET + CTX_RUNTIME_SP]
1677baff11fSYatharth Kochar	msr	spsel, #0
1687baff11fSYatharth Kochar	mov	sp, x30
1697baff11fSYatharth Kochar
1701fe4d453SSandrine Bailleux	/* ---------------------------------------------------------------------
171f3b4914bSYatharth Kochar	 * Pass EL3 control to next BL image.
17248bfb88eSYatharth Kochar	 * Here it expects X1 with the address of a entry_point_info_t
173f3b4914bSYatharth Kochar	 * structure describing the next BL image entrypoint.
1741fe4d453SSandrine Bailleux	 * ---------------------------------------------------------------------
1751fe4d453SSandrine Bailleux	 */
1761fe4d453SSandrine Bailleux	mov	x20, x1
1771fe4d453SSandrine Bailleux
1781fe4d453SSandrine Bailleux	mov	x0, x20
179f3b4914bSYatharth Kochar	bl	bl1_print_next_bl_ep_info
1801fe4d453SSandrine Bailleux
1811fe4d453SSandrine Bailleux	ldp	x0, x1, [x20, #ENTRY_POINT_INFO_PC_OFFSET]
1821fe4d453SSandrine Bailleux	msr	elr_el3, x0
1831fe4d453SSandrine Bailleux	msr	spsr_el3, x1
1841fe4d453SSandrine Bailleux	ubfx	x0, x1, #MODE_EL_SHIFT, #2
1851fe4d453SSandrine Bailleux	cmp	x0, #MODE_EL3
1861fe4d453SSandrine Bailleux	b.ne	unexpected_sync_exception
1871fe4d453SSandrine Bailleux
1881fe4d453SSandrine Bailleux	bl	disable_mmu_icache_el3
1891fe4d453SSandrine Bailleux	tlbi	alle3
1906bf0e079SAntonio Nino Diaz	dsb	ish /* ERET implies ISB, so it is not needed here */
1911fe4d453SSandrine Bailleux
19235e8c766SSandrine Bailleux#if SPIN_ON_BL1_EXIT
19335e8c766SSandrine Bailleux	bl	print_debug_loop_message
19435e8c766SSandrine Bailleuxdebug_loop:
19535e8c766SSandrine Bailleux	b	debug_loop
19635e8c766SSandrine Bailleux#endif
19735e8c766SSandrine Bailleux
198862b5dc2SSandrine Bailleux	mov	x0, x20
199e3f67124SJuan Castillo	bl	bl1_plat_prepare_exit
200e3f67124SJuan Castillo
2011fe4d453SSandrine Bailleux	ldp	x6, x7, [x20, #(ENTRY_POINT_INFO_ARGS_OFFSET + 0x30)]
2021fe4d453SSandrine Bailleux	ldp	x4, x5, [x20, #(ENTRY_POINT_INFO_ARGS_OFFSET + 0x20)]
2031fe4d453SSandrine Bailleux	ldp	x2, x3, [x20, #(ENTRY_POINT_INFO_ARGS_OFFSET + 0x10)]
2041fe4d453SSandrine Bailleux	ldp	x0, x1, [x20, #(ENTRY_POINT_INFO_ARGS_OFFSET + 0x0)]
2051fe4d453SSandrine Bailleux	eret
2061fe4d453SSandrine Bailleuxendfunc smc_handler64
2071fe4d453SSandrine Bailleux
2081fe4d453SSandrine Bailleuxunexpected_sync_exception:
2091fe4d453SSandrine Bailleux	mov	x0, #SYNC_EXCEPTION_AARCH64
2101fe4d453SSandrine Bailleux	bl	plat_report_exception
211a806dad5SJeenu Viswambharan	no_ret	plat_panic_handler
21248bfb88eSYatharth Kochar
21348bfb88eSYatharth Kochar	/* -----------------------------------------------------
21448bfb88eSYatharth Kochar	 * Save Secure/Normal world context and jump to
21548bfb88eSYatharth Kochar	 * BL1 SMC handler.
21648bfb88eSYatharth Kochar	 * -----------------------------------------------------
21748bfb88eSYatharth Kochar	 */
21848bfb88eSYatharth Kocharsmc_handler:
21948bfb88eSYatharth Kochar	/* -----------------------------------------------------
22048bfb88eSYatharth Kochar	 * Save the GP registers x0-x29.
221085e80ecSAntonio Nino Diaz	 * TODO: Revisit to store only SMCCC specified registers.
22248bfb88eSYatharth Kochar	 * -----------------------------------------------------
22348bfb88eSYatharth Kochar	 */
22448bfb88eSYatharth Kochar	bl	save_gp_registers
22548bfb88eSYatharth Kochar
22648bfb88eSYatharth Kochar	/* -----------------------------------------------------
227*e290a8fcSAlexei Fedorov	 * If Secure Cycle Counter is not disabled in MDCR_EL3
228*e290a8fcSAlexei Fedorov	 * when ARMv8.5-PMU is implemented, save PMCR_EL0 and
229*e290a8fcSAlexei Fedorov	 * disable all event counters and cycle counter.
230*e290a8fcSAlexei Fedorov	 * -----------------------------------------------------
231*e290a8fcSAlexei Fedorov	 */
232*e290a8fcSAlexei Fedorov	bl	save_pmcr_disable_pmu
233*e290a8fcSAlexei Fedorov
234*e290a8fcSAlexei Fedorov	/* -----------------------------------------------------
23548bfb88eSYatharth Kochar	 * Populate the parameters for the SMC handler. We
23648bfb88eSYatharth Kochar	 * already have x0-x4 in place. x5 will point to a
23748bfb88eSYatharth Kochar	 * cookie (not used now). x6 will point to the context
23848bfb88eSYatharth Kochar	 * structure (SP_EL3) and x7 will contain flags we need
23948bfb88eSYatharth Kochar	 * to pass to the handler.
24048bfb88eSYatharth Kochar	 * -----------------------------------------------------
24148bfb88eSYatharth Kochar	 */
24248bfb88eSYatharth Kochar	mov	x5, xzr
24348bfb88eSYatharth Kochar	mov	x6, sp
24448bfb88eSYatharth Kochar
24548bfb88eSYatharth Kochar	/* -----------------------------------------------------
24648bfb88eSYatharth Kochar	 * Restore the saved C runtime stack value which will
24748bfb88eSYatharth Kochar	 * become the new SP_EL0 i.e. EL3 runtime stack. It was
24848bfb88eSYatharth Kochar	 * saved in the 'cpu_context' structure prior to the last
24948bfb88eSYatharth Kochar	 * ERET from EL3.
25048bfb88eSYatharth Kochar	 * -----------------------------------------------------
25148bfb88eSYatharth Kochar	 */
25248bfb88eSYatharth Kochar	ldr	x12, [x6, #CTX_EL3STATE_OFFSET + CTX_RUNTIME_SP]
25348bfb88eSYatharth Kochar
25448bfb88eSYatharth Kochar	/* ---------------------------------------------
25548bfb88eSYatharth Kochar	 * Switch back to SP_EL0 for the C runtime stack.
25648bfb88eSYatharth Kochar	 * ---------------------------------------------
25748bfb88eSYatharth Kochar	 */
25848bfb88eSYatharth Kochar	msr	spsel, #0
25948bfb88eSYatharth Kochar	mov	sp, x12
26048bfb88eSYatharth Kochar
26148bfb88eSYatharth Kochar	/* -----------------------------------------------------
26248bfb88eSYatharth Kochar	 * Save the SPSR_EL3, ELR_EL3, & SCR_EL3 in case there
26348bfb88eSYatharth Kochar	 * is a world switch during SMC handling.
26448bfb88eSYatharth Kochar	 * -----------------------------------------------------
26548bfb88eSYatharth Kochar	 */
26648bfb88eSYatharth Kochar	mrs	x16, spsr_el3
26748bfb88eSYatharth Kochar	mrs	x17, elr_el3
26848bfb88eSYatharth Kochar	mrs	x18, scr_el3
26948bfb88eSYatharth Kochar	stp	x16, x17, [x6, #CTX_EL3STATE_OFFSET + CTX_SPSR_EL3]
27048bfb88eSYatharth Kochar	str	x18, [x6, #CTX_EL3STATE_OFFSET + CTX_SCR_EL3]
27148bfb88eSYatharth Kochar
27248bfb88eSYatharth Kochar	/* Copy SCR_EL3.NS bit to the flag to indicate caller's security */
27348bfb88eSYatharth Kochar	bfi	x7, x18, #0, #1
27448bfb88eSYatharth Kochar
27548bfb88eSYatharth Kochar	/* -----------------------------------------------------
27648bfb88eSYatharth Kochar	 * Go to BL1 SMC handler.
27748bfb88eSYatharth Kochar	 * -----------------------------------------------------
27848bfb88eSYatharth Kochar	 */
27948bfb88eSYatharth Kochar	bl	bl1_smc_handler
28048bfb88eSYatharth Kochar
28148bfb88eSYatharth Kochar	/* -----------------------------------------------------
28248bfb88eSYatharth Kochar	 * Do the transition to next BL image.
28348bfb88eSYatharth Kochar	 * -----------------------------------------------------
28448bfb88eSYatharth Kochar	 */
28548bfb88eSYatharth Kochar	b	el3_exit
286