xref: /OK3568_Linux_fs/u-boot/arch/arm/cpu/armv8/exceptions.S (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun/*
2*4882a593Smuzhiyun * (C) Copyright 2013
3*4882a593Smuzhiyun * David Feng <fenghua@phytium.com.cn>
4*4882a593Smuzhiyun *
5*4882a593Smuzhiyun * SPDX-License-Identifier:	GPL-2.0+
6*4882a593Smuzhiyun */
7*4882a593Smuzhiyun
8*4882a593Smuzhiyun#include <asm-offsets.h>
9*4882a593Smuzhiyun#include <config.h>
10*4882a593Smuzhiyun#include <asm/ptrace.h>
11*4882a593Smuzhiyun#include <asm/macro.h>
12*4882a593Smuzhiyun#include <linux/linkage.h>
13*4882a593Smuzhiyun
14*4882a593Smuzhiyun/*
15*4882a593Smuzhiyun * Exception vectors.
16*4882a593Smuzhiyun */
17*4882a593Smuzhiyun	.align	11
18*4882a593Smuzhiyun	.globl	vectors
19*4882a593Smuzhiyunvectors:
20*4882a593Smuzhiyun	.align	7		/* Current EL Synchronous Thread */
21*4882a593Smuzhiyun	stp	x29, x30, [sp, #-16]!
22*4882a593Smuzhiyun	bl	_exception_entry
23*4882a593Smuzhiyun	bl	do_bad_sync
24*4882a593Smuzhiyun	b	exception_exit
25*4882a593Smuzhiyun
26*4882a593Smuzhiyun	.align	7		/* Current EL IRQ Thread */
27*4882a593Smuzhiyun	stp	x29, x30, [sp, #-16]!
28*4882a593Smuzhiyun	bl	_exception_entry
29*4882a593Smuzhiyun	bl	do_bad_irq
30*4882a593Smuzhiyun	b	exception_exit
31*4882a593Smuzhiyun
32*4882a593Smuzhiyun	.align	7		/* Current EL FIQ Thread */
33*4882a593Smuzhiyun	stp	x29, x30, [sp, #-16]!
34*4882a593Smuzhiyun	bl	_exception_entry
35*4882a593Smuzhiyun	bl	do_bad_fiq
36*4882a593Smuzhiyun	b	exception_exit
37*4882a593Smuzhiyun
38*4882a593Smuzhiyun	.align	7		/* Current EL Error Thread */
39*4882a593Smuzhiyun	stp	x29, x30, [sp, #-16]!
40*4882a593Smuzhiyun	bl	_exception_entry
41*4882a593Smuzhiyun	bl	do_bad_error
42*4882a593Smuzhiyun	b	exception_exit
43*4882a593Smuzhiyun
44*4882a593Smuzhiyun	.align	7		 /* Current EL Synchronous Handler */
45*4882a593Smuzhiyun	stp	x29, x30, [sp, #-16]!
46*4882a593Smuzhiyun	bl	_exception_entry
47*4882a593Smuzhiyun	bl	do_sync
48*4882a593Smuzhiyun	b	exception_exit
49*4882a593Smuzhiyun
50*4882a593Smuzhiyun	.align	7		 /* Current EL IRQ Handler */
51*4882a593Smuzhiyun	stp	x29, x30, [sp, #-16]!
52*4882a593Smuzhiyun	bl	_exception_entry
53*4882a593Smuzhiyun	bl	do_irq
54*4882a593Smuzhiyun	b	exception_exit
55*4882a593Smuzhiyun
56*4882a593Smuzhiyun	.align	7		 /* Current EL FIQ Handler */
57*4882a593Smuzhiyun	stp	x29, x30, [sp, #-16]!
58*4882a593Smuzhiyun	bl	_exception_entry
59*4882a593Smuzhiyun	bl	do_fiq
60*4882a593Smuzhiyun	b	exception_exit
61*4882a593Smuzhiyun
62*4882a593Smuzhiyun	.align	7		 /* Current EL Error Handler */
63*4882a593Smuzhiyun	stp	x29, x30, [sp, #-16]!
64*4882a593Smuzhiyun	bl	_exception_entry
65*4882a593Smuzhiyun	bl	do_error
66*4882a593Smuzhiyun	b	exception_exit
67*4882a593Smuzhiyun
68*4882a593Smuzhiyun/*
69*4882a593Smuzhiyun * Enter Exception.
70*4882a593Smuzhiyun * This will save the processor state that is ELR/X0~X30
71*4882a593Smuzhiyun * to the stack frame.
72*4882a593Smuzhiyun */
73*4882a593Smuzhiyun_exception_entry:
74*4882a593Smuzhiyun	stp	x27, x28, [sp, #-16]!
75*4882a593Smuzhiyun	stp	x25, x26, [sp, #-16]!
76*4882a593Smuzhiyun	stp	x23, x24, [sp, #-16]!
77*4882a593Smuzhiyun	stp	x21, x22, [sp, #-16]!
78*4882a593Smuzhiyun	stp	x19, x20, [sp, #-16]!
79*4882a593Smuzhiyun	stp	x17, x18, [sp, #-16]!
80*4882a593Smuzhiyun	stp	x15, x16, [sp, #-16]!
81*4882a593Smuzhiyun	stp	x13, x14, [sp, #-16]!
82*4882a593Smuzhiyun	stp	x11, x12, [sp, #-16]!
83*4882a593Smuzhiyun	stp	x9, x10, [sp, #-16]!
84*4882a593Smuzhiyun	stp	x7, x8, [sp, #-16]!
85*4882a593Smuzhiyun	stp	x5, x6, [sp, #-16]!
86*4882a593Smuzhiyun	stp	x3, x4, [sp, #-16]!
87*4882a593Smuzhiyun	stp	x1, x2, [sp, #-16]!
88*4882a593Smuzhiyun
89*4882a593Smuzhiyun	/* Could be running at EL3/EL2/EL1 */
90*4882a593Smuzhiyun	switch_el x11, 3f, 2f, 1f
91*4882a593Smuzhiyun3:	mrs	x1, esr_el3
92*4882a593Smuzhiyun	mrs	x2, elr_el3
93*4882a593Smuzhiyun	mrs	x3, daif
94*4882a593Smuzhiyun	mrs	x4, vbar_el3
95*4882a593Smuzhiyun	mrs	x5, spsr_el3
96*4882a593Smuzhiyun	sub	x6, sp, #(8*30)
97*4882a593Smuzhiyun	mrs	x7, sctlr_el3
98*4882a593Smuzhiyun	mrs	x8, scr_el3
99*4882a593Smuzhiyun	mrs	x9, ttbr0_el3
100*4882a593Smuzhiyun	b	0f
101*4882a593Smuzhiyun2:	mrs	x1, esr_el2
102*4882a593Smuzhiyun	mrs	x2, elr_el2
103*4882a593Smuzhiyun	mrs	x3, daif
104*4882a593Smuzhiyun	mrs	x4, vbar_el2
105*4882a593Smuzhiyun	mrs	x5, spsr_el2
106*4882a593Smuzhiyun	sub	x6, sp, #(8*30)
107*4882a593Smuzhiyun	mrs	x7, sctlr_el2
108*4882a593Smuzhiyun	mrs	x8, hcr_el2
109*4882a593Smuzhiyun	mrs	x9, ttbr0_el2
110*4882a593Smuzhiyun	b	0f
111*4882a593Smuzhiyun
112*4882a593Smuzhiyun1:	mrs	x1, esr_el1
113*4882a593Smuzhiyun	mrs	x2, elr_el1
114*4882a593Smuzhiyun	mrs	x3, daif
115*4882a593Smuzhiyun	mrs	x4, vbar_el1
116*4882a593Smuzhiyun	mrs	x5, spsr_el1
117*4882a593Smuzhiyun	sub	x6, sp, #(8*30)
118*4882a593Smuzhiyun	mrs	x7, sctlr_el1
119*4882a593Smuzhiyun	mov	x8, #0	/* Not used, EL1 don't have register, like 'scr_el1' */
120*4882a593Smuzhiyun	mrs	x9, ttbr0_el1
121*4882a593Smuzhiyun0:
122*4882a593Smuzhiyun	stp     x2, x0, [sp, #-16]!
123*4882a593Smuzhiyun	stp	x3, x1, [sp, #-16]!
124*4882a593Smuzhiyun	stp	x5, x4, [sp, #-16]!
125*4882a593Smuzhiyun	stp	x7, x6, [sp, #-16]!
126*4882a593Smuzhiyun	stp	x9, x8, [sp, #-16]!
127*4882a593Smuzhiyun	mov	x0, sp
128*4882a593Smuzhiyun	ret
129*4882a593Smuzhiyun
130*4882a593Smuzhiyun
131*4882a593Smuzhiyunexception_exit:
132*4882a593Smuzhiyun	add	sp, sp, #(8*8)/* see: sys registers size of struct pt_regs */
133*4882a593Smuzhiyun	ldp	x2, x0, [sp],#16
134*4882a593Smuzhiyun	switch_el x11, 3f, 2f, 1f
135*4882a593Smuzhiyun3:	msr	elr_el3, x2
136*4882a593Smuzhiyun	b	0f
137*4882a593Smuzhiyun2:	msr	elr_el2, x2
138*4882a593Smuzhiyun	b	0f
139*4882a593Smuzhiyun1:	msr	elr_el1, x2
140*4882a593Smuzhiyun0:
141*4882a593Smuzhiyun	ldp	x1, x2, [sp],#16
142*4882a593Smuzhiyun	ldp	x3, x4, [sp],#16
143*4882a593Smuzhiyun	ldp	x5, x6, [sp],#16
144*4882a593Smuzhiyun	ldp	x7, x8, [sp],#16
145*4882a593Smuzhiyun	ldp	x9, x10, [sp],#16
146*4882a593Smuzhiyun	ldp	x11, x12, [sp],#16
147*4882a593Smuzhiyun	ldp	x13, x14, [sp],#16
148*4882a593Smuzhiyun	ldp	x15, x16, [sp],#16
149*4882a593Smuzhiyun	ldp	x17, x18, [sp],#16
150*4882a593Smuzhiyun	ldp	x19, x20, [sp],#16
151*4882a593Smuzhiyun	ldp	x21, x22, [sp],#16
152*4882a593Smuzhiyun	ldp	x23, x24, [sp],#16
153*4882a593Smuzhiyun	ldp	x25, x26, [sp],#16
154*4882a593Smuzhiyun	ldp	x27, x28, [sp],#16
155*4882a593Smuzhiyun	ldp	x29, x30, [sp],#16
156*4882a593Smuzhiyun	eret
157