xref: /rk3399_ARM-atf/lib/aarch64/misc_helpers.S (revision 4ecca33988b90de43ec4f4a929094a38a23fda31)
1*4ecca339SDan Handley/*
2*4ecca339SDan Handley * Copyright (c) 2013-2014, ARM Limited and Contributors. All rights reserved.
3*4ecca339SDan Handley *
4*4ecca339SDan Handley * Redistribution and use in source and binary forms, with or without
5*4ecca339SDan Handley * modification, are permitted provided that the following conditions are met:
6*4ecca339SDan Handley *
7*4ecca339SDan Handley * Redistributions of source code must retain the above copyright notice, this
8*4ecca339SDan Handley * list of conditions and the following disclaimer.
9*4ecca339SDan Handley *
10*4ecca339SDan Handley * Redistributions in binary form must reproduce the above copyright notice,
11*4ecca339SDan Handley * this list of conditions and the following disclaimer in the documentation
12*4ecca339SDan Handley * and/or other materials provided with the distribution.
13*4ecca339SDan Handley *
14*4ecca339SDan Handley * Neither the name of ARM nor the names of its contributors may be used
15*4ecca339SDan Handley * to endorse or promote products derived from this software without specific
16*4ecca339SDan Handley * prior written permission.
17*4ecca339SDan Handley *
18*4ecca339SDan Handley * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
19*4ecca339SDan Handley * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
20*4ecca339SDan Handley * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
21*4ecca339SDan Handley * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
22*4ecca339SDan Handley * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
23*4ecca339SDan Handley * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
24*4ecca339SDan Handley * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
25*4ecca339SDan Handley * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
26*4ecca339SDan Handley * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
27*4ecca339SDan Handley * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
28*4ecca339SDan Handley * POSSIBILITY OF SUCH DAMAGE.
29*4ecca339SDan Handley */
30*4ecca339SDan Handley
31*4ecca339SDan Handley#include <arch_helpers.h>
32*4ecca339SDan Handley#include <runtime_svc.h>
33*4ecca339SDan Handley#include <asm_macros.S>
34*4ecca339SDan Handley
35*4ecca339SDan Handley	.globl	enable_irq
36*4ecca339SDan Handley	.globl	disable_irq
37*4ecca339SDan Handley
38*4ecca339SDan Handley	.globl	enable_fiq
39*4ecca339SDan Handley	.globl	disable_fiq
40*4ecca339SDan Handley
41*4ecca339SDan Handley	.globl	enable_serror
42*4ecca339SDan Handley	.globl	disable_serror
43*4ecca339SDan Handley
44*4ecca339SDan Handley	.globl	enable_debug_exceptions
45*4ecca339SDan Handley	.globl	disable_debug_exceptions
46*4ecca339SDan Handley
47*4ecca339SDan Handley	.globl	read_daif
48*4ecca339SDan Handley	.globl	write_daif
49*4ecca339SDan Handley
50*4ecca339SDan Handley	.globl	read_spsr
51*4ecca339SDan Handley	.globl	read_spsr_el1
52*4ecca339SDan Handley	.globl	read_spsr_el2
53*4ecca339SDan Handley	.globl	read_spsr_el3
54*4ecca339SDan Handley
55*4ecca339SDan Handley	.globl	write_spsr
56*4ecca339SDan Handley	.globl	write_spsr_el1
57*4ecca339SDan Handley	.globl	write_spsr_el2
58*4ecca339SDan Handley	.globl	write_spsr_el3
59*4ecca339SDan Handley
60*4ecca339SDan Handley	.globl	read_elr
61*4ecca339SDan Handley	.globl	read_elr_el1
62*4ecca339SDan Handley	.globl	read_elr_el2
63*4ecca339SDan Handley	.globl	read_elr_el3
64*4ecca339SDan Handley
65*4ecca339SDan Handley	.globl	write_elr
66*4ecca339SDan Handley	.globl	write_elr_el1
67*4ecca339SDan Handley	.globl	write_elr_el2
68*4ecca339SDan Handley	.globl	write_elr_el3
69*4ecca339SDan Handley
70*4ecca339SDan Handley	.globl	get_afflvl_shift
71*4ecca339SDan Handley	.globl	mpidr_mask_lower_afflvls
72*4ecca339SDan Handley	.globl	dsb
73*4ecca339SDan Handley	.globl	isb
74*4ecca339SDan Handley	.globl	sev
75*4ecca339SDan Handley	.globl	wfe
76*4ecca339SDan Handley	.globl	wfi
77*4ecca339SDan Handley	.globl	eret
78*4ecca339SDan Handley	.globl	smc
79*4ecca339SDan Handley
80*4ecca339SDan Handley	.globl	zeromem16
81*4ecca339SDan Handley	.globl	memcpy16
82*4ecca339SDan Handley
83*4ecca339SDan Handley
84*4ecca339SDan Handleyfunc get_afflvl_shift
85*4ecca339SDan Handley	cmp	x0, #3
86*4ecca339SDan Handley	cinc	x0, x0, eq
87*4ecca339SDan Handley	mov	x1, #MPIDR_AFFLVL_SHIFT
88*4ecca339SDan Handley	lsl	x0, x0, x1
89*4ecca339SDan Handley	ret
90*4ecca339SDan Handley
91*4ecca339SDan Handleyfunc mpidr_mask_lower_afflvls
92*4ecca339SDan Handley	cmp	x1, #3
93*4ecca339SDan Handley	cinc	x1, x1, eq
94*4ecca339SDan Handley	mov	x2, #MPIDR_AFFLVL_SHIFT
95*4ecca339SDan Handley	lsl	x2, x1, x2
96*4ecca339SDan Handley	lsr	x0, x0, x2
97*4ecca339SDan Handley	lsl	x0, x0, x2
98*4ecca339SDan Handley	ret
99*4ecca339SDan Handley
100*4ecca339SDan Handley	/* -----------------------------------------------------
101*4ecca339SDan Handley	 * Asynchronous exception manipulation accessors
102*4ecca339SDan Handley	 * -----------------------------------------------------
103*4ecca339SDan Handley	 */
104*4ecca339SDan Handleyfunc enable_irq
105*4ecca339SDan Handley	msr	daifclr, #DAIF_IRQ_BIT
106*4ecca339SDan Handley	ret
107*4ecca339SDan Handley
108*4ecca339SDan Handley
109*4ecca339SDan Handleyfunc enable_fiq
110*4ecca339SDan Handley	msr	daifclr, #DAIF_FIQ_BIT
111*4ecca339SDan Handley	ret
112*4ecca339SDan Handley
113*4ecca339SDan Handley
114*4ecca339SDan Handleyfunc enable_serror
115*4ecca339SDan Handley	msr	daifclr, #DAIF_ABT_BIT
116*4ecca339SDan Handley	ret
117*4ecca339SDan Handley
118*4ecca339SDan Handley
119*4ecca339SDan Handleyfunc enable_debug_exceptions
120*4ecca339SDan Handley	msr	daifclr, #DAIF_DBG_BIT
121*4ecca339SDan Handley	ret
122*4ecca339SDan Handley
123*4ecca339SDan Handley
124*4ecca339SDan Handleyfunc disable_irq
125*4ecca339SDan Handley	msr	daifset, #DAIF_IRQ_BIT
126*4ecca339SDan Handley	ret
127*4ecca339SDan Handley
128*4ecca339SDan Handley
129*4ecca339SDan Handleyfunc disable_fiq
130*4ecca339SDan Handley	msr	daifset, #DAIF_FIQ_BIT
131*4ecca339SDan Handley	ret
132*4ecca339SDan Handley
133*4ecca339SDan Handley
134*4ecca339SDan Handleyfunc disable_serror
135*4ecca339SDan Handley	msr	daifset, #DAIF_ABT_BIT
136*4ecca339SDan Handley	ret
137*4ecca339SDan Handley
138*4ecca339SDan Handley
139*4ecca339SDan Handleyfunc disable_debug_exceptions
140*4ecca339SDan Handley	msr	daifset, #DAIF_DBG_BIT
141*4ecca339SDan Handley	ret
142*4ecca339SDan Handley
143*4ecca339SDan Handley
144*4ecca339SDan Handleyfunc read_daif
145*4ecca339SDan Handley	mrs	x0, daif
146*4ecca339SDan Handley	ret
147*4ecca339SDan Handley
148*4ecca339SDan Handley
149*4ecca339SDan Handleyfunc write_daif
150*4ecca339SDan Handley	msr	daif, x0
151*4ecca339SDan Handley	ret
152*4ecca339SDan Handley
153*4ecca339SDan Handley
154*4ecca339SDan Handleyfunc read_spsr
155*4ecca339SDan Handley	mrs	x0, CurrentEl
156*4ecca339SDan Handley	cmp	x0, #(MODE_EL1 << MODE_EL_SHIFT)
157*4ecca339SDan Handley	b.eq	read_spsr_el1
158*4ecca339SDan Handley	cmp	x0, #(MODE_EL2 << MODE_EL_SHIFT)
159*4ecca339SDan Handley	b.eq	read_spsr_el2
160*4ecca339SDan Handley	cmp	x0, #(MODE_EL3 << MODE_EL_SHIFT)
161*4ecca339SDan Handley	b.eq	read_spsr_el3
162*4ecca339SDan Handley
163*4ecca339SDan Handley
164*4ecca339SDan Handleyfunc read_spsr_el1
165*4ecca339SDan Handley	mrs	x0, spsr_el1
166*4ecca339SDan Handley	ret
167*4ecca339SDan Handley
168*4ecca339SDan Handley
169*4ecca339SDan Handleyfunc read_spsr_el2
170*4ecca339SDan Handley	mrs	x0, spsr_el2
171*4ecca339SDan Handley	ret
172*4ecca339SDan Handley
173*4ecca339SDan Handley
174*4ecca339SDan Handleyfunc read_spsr_el3
175*4ecca339SDan Handley	mrs	x0, spsr_el3
176*4ecca339SDan Handley	ret
177*4ecca339SDan Handley
178*4ecca339SDan Handley
179*4ecca339SDan Handleyfunc write_spsr
180*4ecca339SDan Handley	mrs	x1, CurrentEl
181*4ecca339SDan Handley	cmp	x1, #(MODE_EL1 << MODE_EL_SHIFT)
182*4ecca339SDan Handley	b.eq	write_spsr_el1
183*4ecca339SDan Handley	cmp	x1, #(MODE_EL2 << MODE_EL_SHIFT)
184*4ecca339SDan Handley	b.eq	write_spsr_el2
185*4ecca339SDan Handley	cmp	x1, #(MODE_EL3 << MODE_EL_SHIFT)
186*4ecca339SDan Handley	b.eq	write_spsr_el3
187*4ecca339SDan Handley
188*4ecca339SDan Handley
189*4ecca339SDan Handleyfunc write_spsr_el1
190*4ecca339SDan Handley	msr	spsr_el1, x0
191*4ecca339SDan Handley	isb
192*4ecca339SDan Handley	ret
193*4ecca339SDan Handley
194*4ecca339SDan Handley
195*4ecca339SDan Handleyfunc write_spsr_el2
196*4ecca339SDan Handley	msr	spsr_el2, x0
197*4ecca339SDan Handley	isb
198*4ecca339SDan Handley	ret
199*4ecca339SDan Handley
200*4ecca339SDan Handley
201*4ecca339SDan Handleyfunc write_spsr_el3
202*4ecca339SDan Handley	msr	spsr_el3, x0
203*4ecca339SDan Handley	isb
204*4ecca339SDan Handley	ret
205*4ecca339SDan Handley
206*4ecca339SDan Handley
207*4ecca339SDan Handleyfunc read_elr
208*4ecca339SDan Handley	mrs	x0, CurrentEl
209*4ecca339SDan Handley	cmp	x0, #(MODE_EL1 << MODE_EL_SHIFT)
210*4ecca339SDan Handley	b.eq	read_elr_el1
211*4ecca339SDan Handley	cmp	x0, #(MODE_EL2 << MODE_EL_SHIFT)
212*4ecca339SDan Handley	b.eq	read_elr_el2
213*4ecca339SDan Handley	cmp	x0, #(MODE_EL3 << MODE_EL_SHIFT)
214*4ecca339SDan Handley	b.eq	read_elr_el3
215*4ecca339SDan Handley
216*4ecca339SDan Handley
217*4ecca339SDan Handleyfunc read_elr_el1
218*4ecca339SDan Handley	mrs	x0, elr_el1
219*4ecca339SDan Handley	ret
220*4ecca339SDan Handley
221*4ecca339SDan Handley
222*4ecca339SDan Handleyfunc read_elr_el2
223*4ecca339SDan Handley	mrs	x0, elr_el2
224*4ecca339SDan Handley	ret
225*4ecca339SDan Handley
226*4ecca339SDan Handley
227*4ecca339SDan Handleyfunc read_elr_el3
228*4ecca339SDan Handley	mrs	x0, elr_el3
229*4ecca339SDan Handley	ret
230*4ecca339SDan Handley
231*4ecca339SDan Handley
232*4ecca339SDan Handleyfunc write_elr
233*4ecca339SDan Handley	mrs	x1, CurrentEl
234*4ecca339SDan Handley	cmp	x1, #(MODE_EL1 << MODE_EL_SHIFT)
235*4ecca339SDan Handley	b.eq	write_elr_el1
236*4ecca339SDan Handley	cmp	x1, #(MODE_EL2 << MODE_EL_SHIFT)
237*4ecca339SDan Handley	b.eq	write_elr_el2
238*4ecca339SDan Handley	cmp	x1, #(MODE_EL3 << MODE_EL_SHIFT)
239*4ecca339SDan Handley	b.eq	write_elr_el3
240*4ecca339SDan Handley
241*4ecca339SDan Handley
242*4ecca339SDan Handleyfunc write_elr_el1
243*4ecca339SDan Handley	msr	elr_el1, x0
244*4ecca339SDan Handley	isb
245*4ecca339SDan Handley	ret
246*4ecca339SDan Handley
247*4ecca339SDan Handley
248*4ecca339SDan Handleyfunc write_elr_el2
249*4ecca339SDan Handley	msr	elr_el2, x0
250*4ecca339SDan Handley	isb
251*4ecca339SDan Handley	ret
252*4ecca339SDan Handley
253*4ecca339SDan Handley
254*4ecca339SDan Handleyfunc write_elr_el3
255*4ecca339SDan Handley	msr	elr_el3, x0
256*4ecca339SDan Handley	isb
257*4ecca339SDan Handley	ret
258*4ecca339SDan Handley
259*4ecca339SDan Handley
260*4ecca339SDan Handleyfunc dsb
261*4ecca339SDan Handley	dsb	sy
262*4ecca339SDan Handley	ret
263*4ecca339SDan Handley
264*4ecca339SDan Handley
265*4ecca339SDan Handleyfunc isb
266*4ecca339SDan Handley	isb
267*4ecca339SDan Handley	ret
268*4ecca339SDan Handley
269*4ecca339SDan Handley
270*4ecca339SDan Handleyfunc sev
271*4ecca339SDan Handley	sev
272*4ecca339SDan Handley	ret
273*4ecca339SDan Handley
274*4ecca339SDan Handley
275*4ecca339SDan Handleyfunc wfe
276*4ecca339SDan Handley	wfe
277*4ecca339SDan Handley	ret
278*4ecca339SDan Handley
279*4ecca339SDan Handley
280*4ecca339SDan Handleyfunc wfi
281*4ecca339SDan Handley	wfi
282*4ecca339SDan Handley	ret
283*4ecca339SDan Handley
284*4ecca339SDan Handley
285*4ecca339SDan Handleyfunc eret
286*4ecca339SDan Handley	eret
287*4ecca339SDan Handley
288*4ecca339SDan Handley
289*4ecca339SDan Handleyfunc smc
290*4ecca339SDan Handley	smc	#0
291*4ecca339SDan Handley
292*4ecca339SDan Handley/* -----------------------------------------------------------------------
293*4ecca339SDan Handley * void zeromem16(void *mem, unsigned int length);
294*4ecca339SDan Handley *
295*4ecca339SDan Handley * Initialise a memory region to 0.
296*4ecca339SDan Handley * The memory address must be 16-byte aligned.
297*4ecca339SDan Handley * -----------------------------------------------------------------------
298*4ecca339SDan Handley */
299*4ecca339SDan Handleyfunc zeromem16
300*4ecca339SDan Handley	add	x2, x0, x1
301*4ecca339SDan Handley/* zero 16 bytes at a time */
302*4ecca339SDan Handleyz_loop16:
303*4ecca339SDan Handley	sub	x3, x2, x0
304*4ecca339SDan Handley	cmp	x3, #16
305*4ecca339SDan Handley	b.lt	z_loop1
306*4ecca339SDan Handley	stp	xzr, xzr, [x0], #16
307*4ecca339SDan Handley	b	z_loop16
308*4ecca339SDan Handley/* zero byte per byte */
309*4ecca339SDan Handleyz_loop1:
310*4ecca339SDan Handley	cmp	x0, x2
311*4ecca339SDan Handley	b.eq	z_end
312*4ecca339SDan Handley	strb	wzr, [x0], #1
313*4ecca339SDan Handley	b	z_loop1
314*4ecca339SDan Handleyz_end:	ret
315*4ecca339SDan Handley
316*4ecca339SDan Handley
317*4ecca339SDan Handley/* --------------------------------------------------------------------------
318*4ecca339SDan Handley * void memcpy16(void *dest, const void *src, unsigned int length)
319*4ecca339SDan Handley *
320*4ecca339SDan Handley * Copy length bytes from memory area src to memory area dest.
321*4ecca339SDan Handley * The memory areas should not overlap.
322*4ecca339SDan Handley * Destination and source addresses must be 16-byte aligned.
323*4ecca339SDan Handley * --------------------------------------------------------------------------
324*4ecca339SDan Handley */
325*4ecca339SDan Handleyfunc memcpy16
326*4ecca339SDan Handley/* copy 16 bytes at a time */
327*4ecca339SDan Handleym_loop16:
328*4ecca339SDan Handley	cmp	x2, #16
329*4ecca339SDan Handley	b.lt	m_loop1
330*4ecca339SDan Handley	ldp	x3, x4, [x1], #16
331*4ecca339SDan Handley	stp	x3, x4, [x0], #16
332*4ecca339SDan Handley	sub	x2, x2, #16
333*4ecca339SDan Handley	b	m_loop16
334*4ecca339SDan Handley/* copy byte per byte */
335*4ecca339SDan Handleym_loop1:
336*4ecca339SDan Handley	cbz	x2, m_end
337*4ecca339SDan Handley	ldrb	w3, [x1], #1
338*4ecca339SDan Handley	strb	w3, [x0], #1
339*4ecca339SDan Handley	subs	x2, x2, #1
340*4ecca339SDan Handley	b.ne	m_loop1
341*4ecca339SDan Handleym_end:	ret
342