2 * Copyright 2008 Michael Ellerman, IBM Corporation.
5 * This program is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU General Public License
7 * as published by the Free Software Foundation; either version
8 * 2 of the License, or (at your option) any later version.
11 #include <asm/feature-fixups.h>
12 #include <asm/ppc_asm.h>
13 #include <asm/synch.h>
21 globl(ftr_fixup_test1)
23 or 2,2,2 /* fixup will nop out this instruction */
26 globl(end_ftr_fixup_test1)
28 globl(ftr_fixup_test1_orig)
33 globl(ftr_fixup_test1_expected)
38 globl(ftr_fixup_test2)
40 or 2,2,2 /* fixup will replace this with ftr_fixup_test2_alt */
43 globl(end_ftr_fixup_test2)
45 globl(ftr_fixup_test2_orig)
50 globl(ftr_fixup_test2_alt)
53 globl(ftr_fixup_test2_expected)
58 globl(ftr_fixup_test3)
60 or 2,2,2 /* fixup will fail to replace this */
63 globl(end_ftr_fixup_test3)
65 globl(ftr_fixup_test3_orig)
70 globl(ftr_fixup_test3_alt)
74 globl(ftr_fixup_test4)
82 globl(end_ftr_fixup_test4)
84 globl(ftr_fixup_test4_expected)
92 globl(ftr_fixup_test4_orig)
100 globl(ftr_fixup_test4_alt)
105 globl(ftr_fixup_test5)
123 ALT_FTR_SECTION_END(0, 1)
126 globl(end_ftr_fixup_test5)
128 globl(ftr_fixup_test5_expected)
139 globl(ftr_fixup_test6)
155 ALT_FTR_SECTION_END(0, 1)
160 globl(end_ftr_fixup_test6)
162 globl(ftr_fixup_test6_expected)
174 globl(ftr_fixup_test7)
193 ALT_FTR_SECTION_END(0, 1)
197 globl(end_ftr_fixup_test7)
200 globl(ftr_fixup_test7_expected)
212 /* Test that if we have a larger else case the assembler spots it and
213 * reports an error. #if 0'ed so as not to break the build normally.
215 ftr_fixup_test_too_big:
226 ALT_FTR_SECTION_END(0, 1)
230 #define MAKE_MACRO_TEST(TYPE) \
231 globl(ftr_fixup_test_ ##TYPE##_macros) \
233 /* Basic test, this section should all be nop'ed */ \
234 BEGIN_##TYPE##_SECTION \
238 END_##TYPE##_SECTION(0, 1) \
241 /* Basic test, this section should NOT be nop'ed */ \
242 BEGIN_##TYPE##_SECTION \
246 END_##TYPE##_SECTION(0, 0) \
249 /* Nesting test, inner section should be nop'ed */ \
250 BEGIN_##TYPE##_SECTION \
253 BEGIN_##TYPE##_SECTION_NESTED(80) \
256 END_##TYPE##_SECTION_NESTED(0, 1, 80) \
259 END_##TYPE##_SECTION(0, 0) \
262 /* Nesting test, whole section should be nop'ed */ \
263 BEGIN_##TYPE##_SECTION \
266 BEGIN_##TYPE##_SECTION_NESTED(80) \
269 END_##TYPE##_SECTION_NESTED(0, 0, 80) \
272 END_##TYPE##_SECTION(0, 1) \
275 /* Nesting test, none should be nop'ed */ \
276 BEGIN_##TYPE##_SECTION \
279 BEGIN_##TYPE##_SECTION_NESTED(80) \
282 END_##TYPE##_SECTION_NESTED(0, 0, 80) \
285 END_##TYPE##_SECTION(0, 0) \
288 /* Basic alt section test, default case should be taken */ \
289 BEGIN_##TYPE##_SECTION \
293 ##TYPE##_SECTION_ELSE \
296 ALT_##TYPE##_SECTION_END(0, 0) \
299 /* Basic alt section test, else case should be taken */ \
300 BEGIN_##TYPE##_SECTION \
304 ##TYPE##_SECTION_ELSE \
308 ALT_##TYPE##_SECTION_END(0, 1) \
311 /* Alt with smaller else case, should be padded with nops */ \
312 BEGIN_##TYPE##_SECTION \
316 ##TYPE##_SECTION_ELSE \
318 ALT_##TYPE##_SECTION_END(0, 1) \
321 /* Alt section with nested section in default case */ \
322 /* Default case should be taken, with nop'ed inner section */ \
323 BEGIN_##TYPE##_SECTION \
325 BEGIN_##TYPE##_SECTION_NESTED(95) \
328 END_##TYPE##_SECTION_NESTED(0, 1, 95) \
330 ##TYPE##_SECTION_ELSE \
333 ALT_##TYPE##_SECTION_END(0, 0) \
336 /* Alt section with nested section in else, default taken */ \
337 BEGIN_##TYPE##_SECTION \
341 ##TYPE##_SECTION_ELSE \
343 BEGIN_##TYPE##_SECTION_NESTED(95) \
345 END_##TYPE##_SECTION_NESTED(0, 1, 95) \
347 ALT_##TYPE##_SECTION_END(0, 0) \
350 /* Alt section with nested section in else, else taken & nop */ \
351 BEGIN_##TYPE##_SECTION \
355 ##TYPE##_SECTION_ELSE \
357 BEGIN_##TYPE##_SECTION_NESTED(95) \
359 END_##TYPE##_SECTION_NESTED(0, 1, 95) \
361 ALT_##TYPE##_SECTION_END(0, 1) \
364 /* Feature section with nested alt section, default taken */ \
365 BEGIN_##TYPE##_SECTION \
367 BEGIN_##TYPE##_SECTION_NESTED(95) \
369 ##TYPE##_SECTION_ELSE_NESTED(95) \
371 ALT_##TYPE##_SECTION_END_NESTED(0, 0, 95) \
373 END_##TYPE##_SECTION(0, 0) \
376 /* Feature section with nested alt section, else taken */ \
377 BEGIN_##TYPE##_SECTION \
379 BEGIN_##TYPE##_SECTION_NESTED(95) \
381 ##TYPE##_SECTION_ELSE_NESTED(95) \
383 ALT_##TYPE##_SECTION_END_NESTED(0, 1, 95) \
385 END_##TYPE##_SECTION(0, 0) \
388 /* Feature section with nested alt section, all nop'ed */ \
389 BEGIN_##TYPE##_SECTION \
391 BEGIN_##TYPE##_SECTION_NESTED(95) \
393 ##TYPE##_SECTION_ELSE_NESTED(95) \
395 ALT_##TYPE##_SECTION_END_NESTED(0, 0, 95) \
397 END_##TYPE##_SECTION(0, 1) \
400 /* Nested alt sections, default with inner default taken */ \
401 BEGIN_##TYPE##_SECTION \
403 BEGIN_##TYPE##_SECTION_NESTED(95) \
405 ##TYPE##_SECTION_ELSE_NESTED(95) \
407 ALT_##TYPE##_SECTION_END_NESTED(0, 0, 95) \
409 ##TYPE##_SECTION_ELSE \
411 BEGIN_##TYPE##_SECTION_NESTED(94) \
413 ##TYPE##_SECTION_ELSE_NESTED(94) \
415 ALT_##TYPE##_SECTION_END_NESTED(0, 0, 94) \
417 ALT_##TYPE##_SECTION_END(0, 0) \
420 /* Nested alt sections, default with inner else taken */ \
421 BEGIN_##TYPE##_SECTION \
423 BEGIN_##TYPE##_SECTION_NESTED(95) \
425 ##TYPE##_SECTION_ELSE_NESTED(95) \
427 ALT_##TYPE##_SECTION_END_NESTED(0, 1, 95) \
429 ##TYPE##_SECTION_ELSE \
431 BEGIN_##TYPE##_SECTION_NESTED(94) \
433 ##TYPE##_SECTION_ELSE_NESTED(94) \
435 ALT_##TYPE##_SECTION_END_NESTED(0, 0, 94) \
437 ALT_##TYPE##_SECTION_END(0, 0) \
440 /* Nested alt sections, else with inner default taken */ \
441 BEGIN_##TYPE##_SECTION \
443 BEGIN_##TYPE##_SECTION_NESTED(95) \
445 ##TYPE##_SECTION_ELSE_NESTED(95) \
447 ALT_##TYPE##_SECTION_END_NESTED(0, 1, 95) \
449 ##TYPE##_SECTION_ELSE \
451 BEGIN_##TYPE##_SECTION_NESTED(94) \
453 ##TYPE##_SECTION_ELSE_NESTED(94) \
455 ALT_##TYPE##_SECTION_END_NESTED(0, 0, 94) \
457 ALT_##TYPE##_SECTION_END(0, 1) \
460 /* Nested alt sections, else with inner else taken */ \
461 BEGIN_##TYPE##_SECTION \
463 BEGIN_##TYPE##_SECTION_NESTED(95) \
465 ##TYPE##_SECTION_ELSE_NESTED(95) \
467 ALT_##TYPE##_SECTION_END_NESTED(0, 1, 95) \
469 ##TYPE##_SECTION_ELSE \
471 BEGIN_##TYPE##_SECTION_NESTED(94) \
473 ##TYPE##_SECTION_ELSE_NESTED(94) \
475 ALT_##TYPE##_SECTION_END_NESTED(0, 1, 94) \
477 ALT_##TYPE##_SECTION_END(0, 1) \
480 /* Nested alt sections, else can have large else case */ \
481 BEGIN_##TYPE##_SECTION \
486 ##TYPE##_SECTION_ELSE \
487 BEGIN_##TYPE##_SECTION_NESTED(94) \
492 ##TYPE##_SECTION_ELSE_NESTED(94) \
497 ALT_##TYPE##_SECTION_END_NESTED(0, 1, 94) \
498 ALT_##TYPE##_SECTION_END(0, 1) \
502 #define MAKE_MACRO_TEST_EXPECTED(TYPE) \
503 globl(ftr_fixup_test_ ##TYPE##_macros_expected) \
505 /* Basic test, this section should all be nop'ed */ \
506 /* BEGIN_##TYPE##_SECTION */ \
510 /* END_##TYPE##_SECTION(0, 1) */ \
513 /* Basic test, this section should NOT be nop'ed */ \
514 /* BEGIN_##TYPE##_SECTION */ \
518 /* END_##TYPE##_SECTION(0, 0) */ \
521 /* Nesting test, inner section should be nop'ed */ \
522 /* BEGIN_##TYPE##_SECTION */ \
525 /* BEGIN_##TYPE##_SECTION_NESTED(80) */ \
528 /* END_##TYPE##_SECTION_NESTED(0, 1, 80) */ \
531 /* END_##TYPE##_SECTION(0, 0) */ \
534 /* Nesting test, whole section should be nop'ed */ \
535 /* NB. inner section is not nop'ed, but then entire outer is */ \
536 /* BEGIN_##TYPE##_SECTION */ \
539 /* BEGIN_##TYPE##_SECTION_NESTED(80) */ \
542 /* END_##TYPE##_SECTION_NESTED(0, 0, 80) */ \
545 /* END_##TYPE##_SECTION(0, 1) */ \
548 /* Nesting test, none should be nop'ed */ \
549 /* BEGIN_##TYPE##_SECTION */ \
552 /* BEGIN_##TYPE##_SECTION_NESTED(80) */ \
555 /* END_##TYPE##_SECTION_NESTED(0, 0, 80) */ \
558 /* END_##TYPE##_SECTION(0, 0) */ \
561 /* Basic alt section test, default case should be taken */ \
562 /* BEGIN_##TYPE##_SECTION */ \
566 /* ##TYPE##_SECTION_ELSE */ \
569 /* ALT_##TYPE##_SECTION_END(0, 0) */ \
572 /* Basic alt section test, else case should be taken */ \
573 /* BEGIN_##TYPE##_SECTION */ \
577 /* ##TYPE##_SECTION_ELSE */ \
581 /* ALT_##TYPE##_SECTION_END(0, 1) */ \
584 /* Alt with smaller else case, should be padded with nops */ \
585 /* BEGIN_##TYPE##_SECTION */ \
589 /* ##TYPE##_SECTION_ELSE */ \
593 /* ALT_##TYPE##_SECTION_END(0, 1) */ \
596 /* Alt section with nested section in default case */ \
597 /* Default case should be taken, with nop'ed inner section */ \
598 /* BEGIN_##TYPE##_SECTION */ \
600 /* BEGIN_##TYPE##_SECTION_NESTED(95) */ \
603 /* END_##TYPE##_SECTION_NESTED(0, 1, 95) */ \
605 /* ##TYPE##_SECTION_ELSE */ \
608 /* ALT_##TYPE##_SECTION_END(0, 0) */ \
611 /* Alt section with nested section in else, default taken */ \
612 /* BEGIN_##TYPE##_SECTION */ \
616 /* ##TYPE##_SECTION_ELSE */ \
618 /* BEGIN_##TYPE##_SECTION_NESTED(95) */ \
620 /* END_##TYPE##_SECTION_NESTED(0, 1, 95) */ \
622 /* ALT_##TYPE##_SECTION_END(0, 0) */ \
625 /* Alt section with nested section in else, else taken & nop */ \
626 /* BEGIN_##TYPE##_SECTION */ \
630 /* ##TYPE##_SECTION_ELSE */ \
632 /* BEGIN_##TYPE##_SECTION_NESTED(95) */ \
634 /* END_##TYPE##_SECTION_NESTED(0, 1, 95) */ \
636 /* ALT_##TYPE##_SECTION_END(0, 1) */ \
639 /* Feature section with nested alt section, default taken */ \
640 /* BEGIN_##TYPE##_SECTION */ \
642 /* BEGIN_##TYPE##_SECTION_NESTED(95) */ \
644 /* ##TYPE##_SECTION_ELSE_NESTED(95) */ \
646 /* ALT_##TYPE##_SECTION_END_NESTED(0, 0, 95) */ \
648 /* END_##TYPE##_SECTION(0, 0) */ \
651 /* Feature section with nested alt section, else taken */ \
652 /* BEGIN_##TYPE##_SECTION */ \
654 /* BEGIN_##TYPE##_SECTION_NESTED(95) */ \
656 /* ##TYPE##_SECTION_ELSE_NESTED(95) */ \
658 /* ALT_##TYPE##_SECTION_END_NESTED(0, 1, 95) */ \
660 /* END_##TYPE##_SECTION(0, 0) */ \
663 /* Feature section with nested alt section, all nop'ed */ \
664 /* BEGIN_##TYPE##_SECTION */ \
666 /* BEGIN_##TYPE##_SECTION_NESTED(95) */ \
668 /* ##TYPE##_SECTION_ELSE_NESTED(95) */ \
670 /* ALT_##TYPE##_SECTION_END_NESTED(0, 0, 95) */ \
672 /* END_##TYPE##_SECTION(0, 1) */ \
675 /* Nested alt sections, default with inner default taken */ \
676 /* BEGIN_##TYPE##_SECTION */ \
678 /* BEGIN_##TYPE##_SECTION_NESTED(95) */ \
680 /* ##TYPE##_SECTION_ELSE_NESTED(95) */ \
682 /* ALT_##TYPE##_SECTION_END_NESTED(0, 0, 95) */ \
684 /* ##TYPE##_SECTION_ELSE */ \
686 /* BEGIN_##TYPE##_SECTION_NESTED(94) */ \
688 /* ##TYPE##_SECTION_ELSE_NESTED(94) */ \
690 /* ALT_##TYPE##_SECTION_END_NESTED(0, 0, 94) */ \
692 /* ALT_##TYPE##_SECTION_END(0, 0) */ \
695 /* Nested alt sections, default with inner else taken */ \
696 /* BEGIN_##TYPE##_SECTION */ \
698 /* BEGIN_##TYPE##_SECTION_NESTED(95) */ \
700 /* ##TYPE##_SECTION_ELSE_NESTED(95) */ \
702 /* ALT_##TYPE##_SECTION_END_NESTED(0, 1, 95) */ \
704 /* ##TYPE##_SECTION_ELSE */ \
706 /* BEGIN_##TYPE##_SECTION_NESTED(94) */ \
708 /* ##TYPE##_SECTION_ELSE_NESTED(94) */ \
710 /* ALT_##TYPE##_SECTION_END_NESTED(0, 0, 94) */ \
712 /* ALT_##TYPE##_SECTION_END(0, 0) */ \
715 /* Nested alt sections, else with inner default taken */ \
716 /* BEGIN_##TYPE##_SECTION */ \
718 /* BEGIN_##TYPE##_SECTION_NESTED(95) */ \
720 /* ##TYPE##_SECTION_ELSE_NESTED(95) */ \
722 /* ALT_##TYPE##_SECTION_END_NESTED(0, 1, 95) */ \
724 /* ##TYPE##_SECTION_ELSE */ \
726 /* BEGIN_##TYPE##_SECTION_NESTED(94) */ \
728 /* ##TYPE##_SECTION_ELSE_NESTED(94) */ \
730 /* ALT_##TYPE##_SECTION_END_NESTED(0, 0, 94) */ \
732 /* ALT_##TYPE##_SECTION_END(0, 1) */ \
735 /* Nested alt sections, else with inner else taken */ \
736 /* BEGIN_##TYPE##_SECTION */ \
738 /* BEGIN_##TYPE##_SECTION_NESTED(95) */ \
740 /* ##TYPE##_SECTION_ELSE_NESTED(95) */ \
742 /* ALT_##TYPE##_SECTION_END_NESTED(0, 1, 95) */ \
744 /* ##TYPE##_SECTION_ELSE */ \
746 /* BEGIN_##TYPE##_SECTION_NESTED(94) */ \
748 /* ##TYPE##_SECTION_ELSE_NESTED(94) */ \
750 /* ALT_##TYPE##_SECTION_END_NESTED(0, 1, 94) */ \
752 /* ALT_##TYPE##_SECTION_END(0, 1) */ \
755 /* Nested alt sections, else can have large else case */ \
756 /* BEGIN_##TYPE##_SECTION */ \
761 /* ##TYPE##_SECTION_ELSE */ \
762 /* BEGIN_##TYPE##_SECTION_NESTED(94) */ \
767 /* ##TYPE##_SECTION_ELSE_NESTED(94) */ \
772 /* ALT_##TYPE##_SECTION_END_NESTED(0, 1, 94) */ \
773 /* ALT_##TYPE##_SECTION_END(0, 1) */ \
777 MAKE_MACRO_TEST(FTR);
778 MAKE_MACRO_TEST_EXPECTED(FTR);
781 MAKE_MACRO_TEST(FW_FTR);
782 MAKE_MACRO_TEST_EXPECTED(FW_FTR);
785 globl(lwsync_fixup_test)
788 globl(end_lwsync_fixup_test)
790 globl(lwsync_fixup_test_expected_LWSYNC)
794 globl(lwsync_fixup_test_expected_SYNC)