1 /* SPDX-License-Identifier: GPL-2.0-only */
2 /*
3  * Copyright 2014, Michael Ellerman, IBM Corp.
4  */
5 
6 #include <ppc-asm.h>
7 
8 	.text
9 
10 FUNC_START(core_busy_loop)
11 	stdu	%r1, -168(%r1)
12 	std	r14, 160(%r1)
13 	std	r15, 152(%r1)
14 	std	r16, 144(%r1)
15 	std	r17, 136(%r1)
16 	std	r18, 128(%r1)
17 	std	r19, 120(%r1)
18 	std	r20, 112(%r1)
19 	std	r21, 104(%r1)
20 	std	r22, 96(%r1)
21 	std	r23, 88(%r1)
22 	std	r24, 80(%r1)
23 	std	r25, 72(%r1)
24 	std	r26, 64(%r1)
25 	std	r27, 56(%r1)
26 	std	r28, 48(%r1)
27 	std	r29, 40(%r1)
28 	std	r30, 32(%r1)
29 	std	r31, 24(%r1)
30 
31 	li	 r3, 0x3030
32 	std	 r3, -96(%r1)
33 	li	 r4, 0x4040
34 	std	 r4, -104(%r1)
35 	li	 r5, 0x5050
36 	std	 r5, -112(%r1)
37 	li	 r6, 0x6060
38 	std	 r6, -120(%r1)
39 	li	 r7, 0x7070
40 	std	 r7, -128(%r1)
41 	li	 r8, 0x0808
42 	std	 r8, -136(%r1)
43 	li	 r9, 0x0909
44 	std	 r9, -144(%r1)
45 	li	r10, 0x1010
46 	std	r10, -152(%r1)
47 	li	r11, 0x1111
48 	std	r11, -160(%r1)
49 	li	r14, 0x1414
50 	std	r14, -168(%r1)
51 	li	r15, 0x1515
52 	std	r15, -176(%r1)
53 	li	r16, 0x1616
54 	std	r16, -184(%r1)
55 	li	r17, 0x1717
56 	std	r17, -192(%r1)
57 	li	r18, 0x1818
58 	std	r18, -200(%r1)
59 	li	r19, 0x1919
60 	std	r19, -208(%r1)
61 	li	r20, 0x2020
62 	std	r20, -216(%r1)
63 	li	r21, 0x2121
64 	std	r21, -224(%r1)
65 	li	r22, 0x2222
66 	std	r22, -232(%r1)
67 	li	r23, 0x2323
68 	std	r23, -240(%r1)
69 	li	r24, 0x2424
70 	std	r24, -248(%r1)
71 	li	r25, 0x2525
72 	std	r25, -256(%r1)
73 	li	r26, 0x2626
74 	std	r26, -264(%r1)
75 	li	r27, 0x2727
76 	std	r27, -272(%r1)
77 	li	r28, 0x2828
78 	std	r28, -280(%r1)
79 	li	r29, 0x2929
80 	std	r29, -288(%r1)
81 	li	r30, 0x3030
82 	li	r31, 0x3131
83 
84 	li	r3, 0
85 0:	addi	r3, r3, 1
86 	cmpwi	r3, 100
87 	blt	0b
88 
89 	/* Return 1 (fail) unless we get through all the checks */
90 	li	r3, 1
91 
92 	/* Check none of our registers have been corrupted */
93 	cmpwi	r4,  0x4040
94 	bne	1f
95 	cmpwi	r5,  0x5050
96 	bne	1f
97 	cmpwi	r6,  0x6060
98 	bne	1f
99 	cmpwi	r7,  0x7070
100 	bne	1f
101 	cmpwi	r8,  0x0808
102 	bne	1f
103 	cmpwi	r9,  0x0909
104 	bne	1f
105 	cmpwi	r10, 0x1010
106 	bne	1f
107 	cmpwi	r11, 0x1111
108 	bne	1f
109 	cmpwi	r14, 0x1414
110 	bne	1f
111 	cmpwi	r15, 0x1515
112 	bne	1f
113 	cmpwi	r16, 0x1616
114 	bne	1f
115 	cmpwi	r17, 0x1717
116 	bne	1f
117 	cmpwi	r18, 0x1818
118 	bne	1f
119 	cmpwi	r19, 0x1919
120 	bne	1f
121 	cmpwi	r20, 0x2020
122 	bne	1f
123 	cmpwi	r21, 0x2121
124 	bne	1f
125 	cmpwi	r22, 0x2222
126 	bne	1f
127 	cmpwi	r23, 0x2323
128 	bne	1f
129 	cmpwi	r24, 0x2424
130 	bne	1f
131 	cmpwi	r25, 0x2525
132 	bne	1f
133 	cmpwi	r26, 0x2626
134 	bne	1f
135 	cmpwi	r27, 0x2727
136 	bne	1f
137 	cmpwi	r28, 0x2828
138 	bne	1f
139 	cmpwi	r29, 0x2929
140 	bne	1f
141 	cmpwi	r30, 0x3030
142 	bne	1f
143 	cmpwi	r31, 0x3131
144 	bne	1f
145 
146 	/* Load junk into all our registers before we reload them from the stack. */
147 	li	r3,  0xde
148 	li	r4,  0xad
149 	li	r5,  0xbe
150 	li	r6,  0xef
151 	li	r7,  0xde
152 	li	r8,  0xad
153 	li	r9,  0xbe
154 	li	r10, 0xef
155 	li	r11, 0xde
156 	li	r14, 0xad
157 	li	r15, 0xbe
158 	li	r16, 0xef
159 	li	r17, 0xde
160 	li	r18, 0xad
161 	li	r19, 0xbe
162 	li	r20, 0xef
163 	li	r21, 0xde
164 	li	r22, 0xad
165 	li	r23, 0xbe
166 	li	r24, 0xef
167 	li	r25, 0xde
168 	li	r26, 0xad
169 	li	r27, 0xbe
170 	li	r28, 0xef
171 	li	r29, 0xdd
172 
173 	ld	r3,	-96(%r1)
174 	cmpwi	r3,  0x3030
175 	bne	1f
176 	ld	r4,	-104(%r1)
177 	cmpwi	r4,  0x4040
178 	bne	1f
179 	ld	r5,	-112(%r1)
180 	cmpwi	r5,  0x5050
181 	bne	1f
182 	ld	r6,	-120(%r1)
183 	cmpwi	r6,  0x6060
184 	bne	1f
185 	ld	r7,	-128(%r1)
186 	cmpwi	r7,  0x7070
187 	bne	1f
188 	ld	r8,	-136(%r1)
189 	cmpwi	r8,  0x0808
190 	bne	1f
191 	ld	r9,	-144(%r1)
192 	cmpwi	r9,  0x0909
193 	bne	1f
194 	ld	r10, -152(%r1)
195 	cmpwi	r10, 0x1010
196 	bne	1f
197 	ld	r11, -160(%r1)
198 	cmpwi	r11, 0x1111
199 	bne	1f
200 	ld	r14, -168(%r1)
201 	cmpwi	r14, 0x1414
202 	bne	1f
203 	ld	r15, -176(%r1)
204 	cmpwi	r15, 0x1515
205 	bne	1f
206 	ld	r16, -184(%r1)
207 	cmpwi	r16, 0x1616
208 	bne	1f
209 	ld	r17, -192(%r1)
210 	cmpwi	r17, 0x1717
211 	bne	1f
212 	ld	r18, -200(%r1)
213 	cmpwi	r18, 0x1818
214 	bne	1f
215 	ld	r19, -208(%r1)
216 	cmpwi	r19, 0x1919
217 	bne	1f
218 	ld	r20, -216(%r1)
219 	cmpwi	r20, 0x2020
220 	bne	1f
221 	ld	r21, -224(%r1)
222 	cmpwi	r21, 0x2121
223 	bne	1f
224 	ld	r22, -232(%r1)
225 	cmpwi	r22, 0x2222
226 	bne	1f
227 	ld	r23, -240(%r1)
228 	cmpwi	r23, 0x2323
229 	bne	1f
230 	ld	r24, -248(%r1)
231 	cmpwi	r24, 0x2424
232 	bne	1f
233 	ld	r25, -256(%r1)
234 	cmpwi	r25, 0x2525
235 	bne	1f
236 	ld	r26, -264(%r1)
237 	cmpwi	r26, 0x2626
238 	bne	1f
239 	ld	r27, -272(%r1)
240 	cmpwi	r27, 0x2727
241 	bne	1f
242 	ld	r28, -280(%r1)
243 	cmpwi	r28, 0x2828
244 	bne	1f
245 	ld	r29, -288(%r1)
246 	cmpwi	r29, 0x2929
247 	bne	1f
248 
249 	/* Load 0 (success) to return */
250 	li	r3, 0
251 
252 1:	ld	r14, 160(%r1)
253 	ld	r15, 152(%r1)
254 	ld	r16, 144(%r1)
255 	ld	r17, 136(%r1)
256 	ld	r18, 128(%r1)
257 	ld	r19, 120(%r1)
258 	ld	r20, 112(%r1)
259 	ld	r21, 104(%r1)
260 	ld	r22, 96(%r1)
261 	ld	r23, 88(%r1)
262 	ld	r24, 80(%r1)
263 	ld	r25, 72(%r1)
264 	ld	r26, 64(%r1)
265 	ld	r27, 56(%r1)
266 	ld	r28, 48(%r1)
267 	ld	r29, 40(%r1)
268 	ld	r30, 32(%r1)
269 	ld	r31, 24(%r1)
270 	addi	%r1, %r1, 168
271 	blr
272