diff options
author | Jon Medhurst <tixy@yxit.co.uk> | 2011-07-03 10:15:59 -0400 |
---|---|---|
committer | Tixy <tixy@medhuaa1.miniserver.com> | 2011-07-13 13:32:48 -0400 |
commit | bb1085f82710f0194bf8a1b587c96ecae7f131f8 (patch) | |
tree | 9bb725b3e65bc7ce509e589bedd6c06e18f5abea /arch | |
parent | 231fb150c6f8a1f226380affc5498dd9abffc9d7 (diff) |
ARM: kprobes: Decode 32-bit Thumb multiply and absolute difference instructions
Signed-off-by: Jon Medhurst <tixy@yxit.co.uk>
Acked-by: Nicolas Pitre <nicolas.pitre@linaro.org>
Diffstat (limited to 'arch')
-rw-r--r-- | arch/arm/kernel/kprobes-thumb.c | 49 |
1 files changed, 49 insertions, 0 deletions
diff --git a/arch/arm/kernel/kprobes-thumb.c b/arch/arm/kernel/kprobes-thumb.c index 4ef12d13c7d0..902ca59e8b11 100644 --- a/arch/arm/kernel/kprobes-thumb.c +++ b/arch/arm/kernel/kprobes-thumb.c | |||
@@ -315,6 +315,10 @@ t32_emulate_rdlo12rdhi8rn16rm0_noflags(struct kprobe *p, struct pt_regs *regs) | |||
315 | regs->uregs[rdhi] = rdhiv; | 315 | regs->uregs[rdhi] = rdhiv; |
316 | } | 316 | } |
317 | 317 | ||
318 | /* These emulation encodings are functionally equivalent... */ | ||
319 | #define t32_emulate_rd8rn16rm0ra12_noflags \ | ||
320 | t32_emulate_rdlo12rdhi8rn16rm0_noflags | ||
321 | |||
318 | static const union decode_item t32_table_1110_100x_x0xx[] = { | 322 | static const union decode_item t32_table_1110_100x_x0xx[] = { |
319 | /* Load/store multiple instructions */ | 323 | /* Load/store multiple instructions */ |
320 | 324 | ||
@@ -789,6 +793,45 @@ static const union decode_item t32_table_1111_1010___1111[] = { | |||
789 | DECODE_END | 793 | DECODE_END |
790 | }; | 794 | }; |
791 | 795 | ||
796 | static const union decode_item t32_table_1111_1011_0[] = { | ||
797 | /* Multiply, multiply accumulate, and absolute difference */ | ||
798 | |||
799 | /* ??? 1111 1011 0000 xxxx 1111 xxxx 0001 xxxx */ | ||
800 | DECODE_REJECT (0xfff0f0f0, 0xfb00f010), | ||
801 | /* ??? 1111 1011 0111 xxxx 1111 xxxx 0001 xxxx */ | ||
802 | DECODE_REJECT (0xfff0f0f0, 0xfb70f010), | ||
803 | |||
804 | /* SMULxy 1111 1011 0001 xxxx 1111 xxxx 00xx xxxx */ | ||
805 | DECODE_OR (0xfff0f0c0, 0xfb10f000), | ||
806 | /* MUL 1111 1011 0000 xxxx 1111 xxxx 0000 xxxx */ | ||
807 | /* SMUAD{X} 1111 1011 0010 xxxx 1111 xxxx 000x xxxx */ | ||
808 | /* SMULWy 1111 1011 0011 xxxx 1111 xxxx 000x xxxx */ | ||
809 | /* SMUSD{X} 1111 1011 0100 xxxx 1111 xxxx 000x xxxx */ | ||
810 | /* SMMUL{R} 1111 1011 0101 xxxx 1111 xxxx 000x xxxx */ | ||
811 | /* USAD8 1111 1011 0111 xxxx 1111 xxxx 0000 xxxx */ | ||
812 | DECODE_EMULATEX (0xff80f0e0, 0xfb00f000, t32_emulate_rd8rn16rm0_rwflags, | ||
813 | REGS(NOSPPC, 0, NOSPPC, 0, NOSPPC)), | ||
814 | |||
815 | /* ??? 1111 1011 0111 xxxx xxxx xxxx 0001 xxxx */ | ||
816 | DECODE_REJECT (0xfff000f0, 0xfb700010), | ||
817 | |||
818 | /* SMLAxy 1111 1011 0001 xxxx xxxx xxxx 00xx xxxx */ | ||
819 | DECODE_OR (0xfff000c0, 0xfb100000), | ||
820 | /* MLA 1111 1011 0000 xxxx xxxx xxxx 0000 xxxx */ | ||
821 | /* MLS 1111 1011 0000 xxxx xxxx xxxx 0001 xxxx */ | ||
822 | /* SMLAD{X} 1111 1011 0010 xxxx xxxx xxxx 000x xxxx */ | ||
823 | /* SMLAWy 1111 1011 0011 xxxx xxxx xxxx 000x xxxx */ | ||
824 | /* SMLSD{X} 1111 1011 0100 xxxx xxxx xxxx 000x xxxx */ | ||
825 | /* SMMLA{R} 1111 1011 0101 xxxx xxxx xxxx 000x xxxx */ | ||
826 | /* SMMLS{R} 1111 1011 0110 xxxx xxxx xxxx 000x xxxx */ | ||
827 | /* USADA8 1111 1011 0111 xxxx xxxx xxxx 0000 xxxx */ | ||
828 | DECODE_EMULATEX (0xff8000c0, 0xfb000000, t32_emulate_rd8rn16rm0ra12_noflags, | ||
829 | REGS(NOSPPC, NOSPPCX, NOSPPC, 0, NOSPPC)), | ||
830 | |||
831 | /* Other unallocated instructions... */ | ||
832 | DECODE_END | ||
833 | }; | ||
834 | |||
792 | static const union decode_item t32_table_1111_1011_1[] = { | 835 | static const union decode_item t32_table_1111_1011_1[] = { |
793 | /* Long multiply, long multiply accumulate, and divide */ | 836 | /* Long multiply, long multiply accumulate, and divide */ |
794 | 837 | ||
@@ -883,6 +926,12 @@ const union decode_item kprobe_decode_thumb32_table[] = { | |||
883 | DECODE_TABLE (0xff00f000, 0xfa00f000, t32_table_1111_1010___1111), | 926 | DECODE_TABLE (0xff00f000, 0xfa00f000, t32_table_1111_1010___1111), |
884 | 927 | ||
885 | /* | 928 | /* |
929 | * Multiply, multiply accumulate, and absolute difference | ||
930 | * 1111 1011 0xxx xxxx xxxx xxxx xxxx xxxx | ||
931 | */ | ||
932 | DECODE_TABLE (0xff800000, 0xfb000000, t32_table_1111_1011_0), | ||
933 | |||
934 | /* | ||
886 | * Long multiply, long multiply accumulate, and divide | 935 | * Long multiply, long multiply accumulate, and divide |
887 | * 1111 1011 1xxx xxxx xxxx xxxx xxxx xxxx | 936 | * 1111 1011 1xxx xxxx xxxx xxxx xxxx xxxx |
888 | */ | 937 | */ |