blob: 8c7c1d3eb80f6883595927e0509d5705be60799d [file] [log] [blame]
David Feng85fd5f12013-12-14 11:47:35 +08001/*
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>
David Feng85fd5f12013-12-14 11:47:35 +080010#include <asm/ptrace.h>
11#include <asm/macro.h>
12#include <linux/linkage.h>
13
14/*
Andre Przywara143362c2017-11-27 00:47:09 +000015 * Exception vectors.
16 */
17 .align 11
18 .globl vectors
19vectors:
20 .align 7 /* Current EL Synchronous Thread */
21 stp x29, x30, [sp, #-16]!
22 bl _exception_entry
23 bl do_bad_sync
24 b exception_exit
25
26 .align 7 /* Current EL IRQ Thread */
27 stp x29, x30, [sp, #-16]!
28 bl _exception_entry
29 bl do_bad_irq
30 b exception_exit
31
32 .align 7 /* Current EL FIQ Thread */
33 stp x29, x30, [sp, #-16]!
34 bl _exception_entry
35 bl do_bad_fiq
36 b exception_exit
37
38 .align 7 /* Current EL Error Thread */
39 stp x29, x30, [sp, #-16]!
40 bl _exception_entry
41 bl do_bad_error
42 b exception_exit
43
44 .align 7 /* Current EL Synchronous Handler */
45 stp x29, x30, [sp, #-16]!
46 bl _exception_entry
47 bl do_sync
48 b exception_exit
49
50 .align 7 /* Current EL IRQ Handler */
51 stp x29, x30, [sp, #-16]!
52 bl _exception_entry
53 bl do_irq
54 b exception_exit
55
56 .align 7 /* Current EL FIQ Handler */
57 stp x29, x30, [sp, #-16]!
58 bl _exception_entry
59 bl do_fiq
60 b exception_exit
61
62 .align 7 /* Current EL Error Handler */
63 stp x29, x30, [sp, #-16]!
64 bl _exception_entry
65 bl do_error
66 b exception_exit
67
68/*
David Feng85fd5f12013-12-14 11:47:35 +080069 * Enter Exception.
70 * This will save the processor state that is ELR/X0~X30
71 * to the stack frame.
72 */
Andre Przywara143362c2017-11-27 00:47:09 +000073_exception_entry:
David Feng85fd5f12013-12-14 11:47:35 +080074 stp x27, x28, [sp, #-16]!
75 stp x25, x26, [sp, #-16]!
76 stp x23, x24, [sp, #-16]!
77 stp x21, x22, [sp, #-16]!
78 stp x19, x20, [sp, #-16]!
79 stp x17, x18, [sp, #-16]!
80 stp x15, x16, [sp, #-16]!
81 stp x13, x14, [sp, #-16]!
82 stp x11, x12, [sp, #-16]!
83 stp x9, x10, [sp, #-16]!
84 stp x7, x8, [sp, #-16]!
85 stp x5, x6, [sp, #-16]!
86 stp x3, x4, [sp, #-16]!
87 stp x1, x2, [sp, #-16]!
88
89 /* Could be running at EL3/EL2/EL1 */
90 switch_el x11, 3f, 2f, 1f
913: mrs x1, esr_el3
92 mrs x2, elr_el3
93 b 0f
942: mrs x1, esr_el2
95 mrs x2, elr_el2
96 b 0f
971: mrs x1, esr_el1
98 mrs x2, elr_el1
990:
100 stp x2, x0, [sp, #-16]!
101 mov x0, sp
Andre Przywara143362c2017-11-27 00:47:09 +0000102 ret
David Feng85fd5f12013-12-14 11:47:35 +0800103
Alexander Graf99adbd92016-03-04 01:10:05 +0100104
105exception_exit:
106 ldp x2, x0, [sp],#16
107 switch_el x11, 3f, 2f, 1f
1083: msr elr_el3, x2
109 b 0f
1102: msr elr_el2, x2
111 b 0f
1121: msr elr_el1, x2
1130:
114 ldp x1, x2, [sp],#16
115 ldp x3, x4, [sp],#16
116 ldp x5, x6, [sp],#16
117 ldp x7, x8, [sp],#16
118 ldp x9, x10, [sp],#16
119 ldp x11, x12, [sp],#16
120 ldp x13, x14, [sp],#16
121 ldp x15, x16, [sp],#16
122 ldp x17, x18, [sp],#16
123 ldp x19, x20, [sp],#16
124 ldp x21, x22, [sp],#16
125 ldp x23, x24, [sp],#16
126 ldp x25, x26, [sp],#16
127 ldp x27, x28, [sp],#16
128 ldp x29, x30, [sp],#16
129 eret