bl1_exceptions.S 5.7 KB
Newer Older
1
/*
2
 * Copyright (c) 2013-2014, ARM Limited and Contributors. All rights reserved.
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are met:
 *
 * Redistributions of source code must retain the above copyright notice, this
 * list of conditions and the following disclaimer.
 *
 * Redistributions in binary form must reproduce the above copyright notice,
 * this list of conditions and the following disclaimer in the documentation
 * and/or other materials provided with the distribution.
 *
 * Neither the name of ARM nor the names of its contributors may be used
 * to endorse or promote products derived from this software without specific
 * prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 * POSSIBILITY OF SUCH DAMAGE.
 */

#include <arch.h>
32
#include <asm_macros.S>
33
34
35
#include <bl_common.h>
#include <runtime_svc.h>

36
	.globl	bl1_exceptions
37

Achin Gupta's avatar
Achin Gupta committed
38
	.section	.vectors, "ax"; .align 11
39
40

	/* -----------------------------------------------------
41
	 * Very simple stackless exception handlers used by BL1.
42
43
44
	 * -----------------------------------------------------
	 */
	.align	7
45
bl1_exceptions:
46
	/* -----------------------------------------------------
47
	 * Current EL with SP0 : 0x0 - 0x200
48
49
50
51
52
53
	 * -----------------------------------------------------
	 */
SynchronousExceptionSP0:
	mov	x0, #SYNC_EXCEPTION_SP_EL0
	bl	plat_report_exception
	b	SynchronousExceptionSP0
54
	check_vector_size SynchronousExceptionSP0
55
56
57
58
59
60

	.align	7
IrqSP0:
	mov	x0, #IRQ_SP_EL0
	bl	plat_report_exception
	b	IrqSP0
61
	check_vector_size IrqSP0
62
63
64
65
66
67

	.align	7
FiqSP0:
	mov	x0, #FIQ_SP_EL0
	bl	plat_report_exception
	b	FiqSP0
68
	check_vector_size FiqSP0
69
70
71
72
73
74

	.align	7
SErrorSP0:
	mov	x0, #SERROR_SP_EL0
	bl	plat_report_exception
	b	SErrorSP0
75
	check_vector_size SErrorSP0
76
77

	/* -----------------------------------------------------
78
	 * Current EL with SPx: 0x200 - 0x400
79
80
81
82
83
84
85
	 * -----------------------------------------------------
	 */
	.align	7
SynchronousExceptionSPx:
	mov	x0, #SYNC_EXCEPTION_SP_ELX
	bl	plat_report_exception
	b	SynchronousExceptionSPx
86
	check_vector_size SynchronousExceptionSPx
87
88
89
90
91
92

	.align	7
IrqSPx:
	mov	x0, #IRQ_SP_ELX
	bl	plat_report_exception
	b	IrqSPx
93
	check_vector_size IrqSPx
94
95
96
97
98
99

	.align	7
FiqSPx:
	mov	x0, #FIQ_SP_ELX
	bl	plat_report_exception
	b	FiqSPx
100
	check_vector_size FiqSPx
101
102
103
104
105
106

	.align	7
SErrorSPx:
	mov	x0, #SERROR_SP_ELX
	bl	plat_report_exception
	b	SErrorSPx
107
	check_vector_size SErrorSPx
108
109

	/* -----------------------------------------------------
110
	 * Lower EL using AArch64 : 0x400 - 0x600
111
112
113
114
	 * -----------------------------------------------------
	 */
	.align	7
SynchronousExceptionA64:
115
116
117
	/* Enable the SError interrupt */
	msr	daifclr, #DAIF_ABT_BIT

118
119
120
121
122
	/* Expect only SMC exceptions */
	mrs	x19, esr_el3
	ubfx	x20, x19, #ESR_EC_SHIFT, #ESR_EC_LENGTH
	cmp	x20, #EC_AARCH64_SMC
	b.ne	unexpected_sync_exception
123

124
	b	smc_handler64
125
	check_vector_size SynchronousExceptionA64
126
127
128
129
130
131

	.align	7
IrqA64:
	mov	x0, #IRQ_AARCH64
	bl	plat_report_exception
	b	IrqA64
132
	check_vector_size IrqA64
133
134
135
136
137
138

	.align	7
FiqA64:
	mov	x0, #FIQ_AARCH64
	bl	plat_report_exception
	b	FiqA64
139
	check_vector_size FiqA64
140
141
142
143
144
145

	.align	7
SErrorA64:
	mov	x0, #SERROR_AARCH64
	bl	plat_report_exception
	b   	SErrorA64
146
	check_vector_size SErrorA64
147
148

	/* -----------------------------------------------------
149
	 * Lower EL using AArch32 : 0x600 - 0x800
150
151
152
153
154
155
156
	 * -----------------------------------------------------
	 */
	.align	7
SynchronousExceptionA32:
	mov	x0, #SYNC_EXCEPTION_AARCH32
	bl	plat_report_exception
	b	SynchronousExceptionA32
157
	check_vector_size SynchronousExceptionA32
158
159
160
161
162
163

	.align	7
IrqA32:
	mov	x0, #IRQ_AARCH32
	bl	plat_report_exception
	b	IrqA32
164
	check_vector_size IrqA32
165
166
167
168
169
170

	.align	7
FiqA32:
	mov	x0, #FIQ_AARCH32
	bl	plat_report_exception
	b	FiqA32
171
	check_vector_size FiqA32
172
173
174
175
176
177

	.align	7
SErrorA32:
	mov	x0, #SERROR_AARCH32
	bl	plat_report_exception
	b	SErrorA32
178
	check_vector_size SErrorA32
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209


func smc_handler64
	/* ---------------------------------------------------------------------
	 * Only a single SMC exception from BL2 to ask BL1 to pass EL3 control
	 * to BL31 is expected here. It expects:
	 *   - X0 with RUN_IMAGE SMC function ID;
	 *   - X1 with the address of a entry_point_info_t structure describing
	 *     the BL31 entrypoint.
	 * ---------------------------------------------------------------------
	 */
	mov	x19, x0
	mov	x20, x1

	mov	x0, #RUN_IMAGE
	cmp	x19, x0
	b.ne	unexpected_sync_exception

	mov	x0, x20
	bl	display_boot_progress

	ldp	x0, x1, [x20, #ENTRY_POINT_INFO_PC_OFFSET]
	msr	elr_el3, x0
	msr	spsr_el3, x1
	ubfx	x0, x1, #MODE_EL_SHIFT, #2
	cmp	x0, #MODE_EL3
	b.ne	unexpected_sync_exception

	bl	disable_mmu_icache_el3
	tlbi	alle3

210
211
	bl	bl1_plat_prepare_exit

212
213
214
215
216
217
218
219
220
221
222
223
	ldp	x6, x7, [x20, #(ENTRY_POINT_INFO_ARGS_OFFSET + 0x30)]
	ldp	x4, x5, [x20, #(ENTRY_POINT_INFO_ARGS_OFFSET + 0x20)]
	ldp	x2, x3, [x20, #(ENTRY_POINT_INFO_ARGS_OFFSET + 0x10)]
	ldp	x0, x1, [x20, #(ENTRY_POINT_INFO_ARGS_OFFSET + 0x0)]
	eret
endfunc smc_handler64

unexpected_sync_exception:
	mov	x0, #SYNC_EXCEPTION_AARCH64
	bl	plat_report_exception
	wfi
	b	unexpected_sync_exception