diff options
author | Zi Shen Lim <zlim.lnx@gmail.com> | 2016-01-14 02:33:21 -0500 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2016-01-17 19:15:26 -0500 |
commit | c94ae4f7c5ec6b6fddde1c08809d5e32a963d7f3 (patch) | |
tree | e0041c10278e7105b9979a3aac92eda349559db4 | |
parent | dd7445ad6be3809565272b0e724f2f00c2de1989 (diff) |
arm64: insn: remove BUG_ON from codegen
During code generation, we used to BUG_ON unknown/unsupported encoding
or invalid parameters.
Instead, now we report these as errors and simply return the
instruction AARCH64_BREAK_FAULT. Users of these codegen helpers should
check for and handle this failure condition as appropriate.
Otherwise, unhandled codegen failure will result in trapping at
run-time due to AARCH64_BREAK_FAULT, which is arguably better than a
BUG_ON.
Signed-off-by: Zi Shen Lim <zlim.lnx@gmail.com>
Acked-by: Will Deacon <will.deacon@arm.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r-- | arch/arm64/kernel/insn.c | 165 |
1 files changed, 112 insertions, 53 deletions
diff --git a/arch/arm64/kernel/insn.c b/arch/arm64/kernel/insn.c index c08b9ad6f429..7371455160e5 100644 --- a/arch/arm64/kernel/insn.c +++ b/arch/arm64/kernel/insn.c | |||
@@ -2,7 +2,7 @@ | |||
2 | * Copyright (C) 2013 Huawei Ltd. | 2 | * Copyright (C) 2013 Huawei Ltd. |
3 | * Author: Jiang Liu <liuj97@gmail.com> | 3 | * Author: Jiang Liu <liuj97@gmail.com> |
4 | * | 4 | * |
5 | * Copyright (C) 2014 Zi Shen Lim <zlim.lnx@gmail.com> | 5 | * Copyright (C) 2014-2016 Zi Shen Lim <zlim.lnx@gmail.com> |
6 | * | 6 | * |
7 | * This program is free software; you can redistribute it and/or modify | 7 | * This program is free software; you can redistribute it and/or modify |
8 | * it under the terms of the GNU General Public License version 2 as | 8 | * it under the terms of the GNU General Public License version 2 as |
@@ -363,6 +363,9 @@ u32 __kprobes aarch64_insn_encode_immediate(enum aarch64_insn_imm_type type, | |||
363 | u32 immlo, immhi, mask; | 363 | u32 immlo, immhi, mask; |
364 | int shift; | 364 | int shift; |
365 | 365 | ||
366 | if (insn == AARCH64_BREAK_FAULT) | ||
367 | return AARCH64_BREAK_FAULT; | ||
368 | |||
366 | switch (type) { | 369 | switch (type) { |
367 | case AARCH64_INSN_IMM_ADR: | 370 | case AARCH64_INSN_IMM_ADR: |
368 | shift = 0; | 371 | shift = 0; |
@@ -377,7 +380,7 @@ u32 __kprobes aarch64_insn_encode_immediate(enum aarch64_insn_imm_type type, | |||
377 | if (aarch64_get_imm_shift_mask(type, &mask, &shift) < 0) { | 380 | if (aarch64_get_imm_shift_mask(type, &mask, &shift) < 0) { |
378 | pr_err("aarch64_insn_encode_immediate: unknown immediate encoding %d\n", | 381 | pr_err("aarch64_insn_encode_immediate: unknown immediate encoding %d\n", |
379 | type); | 382 | type); |
380 | return 0; | 383 | return AARCH64_BREAK_FAULT; |
381 | } | 384 | } |
382 | } | 385 | } |
383 | 386 | ||
@@ -394,9 +397,12 @@ static u32 aarch64_insn_encode_register(enum aarch64_insn_register_type type, | |||
394 | { | 397 | { |
395 | int shift; | 398 | int shift; |
396 | 399 | ||
400 | if (insn == AARCH64_BREAK_FAULT) | ||
401 | return AARCH64_BREAK_FAULT; | ||
402 | |||
397 | if (reg < AARCH64_INSN_REG_0 || reg > AARCH64_INSN_REG_SP) { | 403 | if (reg < AARCH64_INSN_REG_0 || reg > AARCH64_INSN_REG_SP) { |
398 | pr_err("%s: unknown register encoding %d\n", __func__, reg); | 404 | pr_err("%s: unknown register encoding %d\n", __func__, reg); |
399 | return 0; | 405 | return AARCH64_BREAK_FAULT; |
400 | } | 406 | } |
401 | 407 | ||
402 | switch (type) { | 408 | switch (type) { |
@@ -417,7 +423,7 @@ static u32 aarch64_insn_encode_register(enum aarch64_insn_register_type type, | |||
417 | default: | 423 | default: |
418 | pr_err("%s: unknown register type encoding %d\n", __func__, | 424 | pr_err("%s: unknown register type encoding %d\n", __func__, |
419 | type); | 425 | type); |
420 | return 0; | 426 | return AARCH64_BREAK_FAULT; |
421 | } | 427 | } |
422 | 428 | ||
423 | insn &= ~(GENMASK(4, 0) << shift); | 429 | insn &= ~(GENMASK(4, 0) << shift); |
@@ -446,7 +452,7 @@ static u32 aarch64_insn_encode_ldst_size(enum aarch64_insn_size_type type, | |||
446 | break; | 452 | break; |
447 | default: | 453 | default: |
448 | pr_err("%s: unknown size encoding %d\n", __func__, type); | 454 | pr_err("%s: unknown size encoding %d\n", __func__, type); |
449 | return 0; | 455 | return AARCH64_BREAK_FAULT; |
450 | } | 456 | } |
451 | 457 | ||
452 | insn &= ~GENMASK(31, 30); | 458 | insn &= ~GENMASK(31, 30); |
@@ -460,14 +466,17 @@ static inline long branch_imm_common(unsigned long pc, unsigned long addr, | |||
460 | { | 466 | { |
461 | long offset; | 467 | long offset; |
462 | 468 | ||
463 | /* | 469 | if ((pc & 0x3) || (addr & 0x3)) { |
464 | * PC: A 64-bit Program Counter holding the address of the current | 470 | pr_err("%s: A64 instructions must be word aligned\n", __func__); |
465 | * instruction. A64 instructions must be word-aligned. | 471 | return range; |
466 | */ | 472 | } |
467 | BUG_ON((pc & 0x3) || (addr & 0x3)); | ||
468 | 473 | ||
469 | offset = ((long)addr - (long)pc); | 474 | offset = ((long)addr - (long)pc); |
470 | BUG_ON(offset < -range || offset >= range); | 475 | |
476 | if (offset < -range || offset >= range) { | ||
477 | pr_err("%s: offset out of range\n", __func__); | ||
478 | return range; | ||
479 | } | ||
471 | 480 | ||
472 | return offset; | 481 | return offset; |
473 | } | 482 | } |
@@ -484,6 +493,8 @@ u32 __kprobes aarch64_insn_gen_branch_imm(unsigned long pc, unsigned long addr, | |||
484 | * texts are within +/-128M. | 493 | * texts are within +/-128M. |
485 | */ | 494 | */ |
486 | offset = branch_imm_common(pc, addr, SZ_128M); | 495 | offset = branch_imm_common(pc, addr, SZ_128M); |
496 | if (offset >= SZ_128M) | ||
497 | return AARCH64_BREAK_FAULT; | ||
487 | 498 | ||
488 | switch (type) { | 499 | switch (type) { |
489 | case AARCH64_INSN_BRANCH_LINK: | 500 | case AARCH64_INSN_BRANCH_LINK: |
@@ -493,7 +504,7 @@ u32 __kprobes aarch64_insn_gen_branch_imm(unsigned long pc, unsigned long addr, | |||
493 | insn = aarch64_insn_get_b_value(); | 504 | insn = aarch64_insn_get_b_value(); |
494 | break; | 505 | break; |
495 | default: | 506 | default: |
496 | BUG_ON(1); | 507 | pr_err("%s: unknown branch encoding %d\n", __func__, type); |
497 | return AARCH64_BREAK_FAULT; | 508 | return AARCH64_BREAK_FAULT; |
498 | } | 509 | } |
499 | 510 | ||
@@ -510,6 +521,8 @@ u32 aarch64_insn_gen_comp_branch_imm(unsigned long pc, unsigned long addr, | |||
510 | long offset; | 521 | long offset; |
511 | 522 | ||
512 | offset = branch_imm_common(pc, addr, SZ_1M); | 523 | offset = branch_imm_common(pc, addr, SZ_1M); |
524 | if (offset >= SZ_1M) | ||
525 | return AARCH64_BREAK_FAULT; | ||
513 | 526 | ||
514 | switch (type) { | 527 | switch (type) { |
515 | case AARCH64_INSN_BRANCH_COMP_ZERO: | 528 | case AARCH64_INSN_BRANCH_COMP_ZERO: |
@@ -519,7 +532,7 @@ u32 aarch64_insn_gen_comp_branch_imm(unsigned long pc, unsigned long addr, | |||
519 | insn = aarch64_insn_get_cbnz_value(); | 532 | insn = aarch64_insn_get_cbnz_value(); |
520 | break; | 533 | break; |
521 | default: | 534 | default: |
522 | BUG_ON(1); | 535 | pr_err("%s: unknown branch encoding %d\n", __func__, type); |
523 | return AARCH64_BREAK_FAULT; | 536 | return AARCH64_BREAK_FAULT; |
524 | } | 537 | } |
525 | 538 | ||
@@ -530,7 +543,7 @@ u32 aarch64_insn_gen_comp_branch_imm(unsigned long pc, unsigned long addr, | |||
530 | insn |= AARCH64_INSN_SF_BIT; | 543 | insn |= AARCH64_INSN_SF_BIT; |
531 | break; | 544 | break; |
532 | default: | 545 | default: |
533 | BUG_ON(1); | 546 | pr_err("%s: unknown variant encoding %d\n", __func__, variant); |
534 | return AARCH64_BREAK_FAULT; | 547 | return AARCH64_BREAK_FAULT; |
535 | } | 548 | } |
536 | 549 | ||
@@ -550,7 +563,10 @@ u32 aarch64_insn_gen_cond_branch_imm(unsigned long pc, unsigned long addr, | |||
550 | 563 | ||
551 | insn = aarch64_insn_get_bcond_value(); | 564 | insn = aarch64_insn_get_bcond_value(); |
552 | 565 | ||
553 | BUG_ON(cond < AARCH64_INSN_COND_EQ || cond > AARCH64_INSN_COND_AL); | 566 | if (cond < AARCH64_INSN_COND_EQ || cond > AARCH64_INSN_COND_AL) { |
567 | pr_err("%s: unknown condition encoding %d\n", __func__, cond); | ||
568 | return AARCH64_BREAK_FAULT; | ||
569 | } | ||
554 | insn |= cond; | 570 | insn |= cond; |
555 | 571 | ||
556 | return aarch64_insn_encode_immediate(AARCH64_INSN_IMM_19, insn, | 572 | return aarch64_insn_encode_immediate(AARCH64_INSN_IMM_19, insn, |
@@ -583,7 +599,7 @@ u32 aarch64_insn_gen_branch_reg(enum aarch64_insn_register reg, | |||
583 | insn = aarch64_insn_get_ret_value(); | 599 | insn = aarch64_insn_get_ret_value(); |
584 | break; | 600 | break; |
585 | default: | 601 | default: |
586 | BUG_ON(1); | 602 | pr_err("%s: unknown branch encoding %d\n", __func__, type); |
587 | return AARCH64_BREAK_FAULT; | 603 | return AARCH64_BREAK_FAULT; |
588 | } | 604 | } |
589 | 605 | ||
@@ -606,7 +622,7 @@ u32 aarch64_insn_gen_load_store_reg(enum aarch64_insn_register reg, | |||
606 | insn = aarch64_insn_get_str_reg_value(); | 622 | insn = aarch64_insn_get_str_reg_value(); |
607 | break; | 623 | break; |
608 | default: | 624 | default: |
609 | BUG_ON(1); | 625 | pr_err("%s: unknown load/store encoding %d\n", __func__, type); |
610 | return AARCH64_BREAK_FAULT; | 626 | return AARCH64_BREAK_FAULT; |
611 | } | 627 | } |
612 | 628 | ||
@@ -645,26 +661,30 @@ u32 aarch64_insn_gen_load_store_pair(enum aarch64_insn_register reg1, | |||
645 | insn = aarch64_insn_get_stp_post_value(); | 661 | insn = aarch64_insn_get_stp_post_value(); |
646 | break; | 662 | break; |
647 | default: | 663 | default: |
648 | BUG_ON(1); | 664 | pr_err("%s: unknown load/store encoding %d\n", __func__, type); |
649 | return AARCH64_BREAK_FAULT; | 665 | return AARCH64_BREAK_FAULT; |
650 | } | 666 | } |
651 | 667 | ||
652 | switch (variant) { | 668 | switch (variant) { |
653 | case AARCH64_INSN_VARIANT_32BIT: | 669 | case AARCH64_INSN_VARIANT_32BIT: |
654 | /* offset must be multiples of 4 in the range [-256, 252] */ | 670 | if ((offset & 0x3) || (offset < -256) || (offset > 252)) { |
655 | BUG_ON(offset & 0x3); | 671 | pr_err("%s: offset must be multiples of 4 in the range of [-256, 252] %d\n", |
656 | BUG_ON(offset < -256 || offset > 252); | 672 | __func__, offset); |
673 | return AARCH64_BREAK_FAULT; | ||
674 | } | ||
657 | shift = 2; | 675 | shift = 2; |
658 | break; | 676 | break; |
659 | case AARCH64_INSN_VARIANT_64BIT: | 677 | case AARCH64_INSN_VARIANT_64BIT: |
660 | /* offset must be multiples of 8 in the range [-512, 504] */ | 678 | if ((offset & 0x7) || (offset < -512) || (offset > 504)) { |
661 | BUG_ON(offset & 0x7); | 679 | pr_err("%s: offset must be multiples of 8 in the range of [-512, 504] %d\n", |
662 | BUG_ON(offset < -512 || offset > 504); | 680 | __func__, offset); |
681 | return AARCH64_BREAK_FAULT; | ||
682 | } | ||
663 | shift = 3; | 683 | shift = 3; |
664 | insn |= AARCH64_INSN_SF_BIT; | 684 | insn |= AARCH64_INSN_SF_BIT; |
665 | break; | 685 | break; |
666 | default: | 686 | default: |
667 | BUG_ON(1); | 687 | pr_err("%s: unknown variant encoding %d\n", __func__, variant); |
668 | return AARCH64_BREAK_FAULT; | 688 | return AARCH64_BREAK_FAULT; |
669 | } | 689 | } |
670 | 690 | ||
@@ -702,7 +722,7 @@ u32 aarch64_insn_gen_add_sub_imm(enum aarch64_insn_register dst, | |||
702 | insn = aarch64_insn_get_subs_imm_value(); | 722 | insn = aarch64_insn_get_subs_imm_value(); |
703 | break; | 723 | break; |
704 | default: | 724 | default: |
705 | BUG_ON(1); | 725 | pr_err("%s: unknown add/sub encoding %d\n", __func__, type); |
706 | return AARCH64_BREAK_FAULT; | 726 | return AARCH64_BREAK_FAULT; |
707 | } | 727 | } |
708 | 728 | ||
@@ -713,11 +733,14 @@ u32 aarch64_insn_gen_add_sub_imm(enum aarch64_insn_register dst, | |||
713 | insn |= AARCH64_INSN_SF_BIT; | 733 | insn |= AARCH64_INSN_SF_BIT; |
714 | break; | 734 | break; |
715 | default: | 735 | default: |
716 | BUG_ON(1); | 736 | pr_err("%s: unknown variant encoding %d\n", __func__, variant); |
717 | return AARCH64_BREAK_FAULT; | 737 | return AARCH64_BREAK_FAULT; |
718 | } | 738 | } |
719 | 739 | ||
720 | BUG_ON(imm & ~(SZ_4K - 1)); | 740 | if (imm & ~(SZ_4K - 1)) { |
741 | pr_err("%s: invalid immediate encoding %d\n", __func__, imm); | ||
742 | return AARCH64_BREAK_FAULT; | ||
743 | } | ||
721 | 744 | ||
722 | insn = aarch64_insn_encode_register(AARCH64_INSN_REGTYPE_RD, insn, dst); | 745 | insn = aarch64_insn_encode_register(AARCH64_INSN_REGTYPE_RD, insn, dst); |
723 | 746 | ||
@@ -746,7 +769,7 @@ u32 aarch64_insn_gen_bitfield(enum aarch64_insn_register dst, | |||
746 | insn = aarch64_insn_get_sbfm_value(); | 769 | insn = aarch64_insn_get_sbfm_value(); |
747 | break; | 770 | break; |
748 | default: | 771 | default: |
749 | BUG_ON(1); | 772 | pr_err("%s: unknown bitfield encoding %d\n", __func__, type); |
750 | return AARCH64_BREAK_FAULT; | 773 | return AARCH64_BREAK_FAULT; |
751 | } | 774 | } |
752 | 775 | ||
@@ -759,12 +782,18 @@ u32 aarch64_insn_gen_bitfield(enum aarch64_insn_register dst, | |||
759 | mask = GENMASK(5, 0); | 782 | mask = GENMASK(5, 0); |
760 | break; | 783 | break; |
761 | default: | 784 | default: |
762 | BUG_ON(1); | 785 | pr_err("%s: unknown variant encoding %d\n", __func__, variant); |
763 | return AARCH64_BREAK_FAULT; | 786 | return AARCH64_BREAK_FAULT; |
764 | } | 787 | } |
765 | 788 | ||
766 | BUG_ON(immr & ~mask); | 789 | if (immr & ~mask) { |
767 | BUG_ON(imms & ~mask); | 790 | pr_err("%s: invalid immr encoding %d\n", __func__, immr); |
791 | return AARCH64_BREAK_FAULT; | ||
792 | } | ||
793 | if (imms & ~mask) { | ||
794 | pr_err("%s: invalid imms encoding %d\n", __func__, imms); | ||
795 | return AARCH64_BREAK_FAULT; | ||
796 | } | ||
768 | 797 | ||
769 | insn = aarch64_insn_encode_register(AARCH64_INSN_REGTYPE_RD, insn, dst); | 798 | insn = aarch64_insn_encode_register(AARCH64_INSN_REGTYPE_RD, insn, dst); |
770 | 799 | ||
@@ -793,23 +822,33 @@ u32 aarch64_insn_gen_movewide(enum aarch64_insn_register dst, | |||
793 | insn = aarch64_insn_get_movn_value(); | 822 | insn = aarch64_insn_get_movn_value(); |
794 | break; | 823 | break; |
795 | default: | 824 | default: |
796 | BUG_ON(1); | 825 | pr_err("%s: unknown movewide encoding %d\n", __func__, type); |
797 | return AARCH64_BREAK_FAULT; | 826 | return AARCH64_BREAK_FAULT; |
798 | } | 827 | } |
799 | 828 | ||
800 | BUG_ON(imm & ~(SZ_64K - 1)); | 829 | if (imm & ~(SZ_64K - 1)) { |
830 | pr_err("%s: invalid immediate encoding %d\n", __func__, imm); | ||
831 | return AARCH64_BREAK_FAULT; | ||
832 | } | ||
801 | 833 | ||
802 | switch (variant) { | 834 | switch (variant) { |
803 | case AARCH64_INSN_VARIANT_32BIT: | 835 | case AARCH64_INSN_VARIANT_32BIT: |
804 | BUG_ON(shift != 0 && shift != 16); | 836 | if (shift != 0 && shift != 16) { |
837 | pr_err("%s: invalid shift encoding %d\n", __func__, | ||
838 | shift); | ||
839 | return AARCH64_BREAK_FAULT; | ||
840 | } | ||
805 | break; | 841 | break; |
806 | case AARCH64_INSN_VARIANT_64BIT: | 842 | case AARCH64_INSN_VARIANT_64BIT: |
807 | insn |= AARCH64_INSN_SF_BIT; | 843 | insn |= AARCH64_INSN_SF_BIT; |
808 | BUG_ON(shift != 0 && shift != 16 && shift != 32 && | 844 | if (shift != 0 && shift != 16 && shift != 32 && shift != 48) { |
809 | shift != 48); | 845 | pr_err("%s: invalid shift encoding %d\n", __func__, |
846 | shift); | ||
847 | return AARCH64_BREAK_FAULT; | ||
848 | } | ||
810 | break; | 849 | break; |
811 | default: | 850 | default: |
812 | BUG_ON(1); | 851 | pr_err("%s: unknown variant encoding %d\n", __func__, variant); |
813 | return AARCH64_BREAK_FAULT; | 852 | return AARCH64_BREAK_FAULT; |
814 | } | 853 | } |
815 | 854 | ||
@@ -843,20 +882,28 @@ u32 aarch64_insn_gen_add_sub_shifted_reg(enum aarch64_insn_register dst, | |||
843 | insn = aarch64_insn_get_subs_value(); | 882 | insn = aarch64_insn_get_subs_value(); |
844 | break; | 883 | break; |
845 | default: | 884 | default: |
846 | BUG_ON(1); | 885 | pr_err("%s: unknown add/sub encoding %d\n", __func__, type); |
847 | return AARCH64_BREAK_FAULT; | 886 | return AARCH64_BREAK_FAULT; |
848 | } | 887 | } |
849 | 888 | ||
850 | switch (variant) { | 889 | switch (variant) { |
851 | case AARCH64_INSN_VARIANT_32BIT: | 890 | case AARCH64_INSN_VARIANT_32BIT: |
852 | BUG_ON(shift & ~(SZ_32 - 1)); | 891 | if (shift & ~(SZ_32 - 1)) { |
892 | pr_err("%s: invalid shift encoding %d\n", __func__, | ||
893 | shift); | ||
894 | return AARCH64_BREAK_FAULT; | ||
895 | } | ||
853 | break; | 896 | break; |
854 | case AARCH64_INSN_VARIANT_64BIT: | 897 | case AARCH64_INSN_VARIANT_64BIT: |
855 | insn |= AARCH64_INSN_SF_BIT; | 898 | insn |= AARCH64_INSN_SF_BIT; |
856 | BUG_ON(shift & ~(SZ_64 - 1)); | 899 | if (shift & ~(SZ_64 - 1)) { |
900 | pr_err("%s: invalid shift encoding %d\n", __func__, | ||
901 | shift); | ||
902 | return AARCH64_BREAK_FAULT; | ||
903 | } | ||
857 | break; | 904 | break; |
858 | default: | 905 | default: |
859 | BUG_ON(1); | 906 | pr_err("%s: unknown variant encoding %d\n", __func__, variant); |
860 | return AARCH64_BREAK_FAULT; | 907 | return AARCH64_BREAK_FAULT; |
861 | } | 908 | } |
862 | 909 | ||
@@ -885,11 +932,15 @@ u32 aarch64_insn_gen_data1(enum aarch64_insn_register dst, | |||
885 | insn = aarch64_insn_get_rev32_value(); | 932 | insn = aarch64_insn_get_rev32_value(); |
886 | break; | 933 | break; |
887 | case AARCH64_INSN_DATA1_REVERSE_64: | 934 | case AARCH64_INSN_DATA1_REVERSE_64: |
888 | BUG_ON(variant != AARCH64_INSN_VARIANT_64BIT); | 935 | if (variant != AARCH64_INSN_VARIANT_64BIT) { |
936 | pr_err("%s: invalid variant for reverse64 %d\n", | ||
937 | __func__, variant); | ||
938 | return AARCH64_BREAK_FAULT; | ||
939 | } | ||
889 | insn = aarch64_insn_get_rev64_value(); | 940 | insn = aarch64_insn_get_rev64_value(); |
890 | break; | 941 | break; |
891 | default: | 942 | default: |
892 | BUG_ON(1); | 943 | pr_err("%s: unknown data1 encoding %d\n", __func__, type); |
893 | return AARCH64_BREAK_FAULT; | 944 | return AARCH64_BREAK_FAULT; |
894 | } | 945 | } |
895 | 946 | ||
@@ -900,7 +951,7 @@ u32 aarch64_insn_gen_data1(enum aarch64_insn_register dst, | |||
900 | insn |= AARCH64_INSN_SF_BIT; | 951 | insn |= AARCH64_INSN_SF_BIT; |
901 | break; | 952 | break; |
902 | default: | 953 | default: |
903 | BUG_ON(1); | 954 | pr_err("%s: unknown variant encoding %d\n", __func__, variant); |
904 | return AARCH64_BREAK_FAULT; | 955 | return AARCH64_BREAK_FAULT; |
905 | } | 956 | } |
906 | 957 | ||
@@ -937,7 +988,7 @@ u32 aarch64_insn_gen_data2(enum aarch64_insn_register dst, | |||
937 | insn = aarch64_insn_get_rorv_value(); | 988 | insn = aarch64_insn_get_rorv_value(); |
938 | break; | 989 | break; |
939 | default: | 990 | default: |
940 | BUG_ON(1); | 991 | pr_err("%s: unknown data2 encoding %d\n", __func__, type); |
941 | return AARCH64_BREAK_FAULT; | 992 | return AARCH64_BREAK_FAULT; |
942 | } | 993 | } |
943 | 994 | ||
@@ -948,7 +999,7 @@ u32 aarch64_insn_gen_data2(enum aarch64_insn_register dst, | |||
948 | insn |= AARCH64_INSN_SF_BIT; | 999 | insn |= AARCH64_INSN_SF_BIT; |
949 | break; | 1000 | break; |
950 | default: | 1001 | default: |
951 | BUG_ON(1); | 1002 | pr_err("%s: unknown variant encoding %d\n", __func__, variant); |
952 | return AARCH64_BREAK_FAULT; | 1003 | return AARCH64_BREAK_FAULT; |
953 | } | 1004 | } |
954 | 1005 | ||
@@ -976,7 +1027,7 @@ u32 aarch64_insn_gen_data3(enum aarch64_insn_register dst, | |||
976 | insn = aarch64_insn_get_msub_value(); | 1027 | insn = aarch64_insn_get_msub_value(); |
977 | break; | 1028 | break; |
978 | default: | 1029 | default: |
979 | BUG_ON(1); | 1030 | pr_err("%s: unknown data3 encoding %d\n", __func__, type); |
980 | return AARCH64_BREAK_FAULT; | 1031 | return AARCH64_BREAK_FAULT; |
981 | } | 1032 | } |
982 | 1033 | ||
@@ -987,7 +1038,7 @@ u32 aarch64_insn_gen_data3(enum aarch64_insn_register dst, | |||
987 | insn |= AARCH64_INSN_SF_BIT; | 1038 | insn |= AARCH64_INSN_SF_BIT; |
988 | break; | 1039 | break; |
989 | default: | 1040 | default: |
990 | BUG_ON(1); | 1041 | pr_err("%s: unknown variant encoding %d\n", __func__, variant); |
991 | return AARCH64_BREAK_FAULT; | 1042 | return AARCH64_BREAK_FAULT; |
992 | } | 1043 | } |
993 | 1044 | ||
@@ -1037,20 +1088,28 @@ u32 aarch64_insn_gen_logical_shifted_reg(enum aarch64_insn_register dst, | |||
1037 | insn = aarch64_insn_get_bics_value(); | 1088 | insn = aarch64_insn_get_bics_value(); |
1038 | break; | 1089 | break; |
1039 | default: | 1090 | default: |
1040 | BUG_ON(1); | 1091 | pr_err("%s: unknown logical encoding %d\n", __func__, type); |
1041 | return AARCH64_BREAK_FAULT; | 1092 | return AARCH64_BREAK_FAULT; |
1042 | } | 1093 | } |
1043 | 1094 | ||
1044 | switch (variant) { | 1095 | switch (variant) { |
1045 | case AARCH64_INSN_VARIANT_32BIT: | 1096 | case AARCH64_INSN_VARIANT_32BIT: |
1046 | BUG_ON(shift & ~(SZ_32 - 1)); | 1097 | if (shift & ~(SZ_32 - 1)) { |
1098 | pr_err("%s: invalid shift encoding %d\n", __func__, | ||
1099 | shift); | ||
1100 | return AARCH64_BREAK_FAULT; | ||
1101 | } | ||
1047 | break; | 1102 | break; |
1048 | case AARCH64_INSN_VARIANT_64BIT: | 1103 | case AARCH64_INSN_VARIANT_64BIT: |
1049 | insn |= AARCH64_INSN_SF_BIT; | 1104 | insn |= AARCH64_INSN_SF_BIT; |
1050 | BUG_ON(shift & ~(SZ_64 - 1)); | 1105 | if (shift & ~(SZ_64 - 1)) { |
1106 | pr_err("%s: invalid shift encoding %d\n", __func__, | ||
1107 | shift); | ||
1108 | return AARCH64_BREAK_FAULT; | ||
1109 | } | ||
1051 | break; | 1110 | break; |
1052 | default: | 1111 | default: |
1053 | BUG_ON(1); | 1112 | pr_err("%s: unknown variant encoding %d\n", __func__, variant); |
1054 | return AARCH64_BREAK_FAULT; | 1113 | return AARCH64_BREAK_FAULT; |
1055 | } | 1114 | } |
1056 | 1115 | ||