diff options
author | Jon Medhurst <tixy@yxit.co.uk> | 2011-06-06 07:20:25 -0400 |
---|---|---|
committer | Tixy <tixy@medhuaa1.miniserver.com> | 2011-07-13 13:32:48 -0400 |
commit | 9a5c1284a3ec76c15a8bc51b2badc29e42fc5d92 (patch) | |
tree | c1d9330196d44eeea1dd4c18a12089b4fbd4c7c3 | |
parent | bb1085f82710f0194bf8a1b587c96ecae7f131f8 (diff) |
ARM: kprobes: Migrate ARM space_1111 to decoding tables
Signed-off-by: Jon Medhurst <tixy@yxit.co.uk>
Acked-by: Nicolas Pitre <nicolas.pitre@linaro.org>
-rw-r--r-- | arch/arm/kernel/kprobes-arm.c | 56 |
1 files changed, 25 insertions, 31 deletions
diff --git a/arch/arm/kernel/kprobes-arm.c b/arch/arm/kernel/kprobes-arm.c index c6f2c693b1b6..ea96214ef341 100644 --- a/arch/arm/kernel/kprobes-arm.c +++ b/arch/arm/kernel/kprobes-arm.c | |||
@@ -896,41 +896,35 @@ prep_emulate_rdhi16rdlo12rs8rm0_wflags(kprobe_opcode_t insn, | |||
896 | * number of tests needed. | 896 | * number of tests needed. |
897 | */ | 897 | */ |
898 | 898 | ||
899 | static enum kprobe_insn __kprobes | 899 | static const union decode_item arm_1111_table[] = { |
900 | space_1111(kprobe_opcode_t insn, struct arch_specific_insn *asi) | 900 | /* Unconditional instructions */ |
901 | { | ||
902 | /* memory hint : 1111 0100 x001 xxxx xxxx xxxx xxxx xxxx : */ | ||
903 | /* PLDI : 1111 0100 x101 xxxx xxxx xxxx xxxx xxxx : */ | ||
904 | /* PLDW : 1111 0101 x001 xxxx xxxx xxxx xxxx xxxx : */ | ||
905 | /* PLD : 1111 0101 x101 xxxx xxxx xxxx xxxx xxxx : */ | ||
906 | if ((insn & 0xfe300000) == 0xf4100000) { | ||
907 | asi->insn_handler = emulate_nop; | ||
908 | return INSN_GOOD_NO_SLOT; | ||
909 | } | ||
910 | 901 | ||
911 | /* BLX(1) : 1111 101x xxxx xxxx xxxx xxxx xxxx xxxx : */ | 902 | /* memory hint 1111 0100 x001 xxxx xxxx xxxx xxxx xxxx */ |
912 | if ((insn & 0xfe000000) == 0xfa000000) { | 903 | /* PLDI (immediate) 1111 0100 x101 xxxx xxxx xxxx xxxx xxxx */ |
913 | asi->insn_handler = simulate_blx1; | 904 | /* PLDW (immediate) 1111 0101 x001 xxxx xxxx xxxx xxxx xxxx */ |
914 | return INSN_GOOD_NO_SLOT; | 905 | /* PLD (immediate) 1111 0101 x101 xxxx xxxx xxxx xxxx xxxx */ |
915 | } | 906 | DECODE_SIMULATE (0xfe300000, 0xf4100000, kprobe_simulate_nop), |
916 | 907 | ||
917 | /* CPS : 1111 0001 0000 xxx0 xxxx xxxx xx0x xxxx */ | 908 | /* BLX (immediate) 1111 101x xxxx xxxx xxxx xxxx xxxx xxxx */ |
918 | /* SETEND: 1111 0001 0000 0001 xxxx xxxx 0000 xxxx */ | 909 | DECODE_SIMULATE (0xfe000000, 0xfa000000, simulate_blx1), |
919 | 910 | ||
920 | /* SRS : 1111 100x x1x0 xxxx xxxx xxxx xxxx xxxx */ | 911 | /* CPS 1111 0001 0000 xxx0 xxxx xxxx xx0x xxxx */ |
921 | /* RFE : 1111 100x x0x1 xxxx xxxx xxxx xxxx xxxx */ | 912 | /* SETEND 1111 0001 0000 0001 xxxx xxxx 0000 xxxx */ |
913 | /* SRS 1111 100x x1x0 xxxx xxxx xxxx xxxx xxxx */ | ||
914 | /* RFE 1111 100x x0x1 xxxx xxxx xxxx xxxx xxxx */ | ||
922 | 915 | ||
923 | /* Coprocessor instructions... */ | 916 | /* Coprocessor instructions... */ |
924 | /* MCRR2 : 1111 1100 0100 xxxx xxxx xxxx xxxx xxxx : (Rd != Rn) */ | 917 | /* MCRR2 1111 1100 0100 xxxx xxxx xxxx xxxx xxxx */ |
925 | /* MRRC2 : 1111 1100 0101 xxxx xxxx xxxx xxxx xxxx : (Rd != Rn) */ | 918 | /* MRRC2 1111 1100 0101 xxxx xxxx xxxx xxxx xxxx */ |
926 | /* LDC2 : 1111 110x xxx1 xxxx xxxx xxxx xxxx xxxx */ | 919 | /* LDC2 1111 110x xxx1 xxxx xxxx xxxx xxxx xxxx */ |
927 | /* STC2 : 1111 110x xxx0 xxxx xxxx xxxx xxxx xxxx */ | 920 | /* STC2 1111 110x xxx0 xxxx xxxx xxxx xxxx xxxx */ |
928 | /* CDP2 : 1111 1110 xxxx xxxx xxxx xxxx xxx0 xxxx */ | 921 | /* CDP2 1111 1110 xxxx xxxx xxxx xxxx xxx0 xxxx */ |
929 | /* MCR2 : 1111 1110 xxx0 xxxx xxxx xxxx xxx1 xxxx */ | 922 | /* MCR2 1111 1110 xxx0 xxxx xxxx xxxx xxx1 xxxx */ |
930 | /* MRC2 : 1111 1110 xxx1 xxxx xxxx xxxx xxx1 xxxx */ | 923 | /* MRC2 1111 1110 xxx1 xxxx xxxx xxxx xxx1 xxxx */ |
931 | 924 | ||
932 | return INSN_REJECTED; | 925 | /* Other unallocated instructions... */ |
933 | } | 926 | DECODE_END |
927 | }; | ||
934 | 928 | ||
935 | static enum kprobe_insn __kprobes | 929 | static enum kprobe_insn __kprobes |
936 | space_cccc_000x(kprobe_opcode_t insn, struct arch_specific_insn *asi) | 930 | space_cccc_000x(kprobe_opcode_t insn, struct arch_specific_insn *asi) |
@@ -1477,7 +1471,7 @@ arm_kprobe_decode_insn(kprobe_opcode_t insn, struct arch_specific_insn *asi) | |||
1477 | 1471 | ||
1478 | if ((insn & 0xf0000000) == 0xf0000000) | 1472 | if ((insn & 0xf0000000) == 0xf0000000) |
1479 | 1473 | ||
1480 | return space_1111(insn, asi); | 1474 | return kprobe_decode_insn(insn, asi, arm_1111_table, false); |
1481 | 1475 | ||
1482 | else if ((insn & 0x0e000000) == 0x00000000) | 1476 | else if ((insn & 0x0e000000) == 0x00000000) |
1483 | 1477 | ||