diff options
author | Jon Medhurst <tixy@yxit.co.uk> | 2011-07-07 03:59:32 -0400 |
---|---|---|
committer | Tixy <tixy@medhuaa1.miniserver.com> | 2011-07-13 13:32:45 -0400 |
commit | eaf1d06500c48109dcd37b7856773fdf608a8d21 (patch) | |
tree | 10edef588520e879f2c7992ab82d15591696ce58 /arch/arm/kernel/kprobes-thumb.c | |
parent | 3d4a99785abee0687f8fad9a055d2f0c61a9dd57 (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.c | 48 |
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 | ||
40 | static enum kprobe_insn __kprobes | ||
41 | t32_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 | |||
53 | static 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 | |||
40 | static const union decode_item t32_table_1111_0xxx___1[] = { | 82 | static 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[] = { | |||
55 | const union decode_item kprobe_decode_thumb32_table[] = { | 97 | const 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 | */ |