hc
2024-03-22 a0752693d998599af469473b8dc239ef973a012f
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
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
/* SPDX-License-Identifier: GPL-2.0+ OR BSD-3-Clause */
/*
 * Copyright (C) 2023 Rockchip Electronics Co., Ltd.
 */
 
   .global __sp
 
   .global secondary_main
   .global secondary_init
   .global get_cpu_id
   .global lock_byte_mutex
   .global unlock_byte_mutex
 
#ifndef CONFIG_ARM64
   .align    7
vectors_2:
   ldr    pc, =die_loop    /* reset */
   ldr    pc, =die_loop    /* undefine */
   ldr    pc, =die_loop    /* swi */
   ldr    pc, =die_loop    /* iabort */
   ldr    pc, =die_loop    /* dabort */
   ldr    pc, =die_loop    /* reserved */
   ldr    pc, =die_loop    /* irq */
   ldr    pc, =die_loop    /* fiq */
 
   .align    7
die_loop:
   b    die_loop
 
   .align    7
   .type    secondary_init, %function
secondary_init:
   bl    irq_disable
   bl    icache_invalid
 
   /* set sp */
   ldr    r2, =__sp
   ldr    r1, [r2]
   bic    r1, r1, #0xf
   mov    sp, r1
   bl    icache_invalid
 
   mrc    p15, 0, r0, c1, c0, 0    /* CP15 C1 System Control Register */
   bic    r0, r0, #0x2000        /* clear V (bit[13], VBAR) */
   mcr    p15, 0, r0, c1, c0, 0    /* for remap VBAR */
   ldr    r0, =vectors_2
   mcr    p15, 0, r0, c12, c0, 0
   bl    icache_invalid
 
   b    secondary_main
 
irq_disable:
   mrs    r0, cpsr
   orr    r0, r0, #0xc0
   msr    cpsr, r0
   bx    lr
 
icache_invalid:
   mov    r0, #0
   mcr    p15, 0, r0, c7, c5, 0
   bx    lr
 
   .type    get_cpu_id, %function
get_cpu_id:
   mrc    p15, 0, r0, c0, c0, 5
   and    r0, r0, #0x3
   bx    lr
 
   .align    7
   .type    lock_byte_mutex, %function
lock_byte_mutex:
   mov    r2, #0x1
try:
   ldrex    r1, [r0]
   cmp    r1, #0
   strexeq    r1, r2, [r0]
   cmpeq    r1, #0
   bne    try
   dmb
   bx    lr
 
   .align    7
   .type    unlock_byte_mutex, %function
unlock_byte_mutex:
   dmb
   mov    r1, #0
   str    r1, [r0]
   dsb
   bx    lr
#else /* CONFIG_ARM64 */
   .align    7
el2_vectors:
synchronous_sp0:
   b    secondary_init
   .align    7
irq_sp0:
   b    irq_sp0
   .align    7
fiq_sp0:
   b    fiq_sp0
   .align    7
serror_sp0:
   b    serror_sp0
   .align    7
synchronous_spx:
   b    synchronous_spx
   .align    7
irq_spx:
   b    irq_spx
   .align    7
fiq_spx:
   b    fiq_spx
   .align    7
serror_spx:
   b    serror_spx
 
   .align    7
   .type    secondary_init, %function
secondary_init:
   bl    irq_disable
 
   /* set sp */
   ldr    x2, =__sp
   ldr    x1, [x2]
   bic    x1, x1, #0xf
   mov    sp, x1
   bl    icache_invalid
 
   ldr    w0, =el2_vectors
   msr    vbar_el2, x0
   bl    icache_invalid
 
   bl    secondary_main
 
   .type    irq_disable, %function
irq_disable:
   msr    daifset, #0x3
   ic    iallu
   ret
 
   .type    icache_invalid, %function
icache_invalid:
   ic    iallu
   ret
 
   .align    7
   .type    lock_byte_mutex, %function
lock_byte_mutex:
   ldxrb    w1, [x0]
   cmp    w1, #1
   bne    1f
   wfe
   b    lock_byte_mutex
1:
   mov    x1, #1
   stxrb    w2, w1, [x0]
   cmp    w2, #0
   bne    lock_byte_mutex
   dmb    sy
   ret
 
   .align    7
   .type    unlock_byte_mutex, %function
unlock_byte_mutex:
   dmb    sy
   mov    x1, #0
   strb    w1, [x0]
   dsb    sy
   sev
   ret
#endif    /* #ifdef CONFIG_ARM */