aboutsummaryrefslogtreecommitdiffstats
path: root/arch/arm/kernel/kprobes-thumb.c
diff options
context:
space:
mode:
authorJon Medhurst <tixy@yxit.co.uk>2011-07-07 03:59:32 -0400
committerTixy <tixy@medhuaa1.miniserver.com>2011-07-13 13:32:45 -0400
commiteaf1d06500c48109dcd37b7856773fdf608a8d21 (patch)
tree10edef588520e879f2c7992ab82d15591696ce58 /arch/arm/kernel/kprobes-thumb.c
parent3d4a99785abee0687f8fad9a055d2f0c61a9dd57 (diff)
ARM: kprobes: Decode 32-bit Thumb load/store multiple instructions
Signed-off-by: Jon Medhurst <tixy@yxit.co.uk> Acked-by: Nicolas Pitre <nicolas.pitre@linaro.org>
Diffstat (limited to 'arch/arm/kernel/kprobes-thumb.c')
-rw-r--r--arch/arm/kernel/kprobes-thumb.c48
1 files changed, 48 insertions, 0 deletions
diff --git a/arch/arm/kernel/kprobes-thumb.c b/arch/arm/kernel/kprobes-thumb.c
index 27f83a32a038..d25e5cbdd736 100644
--- a/arch/arm/kernel/kprobes-thumb.c
+++ b/arch/arm/kernel/kprobes-thumb.c
@@ -37,6 +37,48 @@ static inline unsigned long __kprobes thumb_probe_pc(struct kprobe *p)
37 return (unsigned long)p->addr - 1 + 4; 37 return (unsigned long)p->addr - 1 + 4;
38} 38}
39 39
40static enum kprobe_insn __kprobes
41t32_decode_ldmstm(kprobe_opcode_t insn, struct arch_specific_insn *asi)
42{
43 enum kprobe_insn ret = kprobe_decode_ldmstm(insn, asi);
44
45 /* Fixup modified instruction to have halfwords in correct order...*/
46 insn = asi->insn[0];
47 ((u16 *)asi->insn)[0] = insn >> 16;
48 ((u16 *)asi->insn)[1] = insn & 0xffff;
49
50 return ret;
51}
52
53static const union decode_item t32_table_1110_100x_x0xx[] = {
54 /* Load/store multiple instructions */
55
56 /* Rn is PC 1110 100x x0xx 1111 xxxx xxxx xxxx xxxx */
57 DECODE_REJECT (0xfe4f0000, 0xe80f0000),
58
59 /* SRS 1110 1000 00x0 xxxx xxxx xxxx xxxx xxxx */
60 /* RFE 1110 1000 00x1 xxxx xxxx xxxx xxxx xxxx */
61 DECODE_REJECT (0xffc00000, 0xe8000000),
62 /* SRS 1110 1001 10x0 xxxx xxxx xxxx xxxx xxxx */
63 /* RFE 1110 1001 10x1 xxxx xxxx xxxx xxxx xxxx */
64 DECODE_REJECT (0xffc00000, 0xe9800000),
65
66 /* STM Rn, {...pc} 1110 100x x0x0 xxxx 1xxx xxxx xxxx xxxx */
67 DECODE_REJECT (0xfe508000, 0xe8008000),
68 /* LDM Rn, {...lr,pc} 1110 100x x0x1 xxxx 11xx xxxx xxxx xxxx */
69 DECODE_REJECT (0xfe50c000, 0xe810c000),
70 /* LDM/STM Rn, {...sp} 1110 100x x0xx xxxx xx1x xxxx xxxx xxxx */
71 DECODE_REJECT (0xfe402000, 0xe8002000),
72
73 /* STMIA 1110 1000 10x0 xxxx xxxx xxxx xxxx xxxx */
74 /* LDMIA 1110 1000 10x1 xxxx xxxx xxxx xxxx xxxx */
75 /* STMDB 1110 1001 00x0 xxxx xxxx xxxx xxxx xxxx */
76 /* LDMDB 1110 1001 00x1 xxxx xxxx xxxx xxxx xxxx */
77 DECODE_CUSTOM (0xfe400000, 0xe8000000, t32_decode_ldmstm),
78
79 DECODE_END
80};
81
40static const union decode_item t32_table_1111_0xxx___1[] = { 82static const union decode_item t32_table_1111_0xxx___1[] = {
41 /* Branches and miscellaneous control */ 83 /* Branches and miscellaneous control */
42 84
@@ -55,6 +97,12 @@ static const union decode_item t32_table_1111_0xxx___1[] = {
55const union decode_item kprobe_decode_thumb32_table[] = { 97const union decode_item kprobe_decode_thumb32_table[] = {
56 98
57 /* 99 /*
100 * Load/store multiple instructions
101 * 1110 100x x0xx xxxx xxxx xxxx xxxx xxxx
102 */
103 DECODE_TABLE (0xfe400000, 0xe8000000, t32_table_1110_100x_x0xx),
104
105 /*
58 * Branches and miscellaneous control 106 * Branches and miscellaneous control
59 * 1111 0xxx xxxx xxxx 1xxx xxxx xxxx xxxx 107 * 1111 0xxx xxxx xxxx 1xxx xxxx xxxx xxxx
60 */ 108 */