Merge tag 'xilinx-for-v2017.05' of git://www.denx.de/git/u-boot-microblaze
[platform/kernel/u-boot.git] / arch / arm / cpu / armv8 / exceptions.S
1 /*
2  * (C) Copyright 2013
3  * David Feng <fenghua@phytium.com.cn>
4  *
5  * SPDX-License-Identifier:     GPL-2.0+
6  */
7
8 #include <asm-offsets.h>
9 #include <config.h>
10 #include <asm/ptrace.h>
11 #include <asm/macro.h>
12 #include <linux/linkage.h>
13
14 /*
15  * Enter Exception.
16  * This will save the processor state that is ELR/X0~X30
17  * to the stack frame.
18  */
19 .macro  exception_entry
20         stp     x29, x30, [sp, #-16]!
21         stp     x27, x28, [sp, #-16]!
22         stp     x25, x26, [sp, #-16]!
23         stp     x23, x24, [sp, #-16]!
24         stp     x21, x22, [sp, #-16]!
25         stp     x19, x20, [sp, #-16]!
26         stp     x17, x18, [sp, #-16]!
27         stp     x15, x16, [sp, #-16]!
28         stp     x13, x14, [sp, #-16]!
29         stp     x11, x12, [sp, #-16]!
30         stp     x9, x10, [sp, #-16]!
31         stp     x7, x8, [sp, #-16]!
32         stp     x5, x6, [sp, #-16]!
33         stp     x3, x4, [sp, #-16]!
34         stp     x1, x2, [sp, #-16]!
35
36         /* Could be running at EL3/EL2/EL1 */
37         switch_el x11, 3f, 2f, 1f
38 3:      mrs     x1, esr_el3
39         mrs     x2, elr_el3
40         b       0f
41 2:      mrs     x1, esr_el2
42         mrs     x2, elr_el2
43         b       0f
44 1:      mrs     x1, esr_el1
45         mrs     x2, elr_el1
46 0:
47         stp     x2, x0, [sp, #-16]!
48         mov     x0, sp
49 .endm
50
51 /*
52  * Exception vectors.
53  */
54         .align  11
55         .globl  vectors
56 vectors:
57         .align  7
58         b       _do_bad_sync    /* Current EL Synchronous Thread */
59
60         .align  7
61         b       _do_bad_irq     /* Current EL IRQ Thread */
62
63         .align  7
64         b       _do_bad_fiq     /* Current EL FIQ Thread */
65
66         .align  7
67         b       _do_bad_error   /* Current EL Error Thread */
68
69         .align  7
70         b       _do_sync        /* Current EL Synchronous Handler */
71
72         .align  7
73         b       _do_irq         /* Current EL IRQ Handler */
74
75         .align  7
76         b       _do_fiq         /* Current EL FIQ Handler */
77
78         .align  7
79         b       _do_error       /* Current EL Error Handler */
80
81
82 _do_bad_sync:
83         exception_entry
84         bl      do_bad_sync
85         b       exception_exit
86
87 _do_bad_irq:
88         exception_entry
89         bl      do_bad_irq
90         b       exception_exit
91
92 _do_bad_fiq:
93         exception_entry
94         bl      do_bad_fiq
95         b       exception_exit
96
97 _do_bad_error:
98         exception_entry
99         bl      do_bad_error
100         b       exception_exit
101
102 _do_sync:
103         exception_entry
104         bl      do_sync
105         b       exception_exit
106
107 _do_irq:
108         exception_entry
109         bl      do_irq
110         b       exception_exit
111
112 _do_fiq:
113         exception_entry
114         bl      do_fiq
115         b       exception_exit
116
117 _do_error:
118         exception_entry
119         bl      do_error
120         b       exception_exit
121
122 exception_exit:
123         ldp     x2, x0, [sp],#16
124         switch_el x11, 3f, 2f, 1f
125 3:      msr     elr_el3, x2
126         b       0f
127 2:      msr     elr_el2, x2
128         b       0f
129 1:      msr     elr_el1, x2
130 0:
131         ldp     x1, x2, [sp],#16
132         ldp     x3, x4, [sp],#16
133         ldp     x5, x6, [sp],#16
134         ldp     x7, x8, [sp],#16
135         ldp     x9, x10, [sp],#16
136         ldp     x11, x12, [sp],#16
137         ldp     x13, x14, [sp],#16
138         ldp     x15, x16, [sp],#16
139         ldp     x17, x18, [sp],#16
140         ldp     x19, x20, [sp],#16
141         ldp     x21, x22, [sp],#16
142         ldp     x23, x24, [sp],#16
143         ldp     x25, x26, [sp],#16
144         ldp     x27, x28, [sp],#16
145         ldp     x29, x30, [sp],#16
146         eret