xref: /rk3399_rockchip-uboot/arch/arm/cpu/armv8/exceptions.S (revision 0ae7653128c80a4f2920cbe9b124792c2fd9d9e0)
1*0ae76531SDavid Feng/*
2*0ae76531SDavid Feng * (C) Copyright 2013
3*0ae76531SDavid Feng * David Feng <fenghua@phytium.com.cn>
4*0ae76531SDavid Feng *
5*0ae76531SDavid Feng * SPDX-License-Identifier:	GPL-2.0+
6*0ae76531SDavid Feng */
7*0ae76531SDavid Feng
8*0ae76531SDavid Feng#include <asm-offsets.h>
9*0ae76531SDavid Feng#include <config.h>
10*0ae76531SDavid Feng#include <version.h>
11*0ae76531SDavid Feng#include <asm/ptrace.h>
12*0ae76531SDavid Feng#include <asm/macro.h>
13*0ae76531SDavid Feng#include <linux/linkage.h>
14*0ae76531SDavid Feng
15*0ae76531SDavid Feng/*
16*0ae76531SDavid Feng * Enter Exception.
17*0ae76531SDavid Feng * This will save the processor state that is ELR/X0~X30
18*0ae76531SDavid Feng * to the stack frame.
19*0ae76531SDavid Feng */
20*0ae76531SDavid Feng.macro	exception_entry
21*0ae76531SDavid Feng	stp	x29, x30, [sp, #-16]!
22*0ae76531SDavid Feng	stp	x27, x28, [sp, #-16]!
23*0ae76531SDavid Feng	stp	x25, x26, [sp, #-16]!
24*0ae76531SDavid Feng	stp	x23, x24, [sp, #-16]!
25*0ae76531SDavid Feng	stp	x21, x22, [sp, #-16]!
26*0ae76531SDavid Feng	stp	x19, x20, [sp, #-16]!
27*0ae76531SDavid Feng	stp	x17, x18, [sp, #-16]!
28*0ae76531SDavid Feng	stp	x15, x16, [sp, #-16]!
29*0ae76531SDavid Feng	stp	x13, x14, [sp, #-16]!
30*0ae76531SDavid Feng	stp	x11, x12, [sp, #-16]!
31*0ae76531SDavid Feng	stp	x9, x10, [sp, #-16]!
32*0ae76531SDavid Feng	stp	x7, x8, [sp, #-16]!
33*0ae76531SDavid Feng	stp	x5, x6, [sp, #-16]!
34*0ae76531SDavid Feng	stp	x3, x4, [sp, #-16]!
35*0ae76531SDavid Feng	stp	x1, x2, [sp, #-16]!
36*0ae76531SDavid Feng
37*0ae76531SDavid Feng	/* Could be running at EL3/EL2/EL1 */
38*0ae76531SDavid Feng	switch_el x11, 3f, 2f, 1f
39*0ae76531SDavid Feng3:	mrs	x1, esr_el3
40*0ae76531SDavid Feng	mrs	x2, elr_el3
41*0ae76531SDavid Feng	b	0f
42*0ae76531SDavid Feng2:	mrs	x1, esr_el2
43*0ae76531SDavid Feng	mrs	x2, elr_el2
44*0ae76531SDavid Feng	b	0f
45*0ae76531SDavid Feng1:	mrs	x1, esr_el1
46*0ae76531SDavid Feng	mrs	x2, elr_el1
47*0ae76531SDavid Feng0:
48*0ae76531SDavid Feng	stp	x2, x0, [sp, #-16]!
49*0ae76531SDavid Feng	mov	x0, sp
50*0ae76531SDavid Feng.endm
51*0ae76531SDavid Feng
52*0ae76531SDavid Feng/*
53*0ae76531SDavid Feng * Exception vectors.
54*0ae76531SDavid Feng */
55*0ae76531SDavid Feng	.align	11
56*0ae76531SDavid Feng	.globl	vectors
57*0ae76531SDavid Fengvectors:
58*0ae76531SDavid Feng	.align	7
59*0ae76531SDavid Feng	b	_do_bad_sync	/* Current EL Synchronous Thread */
60*0ae76531SDavid Feng
61*0ae76531SDavid Feng	.align	7
62*0ae76531SDavid Feng	b	_do_bad_irq	/* Current EL IRQ Thread */
63*0ae76531SDavid Feng
64*0ae76531SDavid Feng	.align	7
65*0ae76531SDavid Feng	b	_do_bad_fiq	/* Current EL FIQ Thread */
66*0ae76531SDavid Feng
67*0ae76531SDavid Feng	.align	7
68*0ae76531SDavid Feng	b	_do_bad_error	/* Current EL Error Thread */
69*0ae76531SDavid Feng
70*0ae76531SDavid Feng	.align	7
71*0ae76531SDavid Feng	b	_do_sync	/* Current EL Synchronous Handler */
72*0ae76531SDavid Feng
73*0ae76531SDavid Feng	.align	7
74*0ae76531SDavid Feng	b	_do_irq		/* Current EL IRQ Handler */
75*0ae76531SDavid Feng
76*0ae76531SDavid Feng	.align	7
77*0ae76531SDavid Feng	b	_do_fiq		/* Current EL FIQ Handler */
78*0ae76531SDavid Feng
79*0ae76531SDavid Feng	.align	7
80*0ae76531SDavid Feng	b	_do_error	/* Current EL Error Handler */
81*0ae76531SDavid Feng
82*0ae76531SDavid Feng
83*0ae76531SDavid Feng_do_bad_sync:
84*0ae76531SDavid Feng	exception_entry
85*0ae76531SDavid Feng	bl	do_bad_sync
86*0ae76531SDavid Feng
87*0ae76531SDavid Feng_do_bad_irq:
88*0ae76531SDavid Feng	exception_entry
89*0ae76531SDavid Feng	bl	do_bad_irq
90*0ae76531SDavid Feng
91*0ae76531SDavid Feng_do_bad_fiq:
92*0ae76531SDavid Feng	exception_entry
93*0ae76531SDavid Feng	bl	do_bad_fiq
94*0ae76531SDavid Feng
95*0ae76531SDavid Feng_do_bad_error:
96*0ae76531SDavid Feng	exception_entry
97*0ae76531SDavid Feng	bl	do_bad_error
98*0ae76531SDavid Feng
99*0ae76531SDavid Feng_do_sync:
100*0ae76531SDavid Feng	exception_entry
101*0ae76531SDavid Feng	bl	do_sync
102*0ae76531SDavid Feng
103*0ae76531SDavid Feng_do_irq:
104*0ae76531SDavid Feng	exception_entry
105*0ae76531SDavid Feng	bl	do_irq
106*0ae76531SDavid Feng
107*0ae76531SDavid Feng_do_fiq:
108*0ae76531SDavid Feng	exception_entry
109*0ae76531SDavid Feng	bl	do_fiq
110*0ae76531SDavid Feng
111*0ae76531SDavid Feng_do_error:
112*0ae76531SDavid Feng	exception_entry
113*0ae76531SDavid Feng	bl	do_error
114