1 | /* SPDX-License-Identifier: GPL-2.0-or-later */ |
2 | /* |
3 | * Copyright 2008 Michael Ellerman, IBM Corporation. |
4 | */ |
5 | |
6 | #include <asm/feature-fixups.h> |
7 | #include <asm/ppc_asm.h> |
8 | #include <asm/synch.h> |
9 | #include <asm/asm-compat.h> |
10 | #include <asm/ppc-opcode.h> |
11 | |
12 | .text |
13 | |
14 | #define globl(x) \ |
15 | .globl x; \ |
16 | x: |
17 | |
18 | globl(ftr_fixup_test1) |
19 | or 1,1,1 |
20 | or 2,2,2 /* fixup will nop out this instruction */ |
21 | or 3,3,3 |
22 | |
23 | globl(end_ftr_fixup_test1) |
24 | |
25 | globl(ftr_fixup_test1_orig) |
26 | or 1,1,1 |
27 | or 2,2,2 |
28 | or 3,3,3 |
29 | |
30 | globl(ftr_fixup_test1_expected) |
31 | or 1,1,1 |
32 | nop |
33 | or 3,3,3 |
34 | |
35 | globl(ftr_fixup_test2) |
36 | or 1,1,1 |
37 | or 2,2,2 /* fixup will replace this with ftr_fixup_test2_alt */ |
38 | or 3,3,3 |
39 | |
40 | globl(end_ftr_fixup_test2) |
41 | |
42 | globl(ftr_fixup_test2_orig) |
43 | or 1,1,1 |
44 | or 2,2,2 |
45 | or 3,3,3 |
46 | |
47 | globl(ftr_fixup_test2_alt) |
48 | or 31,31,31 |
49 | |
50 | globl(ftr_fixup_test2_expected) |
51 | or 1,1,1 |
52 | or 31,31,31 |
53 | or 3,3,3 |
54 | |
55 | globl(ftr_fixup_test3) |
56 | or 1,1,1 |
57 | or 2,2,2 /* fixup will fail to replace this */ |
58 | or 3,3,3 |
59 | |
60 | globl(end_ftr_fixup_test3) |
61 | |
62 | globl(ftr_fixup_test3_orig) |
63 | or 1,1,1 |
64 | or 2,2,2 |
65 | or 3,3,3 |
66 | |
67 | globl(ftr_fixup_test3_alt) |
68 | or 31,31,31 |
69 | or 31,31,31 |
70 | |
71 | globl(ftr_fixup_test4) |
72 | or 1,1,1 |
73 | or 2,2,2 |
74 | or 2,2,2 |
75 | or 2,2,2 |
76 | or 2,2,2 |
77 | or 3,3,3 |
78 | |
79 | globl(end_ftr_fixup_test4) |
80 | |
81 | globl(ftr_fixup_test4_expected) |
82 | or 1,1,1 |
83 | or 31,31,31 |
84 | or 31,31,31 |
85 | nop |
86 | nop |
87 | or 3,3,3 |
88 | |
89 | globl(ftr_fixup_test4_orig) |
90 | or 1,1,1 |
91 | or 2,2,2 |
92 | or 2,2,2 |
93 | or 2,2,2 |
94 | or 2,2,2 |
95 | or 3,3,3 |
96 | |
97 | globl(ftr_fixup_test4_alt) |
98 | or 31,31,31 |
99 | or 31,31,31 |
100 | |
101 | |
102 | globl(ftr_fixup_test5) |
103 | or 1,1,1 |
104 | BEGIN_FTR_SECTION |
105 | or 2,2,2 |
106 | or 2,2,2 |
107 | or 2,2,2 |
108 | or 2,2,2 |
109 | or 2,2,2 |
110 | or 2,2,2 |
111 | or 2,2,2 |
112 | FTR_SECTION_ELSE |
113 | 2: b 3f |
114 | 3: or 5,5,5 |
115 | beq 3b |
116 | b 1f |
117 | or 6,6,6 |
118 | b 2b |
119 | 1: bdnz 3b |
120 | ALT_FTR_SECTION_END(0, 1) |
121 | or 1,1,1 |
122 | |
123 | globl(end_ftr_fixup_test5) |
124 | |
125 | globl(ftr_fixup_test5_expected) |
126 | or 1,1,1 |
127 | 2: b 3f |
128 | 3: or 5,5,5 |
129 | beq 3b |
130 | b 1f |
131 | or 6,6,6 |
132 | b 2b |
133 | 1: bdnz 3b |
134 | or 1,1,1 |
135 | |
136 | globl(ftr_fixup_test6) |
137 | 1: or 1,1,1 |
138 | BEGIN_FTR_SECTION |
139 | or 5,5,5 |
140 | 2: PPC_LCMPI r3,0 |
141 | beq 4f |
142 | blt 2b |
143 | b 1b |
144 | b 4f |
145 | FTR_SECTION_ELSE |
146 | 2: or 2,2,2 |
147 | PPC_LCMPI r3,1 |
148 | beq 3f |
149 | blt 2b |
150 | b 3f |
151 | b 1b |
152 | ALT_FTR_SECTION_END(0, 1) |
153 | 3: or 1,1,1 |
154 | or 2,2,2 |
155 | 4: or 3,3,3 |
156 | |
157 | globl(end_ftr_fixup_test6) |
158 | |
159 | globl(ftr_fixup_test6_expected) |
160 | 1: or 1,1,1 |
161 | 2: or 2,2,2 |
162 | PPC_LCMPI r3,1 |
163 | beq 3f |
164 | blt 2b |
165 | b 3f |
166 | b 1b |
167 | 3: or 1,1,1 |
168 | or 2,2,2 |
169 | or 3,3,3 |
170 | |
171 | globl(ftr_fixup_test7) |
172 | or 1,1,1 |
173 | BEGIN_FTR_SECTION |
174 | or 2,2,2 |
175 | or 2,2,2 |
176 | or 2,2,2 |
177 | or 2,2,2 |
178 | or 2,2,2 |
179 | or 2,2,2 |
180 | or 2,2,2 |
181 | FTR_SECTION_ELSE |
182 | 2: b 3f |
183 | 3: or 5,5,5 |
184 | beq 3b |
185 | b 1f |
186 | or 6,6,6 |
187 | b 2b |
188 | bdnz 3b |
189 | 1: |
190 | ALT_FTR_SECTION_END(0, 1) |
191 | or 1,1,1 |
192 | or 1,1,1 |
193 | |
194 | globl(end_ftr_fixup_test7) |
195 | nop |
196 | |
197 | globl(ftr_fixup_test7_expected) |
198 | or 1,1,1 |
199 | 2: b 3f |
200 | 3: or 5,5,5 |
201 | beq 3b |
202 | b 1f |
203 | or 6,6,6 |
204 | b 2b |
205 | bdnz 3b |
206 | 1: or 1,1,1 |
207 | |
208 | #if 0 |
209 | /* Test that if we have a larger else case the assembler spots it and |
210 | * reports an error. #if 0'ed so as not to break the build normally. |
211 | */ |
212 | ftr_fixup_test_too_big: |
213 | or 1,1,1 |
214 | BEGIN_FTR_SECTION |
215 | or 2,2,2 |
216 | or 2,2,2 |
217 | or 2,2,2 |
218 | FTR_SECTION_ELSE |
219 | or 3,3,3 |
220 | or 3,3,3 |
221 | or 3,3,3 |
222 | or 3,3,3 |
223 | ALT_FTR_SECTION_END(0, 1) |
224 | or 1,1,1 |
225 | #endif |
226 | |
227 | #define MAKE_MACRO_TEST(TYPE) \ |
228 | globl(ftr_fixup_test_ ##TYPE##_macros) \ |
229 | or 1,1,1; \ |
230 | /* Basic test, this section should all be nop'ed */ \ |
231 | BEGIN_##TYPE##_SECTION \ |
232 | or 2,2,2; \ |
233 | or 2,2,2; \ |
234 | or 2,2,2; \ |
235 | END_##TYPE##_SECTION(0, 1) \ |
236 | or 1,1,1; \ |
237 | or 1,1,1; \ |
238 | /* Basic test, this section should NOT be nop'ed */ \ |
239 | BEGIN_##TYPE##_SECTION \ |
240 | or 2,2,2; \ |
241 | or 2,2,2; \ |
242 | or 2,2,2; \ |
243 | END_##TYPE##_SECTION(0, 0) \ |
244 | or 1,1,1; \ |
245 | or 1,1,1; \ |
246 | /* Nesting test, inner section should be nop'ed */ \ |
247 | BEGIN_##TYPE##_SECTION \ |
248 | or 2,2,2; \ |
249 | or 2,2,2; \ |
250 | BEGIN_##TYPE##_SECTION_NESTED(80) \ |
251 | or 3,3,3; \ |
252 | or 3,3,3; \ |
253 | END_##TYPE##_SECTION_NESTED(0, 1, 80) \ |
254 | or 2,2,2; \ |
255 | or 2,2,2; \ |
256 | END_##TYPE##_SECTION(0, 0) \ |
257 | or 1,1,1; \ |
258 | or 1,1,1; \ |
259 | /* Nesting test, whole section should be nop'ed */ \ |
260 | BEGIN_##TYPE##_SECTION \ |
261 | or 2,2,2; \ |
262 | or 2,2,2; \ |
263 | BEGIN_##TYPE##_SECTION_NESTED(80) \ |
264 | or 3,3,3; \ |
265 | or 3,3,3; \ |
266 | END_##TYPE##_SECTION_NESTED(0, 0, 80) \ |
267 | or 2,2,2; \ |
268 | or 2,2,2; \ |
269 | END_##TYPE##_SECTION(0, 1) \ |
270 | or 1,1,1; \ |
271 | or 1,1,1; \ |
272 | /* Nesting test, none should be nop'ed */ \ |
273 | BEGIN_##TYPE##_SECTION \ |
274 | or 2,2,2; \ |
275 | or 2,2,2; \ |
276 | BEGIN_##TYPE##_SECTION_NESTED(80) \ |
277 | or 3,3,3; \ |
278 | or 3,3,3; \ |
279 | END_##TYPE##_SECTION_NESTED(0, 0, 80) \ |
280 | or 2,2,2; \ |
281 | or 2,2,2; \ |
282 | END_##TYPE##_SECTION(0, 0) \ |
283 | or 1,1,1; \ |
284 | or 1,1,1; \ |
285 | /* Basic alt section test, default case should be taken */ \ |
286 | BEGIN_##TYPE##_SECTION \ |
287 | or 3,3,3; \ |
288 | or 3,3,3; \ |
289 | or 3,3,3; \ |
290 | ##TYPE##_SECTION_ELSE \ |
291 | or 5,5,5; \ |
292 | or 5,5,5; \ |
293 | ALT_##TYPE##_SECTION_END(0, 0) \ |
294 | or 1,1,1; \ |
295 | or 1,1,1; \ |
296 | /* Basic alt section test, else case should be taken */ \ |
297 | BEGIN_##TYPE##_SECTION \ |
298 | or 3,3,3; \ |
299 | or 3,3,3; \ |
300 | or 3,3,3; \ |
301 | ##TYPE##_SECTION_ELSE \ |
302 | or 31,31,31; \ |
303 | or 31,31,31; \ |
304 | or 31,31,31; \ |
305 | ALT_##TYPE##_SECTION_END(0, 1) \ |
306 | or 1,1,1; \ |
307 | or 1,1,1; \ |
308 | /* Alt with smaller else case, should be padded with nops */ \ |
309 | BEGIN_##TYPE##_SECTION \ |
310 | or 3,3,3; \ |
311 | or 3,3,3; \ |
312 | or 3,3,3; \ |
313 | ##TYPE##_SECTION_ELSE \ |
314 | or 31,31,31; \ |
315 | ALT_##TYPE##_SECTION_END(0, 1) \ |
316 | or 1,1,1; \ |
317 | or 1,1,1; \ |
318 | /* Alt section with nested section in default case */ \ |
319 | /* Default case should be taken, with nop'ed inner section */ \ |
320 | BEGIN_##TYPE##_SECTION \ |
321 | or 3,3,3; \ |
322 | BEGIN_##TYPE##_SECTION_NESTED(95) \ |
323 | or 3,3,3; \ |
324 | or 3,3,3; \ |
325 | END_##TYPE##_SECTION_NESTED(0, 1, 95) \ |
326 | or 3,3,3; \ |
327 | ##TYPE##_SECTION_ELSE \ |
328 | or 2,2,2; \ |
329 | or 2,2,2; \ |
330 | ALT_##TYPE##_SECTION_END(0, 0) \ |
331 | or 1,1,1; \ |
332 | or 1,1,1; \ |
333 | /* Alt section with nested section in else, default taken */ \ |
334 | BEGIN_##TYPE##_SECTION \ |
335 | or 3,3,3; \ |
336 | or 3,3,3; \ |
337 | or 3,3,3; \ |
338 | ##TYPE##_SECTION_ELSE \ |
339 | or 5,5,5; \ |
340 | BEGIN_##TYPE##_SECTION_NESTED(95) \ |
341 | or 3,3,3; \ |
342 | END_##TYPE##_SECTION_NESTED(0, 1, 95) \ |
343 | or 5,5,5; \ |
344 | ALT_##TYPE##_SECTION_END(0, 0) \ |
345 | or 1,1,1; \ |
346 | or 1,1,1; \ |
347 | /* Alt section with nested section in else, else taken & nop */ \ |
348 | BEGIN_##TYPE##_SECTION \ |
349 | or 3,3,3; \ |
350 | or 3,3,3; \ |
351 | or 3,3,3; \ |
352 | ##TYPE##_SECTION_ELSE \ |
353 | or 5,5,5; \ |
354 | BEGIN_##TYPE##_SECTION_NESTED(95) \ |
355 | or 3,3,3; \ |
356 | END_##TYPE##_SECTION_NESTED(0, 1, 95) \ |
357 | or 5,5,5; \ |
358 | ALT_##TYPE##_SECTION_END(0, 1) \ |
359 | or 1,1,1; \ |
360 | or 1,1,1; \ |
361 | /* Feature section with nested alt section, default taken */ \ |
362 | BEGIN_##TYPE##_SECTION \ |
363 | or 2,2,2; \ |
364 | BEGIN_##TYPE##_SECTION_NESTED(95) \ |
365 | or 1,1,1; \ |
366 | ##TYPE##_SECTION_ELSE_NESTED(95) \ |
367 | or 5,5,5; \ |
368 | ALT_##TYPE##_SECTION_END_NESTED(0, 0, 95) \ |
369 | or 2,2,2; \ |
370 | END_##TYPE##_SECTION(0, 0) \ |
371 | or 1,1,1; \ |
372 | or 1,1,1; \ |
373 | /* Feature section with nested alt section, else taken */ \ |
374 | BEGIN_##TYPE##_SECTION \ |
375 | or 2,2,2; \ |
376 | BEGIN_##TYPE##_SECTION_NESTED(95) \ |
377 | or 1,1,1; \ |
378 | ##TYPE##_SECTION_ELSE_NESTED(95) \ |
379 | or 5,5,5; \ |
380 | ALT_##TYPE##_SECTION_END_NESTED(0, 1, 95) \ |
381 | or 2,2,2; \ |
382 | END_##TYPE##_SECTION(0, 0) \ |
383 | or 1,1,1; \ |
384 | or 1,1,1; \ |
385 | /* Feature section with nested alt section, all nop'ed */ \ |
386 | BEGIN_##TYPE##_SECTION \ |
387 | or 2,2,2; \ |
388 | BEGIN_##TYPE##_SECTION_NESTED(95) \ |
389 | or 1,1,1; \ |
390 | ##TYPE##_SECTION_ELSE_NESTED(95) \ |
391 | or 5,5,5; \ |
392 | ALT_##TYPE##_SECTION_END_NESTED(0, 0, 95) \ |
393 | or 2,2,2; \ |
394 | END_##TYPE##_SECTION(0, 1) \ |
395 | or 1,1,1; \ |
396 | or 1,1,1; \ |
397 | /* Nested alt sections, default with inner default taken */ \ |
398 | BEGIN_##TYPE##_SECTION \ |
399 | or 2,2,2; \ |
400 | BEGIN_##TYPE##_SECTION_NESTED(95) \ |
401 | or 1,1,1; \ |
402 | ##TYPE##_SECTION_ELSE_NESTED(95) \ |
403 | or 5,5,5; \ |
404 | ALT_##TYPE##_SECTION_END_NESTED(0, 0, 95) \ |
405 | or 2,2,2; \ |
406 | ##TYPE##_SECTION_ELSE \ |
407 | or 31,31,31; \ |
408 | BEGIN_##TYPE##_SECTION_NESTED(94) \ |
409 | or 5,5,5; \ |
410 | ##TYPE##_SECTION_ELSE_NESTED(94) \ |
411 | or 1,1,1; \ |
412 | ALT_##TYPE##_SECTION_END_NESTED(0, 0, 94) \ |
413 | or 31,31,31; \ |
414 | ALT_##TYPE##_SECTION_END(0, 0) \ |
415 | or 1,1,1; \ |
416 | or 1,1,1; \ |
417 | /* Nested alt sections, default with inner else taken */ \ |
418 | BEGIN_##TYPE##_SECTION \ |
419 | or 2,2,2; \ |
420 | BEGIN_##TYPE##_SECTION_NESTED(95) \ |
421 | or 1,1,1; \ |
422 | ##TYPE##_SECTION_ELSE_NESTED(95) \ |
423 | or 5,5,5; \ |
424 | ALT_##TYPE##_SECTION_END_NESTED(0, 1, 95) \ |
425 | or 2,2,2; \ |
426 | ##TYPE##_SECTION_ELSE \ |
427 | or 31,31,31; \ |
428 | BEGIN_##TYPE##_SECTION_NESTED(94) \ |
429 | or 5,5,5; \ |
430 | ##TYPE##_SECTION_ELSE_NESTED(94) \ |
431 | or 1,1,1; \ |
432 | ALT_##TYPE##_SECTION_END_NESTED(0, 0, 94) \ |
433 | or 31,31,31; \ |
434 | ALT_##TYPE##_SECTION_END(0, 0) \ |
435 | or 1,1,1; \ |
436 | or 1,1,1; \ |
437 | /* Nested alt sections, else with inner default taken */ \ |
438 | BEGIN_##TYPE##_SECTION \ |
439 | or 2,2,2; \ |
440 | BEGIN_##TYPE##_SECTION_NESTED(95) \ |
441 | or 1,1,1; \ |
442 | ##TYPE##_SECTION_ELSE_NESTED(95) \ |
443 | or 5,5,5; \ |
444 | ALT_##TYPE##_SECTION_END_NESTED(0, 1, 95) \ |
445 | or 2,2,2; \ |
446 | ##TYPE##_SECTION_ELSE \ |
447 | or 31,31,31; \ |
448 | BEGIN_##TYPE##_SECTION_NESTED(94) \ |
449 | or 5,5,5; \ |
450 | ##TYPE##_SECTION_ELSE_NESTED(94) \ |
451 | or 1,1,1; \ |
452 | ALT_##TYPE##_SECTION_END_NESTED(0, 0, 94) \ |
453 | or 31,31,31; \ |
454 | ALT_##TYPE##_SECTION_END(0, 1) \ |
455 | or 1,1,1; \ |
456 | or 1,1,1; \ |
457 | /* Nested alt sections, else with inner else taken */ \ |
458 | BEGIN_##TYPE##_SECTION \ |
459 | or 2,2,2; \ |
460 | BEGIN_##TYPE##_SECTION_NESTED(95) \ |
461 | or 1,1,1; \ |
462 | ##TYPE##_SECTION_ELSE_NESTED(95) \ |
463 | or 5,5,5; \ |
464 | ALT_##TYPE##_SECTION_END_NESTED(0, 1, 95) \ |
465 | or 2,2,2; \ |
466 | ##TYPE##_SECTION_ELSE \ |
467 | or 31,31,31; \ |
468 | BEGIN_##TYPE##_SECTION_NESTED(94) \ |
469 | or 5,5,5; \ |
470 | ##TYPE##_SECTION_ELSE_NESTED(94) \ |
471 | or 1,1,1; \ |
472 | ALT_##TYPE##_SECTION_END_NESTED(0, 1, 94) \ |
473 | or 31,31,31; \ |
474 | ALT_##TYPE##_SECTION_END(0, 1) \ |
475 | or 1,1,1; \ |
476 | or 1,1,1; \ |
477 | /* Nested alt sections, else can have large else case */ \ |
478 | BEGIN_##TYPE##_SECTION \ |
479 | or 2,2,2; \ |
480 | or 2,2,2; \ |
481 | or 2,2,2; \ |
482 | or 2,2,2; \ |
483 | ##TYPE##_SECTION_ELSE \ |
484 | BEGIN_##TYPE##_SECTION_NESTED(94) \ |
485 | or 5,5,5; \ |
486 | or 5,5,5; \ |
487 | or 5,5,5; \ |
488 | or 5,5,5; \ |
489 | ##TYPE##_SECTION_ELSE_NESTED(94) \ |
490 | or 1,1,1; \ |
491 | or 1,1,1; \ |
492 | or 1,1,1; \ |
493 | or 1,1,1; \ |
494 | ALT_##TYPE##_SECTION_END_NESTED(0, 1, 94) \ |
495 | ALT_##TYPE##_SECTION_END(0, 1) \ |
496 | or 1,1,1; \ |
497 | or 1,1,1; |
498 | |
499 | #define MAKE_MACRO_TEST_EXPECTED(TYPE) \ |
500 | globl(ftr_fixup_test_ ##TYPE##_macros_expected) \ |
501 | or 1,1,1; \ |
502 | /* Basic test, this section should all be nop'ed */ \ |
503 | /* BEGIN_##TYPE##_SECTION */ \ |
504 | nop; \ |
505 | nop; \ |
506 | nop; \ |
507 | /* END_##TYPE##_SECTION(0, 1) */ \ |
508 | or 1,1,1; \ |
509 | or 1,1,1; \ |
510 | /* Basic test, this section should NOT be nop'ed */ \ |
511 | /* BEGIN_##TYPE##_SECTION */ \ |
512 | or 2,2,2; \ |
513 | or 2,2,2; \ |
514 | or 2,2,2; \ |
515 | /* END_##TYPE##_SECTION(0, 0) */ \ |
516 | or 1,1,1; \ |
517 | or 1,1,1; \ |
518 | /* Nesting test, inner section should be nop'ed */ \ |
519 | /* BEGIN_##TYPE##_SECTION */ \ |
520 | or 2,2,2; \ |
521 | or 2,2,2; \ |
522 | /* BEGIN_##TYPE##_SECTION_NESTED(80) */ \ |
523 | nop; \ |
524 | nop; \ |
525 | /* END_##TYPE##_SECTION_NESTED(0, 1, 80) */ \ |
526 | or 2,2,2; \ |
527 | or 2,2,2; \ |
528 | /* END_##TYPE##_SECTION(0, 0) */ \ |
529 | or 1,1,1; \ |
530 | or 1,1,1; \ |
531 | /* Nesting test, whole section should be nop'ed */ \ |
532 | /* NB. inner section is not nop'ed, but then entire outer is */ \ |
533 | /* BEGIN_##TYPE##_SECTION */ \ |
534 | nop; \ |
535 | nop; \ |
536 | /* BEGIN_##TYPE##_SECTION_NESTED(80) */ \ |
537 | nop; \ |
538 | nop; \ |
539 | /* END_##TYPE##_SECTION_NESTED(0, 0, 80) */ \ |
540 | nop; \ |
541 | nop; \ |
542 | /* END_##TYPE##_SECTION(0, 1) */ \ |
543 | or 1,1,1; \ |
544 | or 1,1,1; \ |
545 | /* Nesting test, none should be nop'ed */ \ |
546 | /* BEGIN_##TYPE##_SECTION */ \ |
547 | or 2,2,2; \ |
548 | or 2,2,2; \ |
549 | /* BEGIN_##TYPE##_SECTION_NESTED(80) */ \ |
550 | or 3,3,3; \ |
551 | or 3,3,3; \ |
552 | /* END_##TYPE##_SECTION_NESTED(0, 0, 80) */ \ |
553 | or 2,2,2; \ |
554 | or 2,2,2; \ |
555 | /* END_##TYPE##_SECTION(0, 0) */ \ |
556 | or 1,1,1; \ |
557 | or 1,1,1; \ |
558 | /* Basic alt section test, default case should be taken */ \ |
559 | /* BEGIN_##TYPE##_SECTION */ \ |
560 | or 3,3,3; \ |
561 | or 3,3,3; \ |
562 | or 3,3,3; \ |
563 | /* ##TYPE##_SECTION_ELSE */ \ |
564 | /* or 5,5,5; */ \ |
565 | /* or 5,5,5; */ \ |
566 | /* ALT_##TYPE##_SECTION_END(0, 0) */ \ |
567 | or 1,1,1; \ |
568 | or 1,1,1; \ |
569 | /* Basic alt section test, else case should be taken */ \ |
570 | /* BEGIN_##TYPE##_SECTION */ \ |
571 | /* or 3,3,3; */ \ |
572 | /* or 3,3,3; */ \ |
573 | /* or 3,3,3; */ \ |
574 | /* ##TYPE##_SECTION_ELSE */ \ |
575 | or 31,31,31; \ |
576 | or 31,31,31; \ |
577 | or 31,31,31; \ |
578 | /* ALT_##TYPE##_SECTION_END(0, 1) */ \ |
579 | or 1,1,1; \ |
580 | or 1,1,1; \ |
581 | /* Alt with smaller else case, should be padded with nops */ \ |
582 | /* BEGIN_##TYPE##_SECTION */ \ |
583 | /* or 3,3,3; */ \ |
584 | /* or 3,3,3; */ \ |
585 | /* or 3,3,3; */ \ |
586 | /* ##TYPE##_SECTION_ELSE */ \ |
587 | or 31,31,31; \ |
588 | nop; \ |
589 | nop; \ |
590 | /* ALT_##TYPE##_SECTION_END(0, 1) */ \ |
591 | or 1,1,1; \ |
592 | or 1,1,1; \ |
593 | /* Alt section with nested section in default case */ \ |
594 | /* Default case should be taken, with nop'ed inner section */ \ |
595 | /* BEGIN_##TYPE##_SECTION */ \ |
596 | or 3,3,3; \ |
597 | /* BEGIN_##TYPE##_SECTION_NESTED(95) */ \ |
598 | nop; \ |
599 | nop; \ |
600 | /* END_##TYPE##_SECTION_NESTED(0, 1, 95) */ \ |
601 | or 3,3,3; \ |
602 | /* ##TYPE##_SECTION_ELSE */ \ |
603 | /* or 2,2,2; */ \ |
604 | /* or 2,2,2; */ \ |
605 | /* ALT_##TYPE##_SECTION_END(0, 0) */ \ |
606 | or 1,1,1; \ |
607 | or 1,1,1; \ |
608 | /* Alt section with nested section in else, default taken */ \ |
609 | /* BEGIN_##TYPE##_SECTION */ \ |
610 | or 3,3,3; \ |
611 | or 3,3,3; \ |
612 | or 3,3,3; \ |
613 | /* ##TYPE##_SECTION_ELSE */ \ |
614 | /* or 5,5,5; */ \ |
615 | /* BEGIN_##TYPE##_SECTION_NESTED(95) */ \ |
616 | /* or 3,3,3; */ \ |
617 | /* END_##TYPE##_SECTION_NESTED(0, 1, 95) */ \ |
618 | /* or 5,5,5; */ \ |
619 | /* ALT_##TYPE##_SECTION_END(0, 0) */ \ |
620 | or 1,1,1; \ |
621 | or 1,1,1; \ |
622 | /* Alt section with nested section in else, else taken & nop */ \ |
623 | /* BEGIN_##TYPE##_SECTION */ \ |
624 | /* or 3,3,3; */ \ |
625 | /* or 3,3,3; */ \ |
626 | /* or 3,3,3; */ \ |
627 | /* ##TYPE##_SECTION_ELSE */ \ |
628 | or 5,5,5; \ |
629 | /* BEGIN_##TYPE##_SECTION_NESTED(95) */ \ |
630 | nop; \ |
631 | /* END_##TYPE##_SECTION_NESTED(0, 1, 95) */ \ |
632 | or 5,5,5; \ |
633 | /* ALT_##TYPE##_SECTION_END(0, 1) */ \ |
634 | or 1,1,1; \ |
635 | or 1,1,1; \ |
636 | /* Feature section with nested alt section, default taken */ \ |
637 | /* BEGIN_##TYPE##_SECTION */ \ |
638 | or 2,2,2; \ |
639 | /* BEGIN_##TYPE##_SECTION_NESTED(95) */ \ |
640 | or 1,1,1; \ |
641 | /* ##TYPE##_SECTION_ELSE_NESTED(95) */ \ |
642 | /* or 5,5,5; */ \ |
643 | /* ALT_##TYPE##_SECTION_END_NESTED(0, 0, 95) */ \ |
644 | or 2,2,2; \ |
645 | /* END_##TYPE##_SECTION(0, 0) */ \ |
646 | or 1,1,1; \ |
647 | or 1,1,1; \ |
648 | /* Feature section with nested alt section, else taken */ \ |
649 | /* BEGIN_##TYPE##_SECTION */ \ |
650 | or 2,2,2; \ |
651 | /* BEGIN_##TYPE##_SECTION_NESTED(95) */ \ |
652 | /* or 1,1,1; */ \ |
653 | /* ##TYPE##_SECTION_ELSE_NESTED(95) */ \ |
654 | or 5,5,5; \ |
655 | /* ALT_##TYPE##_SECTION_END_NESTED(0, 1, 95) */ \ |
656 | or 2,2,2; \ |
657 | /* END_##TYPE##_SECTION(0, 0) */ \ |
658 | or 1,1,1; \ |
659 | or 1,1,1; \ |
660 | /* Feature section with nested alt section, all nop'ed */ \ |
661 | /* BEGIN_##TYPE##_SECTION */ \ |
662 | nop; \ |
663 | /* BEGIN_##TYPE##_SECTION_NESTED(95) */ \ |
664 | nop; \ |
665 | /* ##TYPE##_SECTION_ELSE_NESTED(95) */ \ |
666 | /* or 5,5,5; */ \ |
667 | /* ALT_##TYPE##_SECTION_END_NESTED(0, 0, 95) */ \ |
668 | nop; \ |
669 | /* END_##TYPE##_SECTION(0, 1) */ \ |
670 | or 1,1,1; \ |
671 | or 1,1,1; \ |
672 | /* Nested alt sections, default with inner default taken */ \ |
673 | /* BEGIN_##TYPE##_SECTION */ \ |
674 | or 2,2,2; \ |
675 | /* BEGIN_##TYPE##_SECTION_NESTED(95) */ \ |
676 | or 1,1,1; \ |
677 | /* ##TYPE##_SECTION_ELSE_NESTED(95) */ \ |
678 | /* or 5,5,5; */ \ |
679 | /* ALT_##TYPE##_SECTION_END_NESTED(0, 0, 95) */ \ |
680 | or 2,2,2; \ |
681 | /* ##TYPE##_SECTION_ELSE */ \ |
682 | /* or 31,31,31; */ \ |
683 | /* BEGIN_##TYPE##_SECTION_NESTED(94) */ \ |
684 | /* or 5,5,5; */ \ |
685 | /* ##TYPE##_SECTION_ELSE_NESTED(94) */ \ |
686 | /* or 1,1,1; */ \ |
687 | /* ALT_##TYPE##_SECTION_END_NESTED(0, 0, 94) */ \ |
688 | /* or 31,31,31; */ \ |
689 | /* ALT_##TYPE##_SECTION_END(0, 0) */ \ |
690 | or 1,1,1; \ |
691 | or 1,1,1; \ |
692 | /* Nested alt sections, default with inner else taken */ \ |
693 | /* BEGIN_##TYPE##_SECTION */ \ |
694 | or 2,2,2; \ |
695 | /* BEGIN_##TYPE##_SECTION_NESTED(95) */ \ |
696 | /* or 1,1,1; */ \ |
697 | /* ##TYPE##_SECTION_ELSE_NESTED(95) */ \ |
698 | or 5,5,5; \ |
699 | /* ALT_##TYPE##_SECTION_END_NESTED(0, 1, 95) */ \ |
700 | or 2,2,2; \ |
701 | /* ##TYPE##_SECTION_ELSE */ \ |
702 | /* or 31,31,31; */ \ |
703 | /* BEGIN_##TYPE##_SECTION_NESTED(94) */ \ |
704 | /* or 5,5,5; */ \ |
705 | /* ##TYPE##_SECTION_ELSE_NESTED(94) */ \ |
706 | /* or 1,1,1; */ \ |
707 | /* ALT_##TYPE##_SECTION_END_NESTED(0, 0, 94) */ \ |
708 | /* or 31,31,31; */ \ |
709 | /* ALT_##TYPE##_SECTION_END(0, 0) */ \ |
710 | or 1,1,1; \ |
711 | or 1,1,1; \ |
712 | /* Nested alt sections, else with inner default taken */ \ |
713 | /* BEGIN_##TYPE##_SECTION */ \ |
714 | /* or 2,2,2; */ \ |
715 | /* BEGIN_##TYPE##_SECTION_NESTED(95) */ \ |
716 | /* or 1,1,1; */ \ |
717 | /* ##TYPE##_SECTION_ELSE_NESTED(95) */ \ |
718 | /* or 5,5,5; */ \ |
719 | /* ALT_##TYPE##_SECTION_END_NESTED(0, 1, 95) */ \ |
720 | /* or 2,2,2; */ \ |
721 | /* ##TYPE##_SECTION_ELSE */ \ |
722 | or 31,31,31; \ |
723 | /* BEGIN_##TYPE##_SECTION_NESTED(94) */ \ |
724 | or 5,5,5; \ |
725 | /* ##TYPE##_SECTION_ELSE_NESTED(94) */ \ |
726 | /* or 1,1,1; */ \ |
727 | /* ALT_##TYPE##_SECTION_END_NESTED(0, 0, 94) */ \ |
728 | or 31,31,31; \ |
729 | /* ALT_##TYPE##_SECTION_END(0, 1) */ \ |
730 | or 1,1,1; \ |
731 | or 1,1,1; \ |
732 | /* Nested alt sections, else with inner else taken */ \ |
733 | /* BEGIN_##TYPE##_SECTION */ \ |
734 | /* or 2,2,2; */ \ |
735 | /* BEGIN_##TYPE##_SECTION_NESTED(95) */ \ |
736 | /* or 1,1,1; */ \ |
737 | /* ##TYPE##_SECTION_ELSE_NESTED(95) */ \ |
738 | /* or 5,5,5; */ \ |
739 | /* ALT_##TYPE##_SECTION_END_NESTED(0, 1, 95) */ \ |
740 | /* or 2,2,2; */ \ |
741 | /* ##TYPE##_SECTION_ELSE */ \ |
742 | or 31,31,31; \ |
743 | /* BEGIN_##TYPE##_SECTION_NESTED(94) */ \ |
744 | /* or 5,5,5; */ \ |
745 | /* ##TYPE##_SECTION_ELSE_NESTED(94) */ \ |
746 | or 1,1,1; \ |
747 | /* ALT_##TYPE##_SECTION_END_NESTED(0, 1, 94) */ \ |
748 | or 31,31,31; \ |
749 | /* ALT_##TYPE##_SECTION_END(0, 1) */ \ |
750 | or 1,1,1; \ |
751 | or 1,1,1; \ |
752 | /* Nested alt sections, else can have large else case */ \ |
753 | /* BEGIN_##TYPE##_SECTION */ \ |
754 | /* or 2,2,2; */ \ |
755 | /* or 2,2,2; */ \ |
756 | /* or 2,2,2; */ \ |
757 | /* or 2,2,2; */ \ |
758 | /* ##TYPE##_SECTION_ELSE */ \ |
759 | /* BEGIN_##TYPE##_SECTION_NESTED(94) */ \ |
760 | /* or 5,5,5; */ \ |
761 | /* or 5,5,5; */ \ |
762 | /* or 5,5,5; */ \ |
763 | /* or 5,5,5; */ \ |
764 | /* ##TYPE##_SECTION_ELSE_NESTED(94) */ \ |
765 | or 1,1,1; \ |
766 | or 1,1,1; \ |
767 | or 1,1,1; \ |
768 | or 1,1,1; \ |
769 | /* ALT_##TYPE##_SECTION_END_NESTED(0, 1, 94) */ \ |
770 | /* ALT_##TYPE##_SECTION_END(0, 1) */ \ |
771 | or 1,1,1; \ |
772 | or 1,1,1; |
773 | |
774 | MAKE_MACRO_TEST(FTR); |
775 | MAKE_MACRO_TEST_EXPECTED(FTR); |
776 | |
777 | #ifdef CONFIG_PPC64 |
778 | MAKE_MACRO_TEST(FW_FTR); |
779 | MAKE_MACRO_TEST_EXPECTED(FW_FTR); |
780 | #endif |
781 | |
782 | globl(lwsync_fixup_test) |
783 | 1: or 1,1,1 |
784 | LWSYNC |
785 | globl(end_lwsync_fixup_test) |
786 | |
787 | globl(lwsync_fixup_test_expected_LWSYNC) |
788 | 1: or 1,1,1 |
789 | lwsync |
790 | |
791 | globl(lwsync_fixup_test_expected_SYNC) |
792 | 1: or 1,1,1 |
793 | sync |
794 | |
795 | globl(ftr_fixup_prefix1) |
796 | or 1,1,1 |
797 | .long OP_PREFIX << 26 |
798 | .long 0x0000000 |
799 | or 2,2,2 |
800 | globl(end_ftr_fixup_prefix1) |
801 | |
802 | globl(ftr_fixup_prefix1_orig) |
803 | or 1,1,1 |
804 | .long OP_PREFIX << 26 |
805 | .long 0x0000000 |
806 | or 2,2,2 |
807 | |
808 | globl(ftr_fixup_prefix1_expected) |
809 | or 1,1,1 |
810 | nop |
811 | nop |
812 | or 2,2,2 |
813 | |
814 | globl(ftr_fixup_prefix2) |
815 | or 1,1,1 |
816 | .long OP_PREFIX << 26 |
817 | .long 0x0000000 |
818 | or 2,2,2 |
819 | globl(end_ftr_fixup_prefix2) |
820 | |
821 | globl(ftr_fixup_prefix2_orig) |
822 | or 1,1,1 |
823 | .long OP_PREFIX << 26 |
824 | .long 0x0000000 |
825 | or 2,2,2 |
826 | |
827 | globl(ftr_fixup_prefix2_alt) |
828 | .long OP_PREFIX << 26 |
829 | .long 0x0000001 |
830 | |
831 | globl(ftr_fixup_prefix2_expected) |
832 | or 1,1,1 |
833 | .long OP_PREFIX << 26 |
834 | .long 0x0000001 |
835 | or 2,2,2 |
836 | |
837 | globl(ftr_fixup_prefix3) |
838 | or 1,1,1 |
839 | .long OP_PREFIX << 26 |
840 | .long 0x0000000 |
841 | or 2,2,2 |
842 | or 3,3,3 |
843 | globl(end_ftr_fixup_prefix3) |
844 | |
845 | globl(ftr_fixup_prefix3_orig) |
846 | or 1,1,1 |
847 | .long OP_PREFIX << 26 |
848 | .long 0x0000000 |
849 | or 2,2,2 |
850 | or 3,3,3 |
851 | |
852 | globl(ftr_fixup_prefix3_alt) |
853 | .long OP_PREFIX << 26 |
854 | .long 0x0000001 |
855 | nop |
856 | |
857 | globl(ftr_fixup_prefix3_expected) |
858 | or 1,1,1 |
859 | .long OP_PREFIX << 26 |
860 | .long 0x0000001 |
861 | nop |
862 | or 3,3,3 |
863 | |