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