Branch data Line data Source code
1 : : /*
2 : : * arch/arm/kernel/probes-thumb.c
3 : : *
4 : : * Copyright (C) 2011 Jon Medhurst <tixy@yxit.co.uk>.
5 : : *
6 : : * This program is free software; you can redistribute it and/or modify
7 : : * it under the terms of the GNU General Public License version 2 as
8 : : * published by the Free Software Foundation.
9 : : */
10 : :
11 : : #include <linux/stddef.h>
12 : : #include <linux/kernel.h>
13 : : #include <linux/module.h>
14 : :
15 : : #include "probes.h"
16 : : #include "probes-thumb.h"
17 : :
18 : :
19 : : static const union decode_item t32_table_1110_100x_x0xx[] = {
20 : : /* Load/store multiple instructions */
21 : :
22 : : /* Rn is PC 1110 100x x0xx 1111 xxxx xxxx xxxx xxxx */
23 : : DECODE_REJECT (0xfe4f0000, 0xe80f0000),
24 : :
25 : : /* SRS 1110 1000 00x0 xxxx xxxx xxxx xxxx xxxx */
26 : : /* RFE 1110 1000 00x1 xxxx xxxx xxxx xxxx xxxx */
27 : : DECODE_REJECT (0xffc00000, 0xe8000000),
28 : : /* SRS 1110 1001 10x0 xxxx xxxx xxxx xxxx xxxx */
29 : : /* RFE 1110 1001 10x1 xxxx xxxx xxxx xxxx xxxx */
30 : : DECODE_REJECT (0xffc00000, 0xe9800000),
31 : :
32 : : /* STM Rn, {...pc} 1110 100x x0x0 xxxx 1xxx xxxx xxxx xxxx */
33 : : DECODE_REJECT (0xfe508000, 0xe8008000),
34 : : /* LDM Rn, {...lr,pc} 1110 100x x0x1 xxxx 11xx xxxx xxxx xxxx */
35 : : DECODE_REJECT (0xfe50c000, 0xe810c000),
36 : : /* LDM/STM Rn, {...sp} 1110 100x x0xx xxxx xx1x xxxx xxxx xxxx */
37 : : DECODE_REJECT (0xfe402000, 0xe8002000),
38 : :
39 : : /* STMIA 1110 1000 10x0 xxxx xxxx xxxx xxxx xxxx */
40 : : /* LDMIA 1110 1000 10x1 xxxx xxxx xxxx xxxx xxxx */
41 : : /* STMDB 1110 1001 00x0 xxxx xxxx xxxx xxxx xxxx */
42 : : /* LDMDB 1110 1001 00x1 xxxx xxxx xxxx xxxx xxxx */
43 : : DECODE_CUSTOM (0xfe400000, 0xe8000000, PROBES_T32_LDMSTM),
44 : :
45 : : DECODE_END
46 : : };
47 : :
48 : : static const union decode_item t32_table_1110_100x_x1xx[] = {
49 : : /* Load/store dual, load/store exclusive, table branch */
50 : :
51 : : /* STRD (immediate) 1110 1000 x110 xxxx xxxx xxxx xxxx xxxx */
52 : : /* LDRD (immediate) 1110 1000 x111 xxxx xxxx xxxx xxxx xxxx */
53 : : DECODE_OR (0xff600000, 0xe8600000),
54 : : /* STRD (immediate) 1110 1001 x1x0 xxxx xxxx xxxx xxxx xxxx */
55 : : /* LDRD (immediate) 1110 1001 x1x1 xxxx xxxx xxxx xxxx xxxx */
56 : : DECODE_EMULATEX (0xff400000, 0xe9400000, PROBES_T32_LDRDSTRD,
57 : : REGS(NOPCWB, NOSPPC, NOSPPC, 0, 0)),
58 : :
59 : : /* TBB 1110 1000 1101 xxxx xxxx xxxx 0000 xxxx */
60 : : /* TBH 1110 1000 1101 xxxx xxxx xxxx 0001 xxxx */
61 : : DECODE_SIMULATEX(0xfff000e0, 0xe8d00000, PROBES_T32_TABLE_BRANCH,
62 : : REGS(NOSP, 0, 0, 0, NOSPPC)),
63 : :
64 : : /* STREX 1110 1000 0100 xxxx xxxx xxxx xxxx xxxx */
65 : : /* LDREX 1110 1000 0101 xxxx xxxx xxxx xxxx xxxx */
66 : : /* STREXB 1110 1000 1100 xxxx xxxx xxxx 0100 xxxx */
67 : : /* STREXH 1110 1000 1100 xxxx xxxx xxxx 0101 xxxx */
68 : : /* STREXD 1110 1000 1100 xxxx xxxx xxxx 0111 xxxx */
69 : : /* LDREXB 1110 1000 1101 xxxx xxxx xxxx 0100 xxxx */
70 : : /* LDREXH 1110 1000 1101 xxxx xxxx xxxx 0101 xxxx */
71 : : /* LDREXD 1110 1000 1101 xxxx xxxx xxxx 0111 xxxx */
72 : : /* And unallocated instructions... */
73 : : DECODE_END
74 : : };
75 : :
76 : : static const union decode_item t32_table_1110_101x[] = {
77 : : /* Data-processing (shifted register) */
78 : :
79 : : /* TST 1110 1010 0001 xxxx xxxx 1111 xxxx xxxx */
80 : : /* TEQ 1110 1010 1001 xxxx xxxx 1111 xxxx xxxx */
81 : : DECODE_EMULATEX (0xff700f00, 0xea100f00, PROBES_T32_TST,
82 : : REGS(NOSPPC, 0, 0, 0, NOSPPC)),
83 : :
84 : : /* CMN 1110 1011 0001 xxxx xxxx 1111 xxxx xxxx */
85 : : DECODE_OR (0xfff00f00, 0xeb100f00),
86 : : /* CMP 1110 1011 1011 xxxx xxxx 1111 xxxx xxxx */
87 : : DECODE_EMULATEX (0xfff00f00, 0xebb00f00, PROBES_T32_TST,
88 : : REGS(NOPC, 0, 0, 0, NOSPPC)),
89 : :
90 : : /* MOV 1110 1010 010x 1111 xxxx xxxx xxxx xxxx */
91 : : /* MVN 1110 1010 011x 1111 xxxx xxxx xxxx xxxx */
92 : : DECODE_EMULATEX (0xffcf0000, 0xea4f0000, PROBES_T32_MOV,
93 : : REGS(0, 0, NOSPPC, 0, NOSPPC)),
94 : :
95 : : /* ??? 1110 1010 101x xxxx xxxx xxxx xxxx xxxx */
96 : : /* ??? 1110 1010 111x xxxx xxxx xxxx xxxx xxxx */
97 : : DECODE_REJECT (0xffa00000, 0xeaa00000),
98 : : /* ??? 1110 1011 001x xxxx xxxx xxxx xxxx xxxx */
99 : : DECODE_REJECT (0xffe00000, 0xeb200000),
100 : : /* ??? 1110 1011 100x xxxx xxxx xxxx xxxx xxxx */
101 : : DECODE_REJECT (0xffe00000, 0xeb800000),
102 : : /* ??? 1110 1011 111x xxxx xxxx xxxx xxxx xxxx */
103 : : DECODE_REJECT (0xffe00000, 0xebe00000),
104 : :
105 : : /* ADD/SUB SP, SP, Rm, LSL #0..3 */
106 : : /* 1110 1011 x0xx 1101 x000 1101 xx00 xxxx */
107 : : DECODE_EMULATEX (0xff4f7f30, 0xeb0d0d00, PROBES_T32_ADDSUB,
108 : : REGS(SP, 0, SP, 0, NOSPPC)),
109 : :
110 : : /* ADD/SUB SP, SP, Rm, shift */
111 : : /* 1110 1011 x0xx 1101 xxxx 1101 xxxx xxxx */
112 : : DECODE_REJECT (0xff4f0f00, 0xeb0d0d00),
113 : :
114 : : /* ADD/SUB Rd, SP, Rm, shift */
115 : : /* 1110 1011 x0xx 1101 xxxx xxxx xxxx xxxx */
116 : : DECODE_EMULATEX (0xff4f0000, 0xeb0d0000, PROBES_T32_ADDSUB,
117 : : REGS(SP, 0, NOPC, 0, NOSPPC)),
118 : :
119 : : /* AND 1110 1010 000x xxxx xxxx xxxx xxxx xxxx */
120 : : /* BIC 1110 1010 001x xxxx xxxx xxxx xxxx xxxx */
121 : : /* ORR 1110 1010 010x xxxx xxxx xxxx xxxx xxxx */
122 : : /* ORN 1110 1010 011x xxxx xxxx xxxx xxxx xxxx */
123 : : /* EOR 1110 1010 100x xxxx xxxx xxxx xxxx xxxx */
124 : : /* PKH 1110 1010 110x xxxx xxxx xxxx xxxx xxxx */
125 : : /* ADD 1110 1011 000x xxxx xxxx xxxx xxxx xxxx */
126 : : /* ADC 1110 1011 010x xxxx xxxx xxxx xxxx xxxx */
127 : : /* SBC 1110 1011 011x xxxx xxxx xxxx xxxx xxxx */
128 : : /* SUB 1110 1011 101x xxxx xxxx xxxx xxxx xxxx */
129 : : /* RSB 1110 1011 110x xxxx xxxx xxxx xxxx xxxx */
130 : : DECODE_EMULATEX (0xfe000000, 0xea000000, PROBES_T32_LOGICAL,
131 : : REGS(NOSPPC, 0, NOSPPC, 0, NOSPPC)),
132 : :
133 : : DECODE_END
134 : : };
135 : :
136 : : static const union decode_item t32_table_1111_0x0x___0[] = {
137 : : /* Data-processing (modified immediate) */
138 : :
139 : : /* TST 1111 0x00 0001 xxxx 0xxx 1111 xxxx xxxx */
140 : : /* TEQ 1111 0x00 1001 xxxx 0xxx 1111 xxxx xxxx */
141 : : DECODE_EMULATEX (0xfb708f00, 0xf0100f00, PROBES_T32_TST,
142 : : REGS(NOSPPC, 0, 0, 0, 0)),
143 : :
144 : : /* CMN 1111 0x01 0001 xxxx 0xxx 1111 xxxx xxxx */
145 : : DECODE_OR (0xfbf08f00, 0xf1100f00),
146 : : /* CMP 1111 0x01 1011 xxxx 0xxx 1111 xxxx xxxx */
147 : : DECODE_EMULATEX (0xfbf08f00, 0xf1b00f00, PROBES_T32_CMP,
148 : : REGS(NOPC, 0, 0, 0, 0)),
149 : :
150 : : /* MOV 1111 0x00 010x 1111 0xxx xxxx xxxx xxxx */
151 : : /* MVN 1111 0x00 011x 1111 0xxx xxxx xxxx xxxx */
152 : : DECODE_EMULATEX (0xfbcf8000, 0xf04f0000, PROBES_T32_MOV,
153 : : REGS(0, 0, NOSPPC, 0, 0)),
154 : :
155 : : /* ??? 1111 0x00 101x xxxx 0xxx xxxx xxxx xxxx */
156 : : DECODE_REJECT (0xfbe08000, 0xf0a00000),
157 : : /* ??? 1111 0x00 110x xxxx 0xxx xxxx xxxx xxxx */
158 : : /* ??? 1111 0x00 111x xxxx 0xxx xxxx xxxx xxxx */
159 : : DECODE_REJECT (0xfbc08000, 0xf0c00000),
160 : : /* ??? 1111 0x01 001x xxxx 0xxx xxxx xxxx xxxx */
161 : : DECODE_REJECT (0xfbe08000, 0xf1200000),
162 : : /* ??? 1111 0x01 100x xxxx 0xxx xxxx xxxx xxxx */
163 : : DECODE_REJECT (0xfbe08000, 0xf1800000),
164 : : /* ??? 1111 0x01 111x xxxx 0xxx xxxx xxxx xxxx */
165 : : DECODE_REJECT (0xfbe08000, 0xf1e00000),
166 : :
167 : : /* ADD Rd, SP, #imm 1111 0x01 000x 1101 0xxx xxxx xxxx xxxx */
168 : : /* SUB Rd, SP, #imm 1111 0x01 101x 1101 0xxx xxxx xxxx xxxx */
169 : : DECODE_EMULATEX (0xfb4f8000, 0xf10d0000, PROBES_T32_ADDSUB,
170 : : REGS(SP, 0, NOPC, 0, 0)),
171 : :
172 : : /* AND 1111 0x00 000x xxxx 0xxx xxxx xxxx xxxx */
173 : : /* BIC 1111 0x00 001x xxxx 0xxx xxxx xxxx xxxx */
174 : : /* ORR 1111 0x00 010x xxxx 0xxx xxxx xxxx xxxx */
175 : : /* ORN 1111 0x00 011x xxxx 0xxx xxxx xxxx xxxx */
176 : : /* EOR 1111 0x00 100x xxxx 0xxx xxxx xxxx xxxx */
177 : : /* ADD 1111 0x01 000x xxxx 0xxx xxxx xxxx xxxx */
178 : : /* ADC 1111 0x01 010x xxxx 0xxx xxxx xxxx xxxx */
179 : : /* SBC 1111 0x01 011x xxxx 0xxx xxxx xxxx xxxx */
180 : : /* SUB 1111 0x01 101x xxxx 0xxx xxxx xxxx xxxx */
181 : : /* RSB 1111 0x01 110x xxxx 0xxx xxxx xxxx xxxx */
182 : : DECODE_EMULATEX (0xfa008000, 0xf0000000, PROBES_T32_LOGICAL,
183 : : REGS(NOSPPC, 0, NOSPPC, 0, 0)),
184 : :
185 : : DECODE_END
186 : : };
187 : :
188 : : static const union decode_item t32_table_1111_0x1x___0[] = {
189 : : /* Data-processing (plain binary immediate) */
190 : :
191 : : /* ADDW Rd, PC, #imm 1111 0x10 0000 1111 0xxx xxxx xxxx xxxx */
192 : : DECODE_OR (0xfbff8000, 0xf20f0000),
193 : : /* SUBW Rd, PC, #imm 1111 0x10 1010 1111 0xxx xxxx xxxx xxxx */
194 : : DECODE_EMULATEX (0xfbff8000, 0xf2af0000, PROBES_T32_ADDWSUBW_PC,
195 : : REGS(PC, 0, NOSPPC, 0, 0)),
196 : :
197 : : /* ADDW SP, SP, #imm 1111 0x10 0000 1101 0xxx 1101 xxxx xxxx */
198 : : DECODE_OR (0xfbff8f00, 0xf20d0d00),
199 : : /* SUBW SP, SP, #imm 1111 0x10 1010 1101 0xxx 1101 xxxx xxxx */
200 : : DECODE_EMULATEX (0xfbff8f00, 0xf2ad0d00, PROBES_T32_ADDWSUBW,
201 : : REGS(SP, 0, SP, 0, 0)),
202 : :
203 : : /* ADDW 1111 0x10 0000 xxxx 0xxx xxxx xxxx xxxx */
204 : : DECODE_OR (0xfbf08000, 0xf2000000),
205 : : /* SUBW 1111 0x10 1010 xxxx 0xxx xxxx xxxx xxxx */
206 : : DECODE_EMULATEX (0xfbf08000, 0xf2a00000, PROBES_T32_ADDWSUBW,
207 : : REGS(NOPCX, 0, NOSPPC, 0, 0)),
208 : :
209 : : /* MOVW 1111 0x10 0100 xxxx 0xxx xxxx xxxx xxxx */
210 : : /* MOVT 1111 0x10 1100 xxxx 0xxx xxxx xxxx xxxx */
211 : : DECODE_EMULATEX (0xfb708000, 0xf2400000, PROBES_T32_MOVW,
212 : : REGS(0, 0, NOSPPC, 0, 0)),
213 : :
214 : : /* SSAT16 1111 0x11 0010 xxxx 0000 xxxx 00xx xxxx */
215 : : /* SSAT 1111 0x11 00x0 xxxx 0xxx xxxx xxxx xxxx */
216 : : /* USAT16 1111 0x11 1010 xxxx 0000 xxxx 00xx xxxx */
217 : : /* USAT 1111 0x11 10x0 xxxx 0xxx xxxx xxxx xxxx */
218 : : DECODE_EMULATEX (0xfb508000, 0xf3000000, PROBES_T32_SAT,
219 : : REGS(NOSPPC, 0, NOSPPC, 0, 0)),
220 : :
221 : : /* SFBX 1111 0x11 0100 xxxx 0xxx xxxx xxxx xxxx */
222 : : /* UFBX 1111 0x11 1100 xxxx 0xxx xxxx xxxx xxxx */
223 : : DECODE_EMULATEX (0xfb708000, 0xf3400000, PROBES_T32_BITFIELD,
224 : : REGS(NOSPPC, 0, NOSPPC, 0, 0)),
225 : :
226 : : /* BFC 1111 0x11 0110 1111 0xxx xxxx xxxx xxxx */
227 : : DECODE_EMULATEX (0xfbff8000, 0xf36f0000, PROBES_T32_BITFIELD,
228 : : REGS(0, 0, NOSPPC, 0, 0)),
229 : :
230 : : /* BFI 1111 0x11 0110 xxxx 0xxx xxxx xxxx xxxx */
231 : : DECODE_EMULATEX (0xfbf08000, 0xf3600000, PROBES_T32_BITFIELD,
232 : : REGS(NOSPPCX, 0, NOSPPC, 0, 0)),
233 : :
234 : : DECODE_END
235 : : };
236 : :
237 : : static const union decode_item t32_table_1111_0xxx___1[] = {
238 : : /* Branches and miscellaneous control */
239 : :
240 : : /* YIELD 1111 0011 1010 xxxx 10x0 x000 0000 0001 */
241 : : DECODE_OR (0xfff0d7ff, 0xf3a08001),
242 : : /* SEV 1111 0011 1010 xxxx 10x0 x000 0000 0100 */
243 : : DECODE_EMULATE (0xfff0d7ff, 0xf3a08004, PROBES_T32_SEV),
244 : : /* NOP 1111 0011 1010 xxxx 10x0 x000 0000 0000 */
245 : : /* WFE 1111 0011 1010 xxxx 10x0 x000 0000 0010 */
246 : : /* WFI 1111 0011 1010 xxxx 10x0 x000 0000 0011 */
247 : : DECODE_SIMULATE (0xfff0d7fc, 0xf3a08000, PROBES_T32_WFE),
248 : :
249 : : /* MRS Rd, CPSR 1111 0011 1110 xxxx 10x0 xxxx xxxx xxxx */
250 : : DECODE_SIMULATEX(0xfff0d000, 0xf3e08000, PROBES_T32_MRS,
251 : : REGS(0, 0, NOSPPC, 0, 0)),
252 : :
253 : : /*
254 : : * Unsupported instructions
255 : : * 1111 0x11 1xxx xxxx 10x0 xxxx xxxx xxxx
256 : : *
257 : : * MSR 1111 0011 100x xxxx 10x0 xxxx xxxx xxxx
258 : : * DBG hint 1111 0011 1010 xxxx 10x0 x000 1111 xxxx
259 : : * Unallocated hints 1111 0011 1010 xxxx 10x0 x000 xxxx xxxx
260 : : * CPS 1111 0011 1010 xxxx 10x0 xxxx xxxx xxxx
261 : : * CLREX/DSB/DMB/ISB 1111 0011 1011 xxxx 10x0 xxxx xxxx xxxx
262 : : * BXJ 1111 0011 1100 xxxx 10x0 xxxx xxxx xxxx
263 : : * SUBS PC,LR,#<imm8> 1111 0011 1101 xxxx 10x0 xxxx xxxx xxxx
264 : : * MRS Rd, SPSR 1111 0011 1111 xxxx 10x0 xxxx xxxx xxxx
265 : : * SMC 1111 0111 1111 xxxx 1000 xxxx xxxx xxxx
266 : : * UNDEFINED 1111 0111 1111 xxxx 1010 xxxx xxxx xxxx
267 : : * ??? 1111 0111 1xxx xxxx 1010 xxxx xxxx xxxx
268 : : */
269 : : DECODE_REJECT (0xfb80d000, 0xf3808000),
270 : :
271 : : /* Bcc 1111 0xxx xxxx xxxx 10x0 xxxx xxxx xxxx */
272 : : DECODE_CUSTOM (0xf800d000, 0xf0008000, PROBES_T32_BRANCH_COND),
273 : :
274 : : /* BLX 1111 0xxx xxxx xxxx 11x0 xxxx xxxx xxx0 */
275 : : DECODE_OR (0xf800d001, 0xf000c000),
276 : : /* B 1111 0xxx xxxx xxxx 10x1 xxxx xxxx xxxx */
277 : : /* BL 1111 0xxx xxxx xxxx 11x1 xxxx xxxx xxxx */
278 : : DECODE_SIMULATE (0xf8009000, 0xf0009000, PROBES_T32_BRANCH),
279 : :
280 : : DECODE_END
281 : : };
282 : :
283 : : static const union decode_item t32_table_1111_100x_x0x1__1111[] = {
284 : : /* Memory hints */
285 : :
286 : : /* PLD (literal) 1111 1000 x001 1111 1111 xxxx xxxx xxxx */
287 : : /* PLI (literal) 1111 1001 x001 1111 1111 xxxx xxxx xxxx */
288 : : DECODE_SIMULATE (0xfe7ff000, 0xf81ff000, PROBES_T32_PLDI),
289 : :
290 : : /* PLD{W} (immediate) 1111 1000 10x1 xxxx 1111 xxxx xxxx xxxx */
291 : : DECODE_OR (0xffd0f000, 0xf890f000),
292 : : /* PLD{W} (immediate) 1111 1000 00x1 xxxx 1111 1100 xxxx xxxx */
293 : : DECODE_OR (0xffd0ff00, 0xf810fc00),
294 : : /* PLI (immediate) 1111 1001 1001 xxxx 1111 xxxx xxxx xxxx */
295 : : DECODE_OR (0xfff0f000, 0xf990f000),
296 : : /* PLI (immediate) 1111 1001 0001 xxxx 1111 1100 xxxx xxxx */
297 : : DECODE_SIMULATEX(0xfff0ff00, 0xf910fc00, PROBES_T32_PLDI,
298 : : REGS(NOPCX, 0, 0, 0, 0)),
299 : :
300 : : /* PLD{W} (register) 1111 1000 00x1 xxxx 1111 0000 00xx xxxx */
301 : : DECODE_OR (0xffd0ffc0, 0xf810f000),
302 : : /* PLI (register) 1111 1001 0001 xxxx 1111 0000 00xx xxxx */
303 : : DECODE_SIMULATEX(0xfff0ffc0, 0xf910f000, PROBES_T32_PLDI,
304 : : REGS(NOPCX, 0, 0, 0, NOSPPC)),
305 : :
306 : : /* Other unallocated instructions... */
307 : : DECODE_END
308 : : };
309 : :
310 : : static const union decode_item t32_table_1111_100x[] = {
311 : : /* Store/Load single data item */
312 : :
313 : : /* ??? 1111 100x x11x xxxx xxxx xxxx xxxx xxxx */
314 : : DECODE_REJECT (0xfe600000, 0xf8600000),
315 : :
316 : : /* ??? 1111 1001 0101 xxxx xxxx xxxx xxxx xxxx */
317 : : DECODE_REJECT (0xfff00000, 0xf9500000),
318 : :
319 : : /* ??? 1111 100x 0xxx xxxx xxxx 10x0 xxxx xxxx */
320 : : DECODE_REJECT (0xfe800d00, 0xf8000800),
321 : :
322 : : /* STRBT 1111 1000 0000 xxxx xxxx 1110 xxxx xxxx */
323 : : /* STRHT 1111 1000 0010 xxxx xxxx 1110 xxxx xxxx */
324 : : /* STRT 1111 1000 0100 xxxx xxxx 1110 xxxx xxxx */
325 : : /* LDRBT 1111 1000 0001 xxxx xxxx 1110 xxxx xxxx */
326 : : /* LDRSBT 1111 1001 0001 xxxx xxxx 1110 xxxx xxxx */
327 : : /* LDRHT 1111 1000 0011 xxxx xxxx 1110 xxxx xxxx */
328 : : /* LDRSHT 1111 1001 0011 xxxx xxxx 1110 xxxx xxxx */
329 : : /* LDRT 1111 1000 0101 xxxx xxxx 1110 xxxx xxxx */
330 : : DECODE_REJECT (0xfe800f00, 0xf8000e00),
331 : :
332 : : /* STR{,B,H} Rn,[PC...] 1111 1000 xxx0 1111 xxxx xxxx xxxx xxxx */
333 : : DECODE_REJECT (0xff1f0000, 0xf80f0000),
334 : :
335 : : /* STR{,B,H} PC,[Rn...] 1111 1000 xxx0 xxxx 1111 xxxx xxxx xxxx */
336 : : DECODE_REJECT (0xff10f000, 0xf800f000),
337 : :
338 : : /* LDR (literal) 1111 1000 x101 1111 xxxx xxxx xxxx xxxx */
339 : : DECODE_SIMULATEX(0xff7f0000, 0xf85f0000, PROBES_T32_LDR_LIT,
340 : : REGS(PC, ANY, 0, 0, 0)),
341 : :
342 : : /* STR (immediate) 1111 1000 0100 xxxx xxxx 1xxx xxxx xxxx */
343 : : /* LDR (immediate) 1111 1000 0101 xxxx xxxx 1xxx xxxx xxxx */
344 : : DECODE_OR (0xffe00800, 0xf8400800),
345 : : /* STR (immediate) 1111 1000 1100 xxxx xxxx xxxx xxxx xxxx */
346 : : /* LDR (immediate) 1111 1000 1101 xxxx xxxx xxxx xxxx xxxx */
347 : : DECODE_EMULATEX (0xffe00000, 0xf8c00000, PROBES_T32_LDRSTR,
348 : : REGS(NOPCX, ANY, 0, 0, 0)),
349 : :
350 : : /* STR (register) 1111 1000 0100 xxxx xxxx 0000 00xx xxxx */
351 : : /* LDR (register) 1111 1000 0101 xxxx xxxx 0000 00xx xxxx */
352 : : DECODE_EMULATEX (0xffe00fc0, 0xf8400000, PROBES_T32_LDRSTR,
353 : : REGS(NOPCX, ANY, 0, 0, NOSPPC)),
354 : :
355 : : /* LDRB (literal) 1111 1000 x001 1111 xxxx xxxx xxxx xxxx */
356 : : /* LDRSB (literal) 1111 1001 x001 1111 xxxx xxxx xxxx xxxx */
357 : : /* LDRH (literal) 1111 1000 x011 1111 xxxx xxxx xxxx xxxx */
358 : : /* LDRSH (literal) 1111 1001 x011 1111 xxxx xxxx xxxx xxxx */
359 : : DECODE_SIMULATEX(0xfe5f0000, 0xf81f0000, PROBES_T32_LDR_LIT,
360 : : REGS(PC, NOSPPCX, 0, 0, 0)),
361 : :
362 : : /* STRB (immediate) 1111 1000 0000 xxxx xxxx 1xxx xxxx xxxx */
363 : : /* STRH (immediate) 1111 1000 0010 xxxx xxxx 1xxx xxxx xxxx */
364 : : /* LDRB (immediate) 1111 1000 0001 xxxx xxxx 1xxx xxxx xxxx */
365 : : /* LDRSB (immediate) 1111 1001 0001 xxxx xxxx 1xxx xxxx xxxx */
366 : : /* LDRH (immediate) 1111 1000 0011 xxxx xxxx 1xxx xxxx xxxx */
367 : : /* LDRSH (immediate) 1111 1001 0011 xxxx xxxx 1xxx xxxx xxxx */
368 : : DECODE_OR (0xfec00800, 0xf8000800),
369 : : /* STRB (immediate) 1111 1000 1000 xxxx xxxx xxxx xxxx xxxx */
370 : : /* STRH (immediate) 1111 1000 1010 xxxx xxxx xxxx xxxx xxxx */
371 : : /* LDRB (immediate) 1111 1000 1001 xxxx xxxx xxxx xxxx xxxx */
372 : : /* LDRSB (immediate) 1111 1001 1001 xxxx xxxx xxxx xxxx xxxx */
373 : : /* LDRH (immediate) 1111 1000 1011 xxxx xxxx xxxx xxxx xxxx */
374 : : /* LDRSH (immediate) 1111 1001 1011 xxxx xxxx xxxx xxxx xxxx */
375 : : DECODE_EMULATEX (0xfec00000, 0xf8800000, PROBES_T32_LDRSTR,
376 : : REGS(NOPCX, NOSPPCX, 0, 0, 0)),
377 : :
378 : : /* STRB (register) 1111 1000 0000 xxxx xxxx 0000 00xx xxxx */
379 : : /* STRH (register) 1111 1000 0010 xxxx xxxx 0000 00xx xxxx */
380 : : /* LDRB (register) 1111 1000 0001 xxxx xxxx 0000 00xx xxxx */
381 : : /* LDRSB (register) 1111 1001 0001 xxxx xxxx 0000 00xx xxxx */
382 : : /* LDRH (register) 1111 1000 0011 xxxx xxxx 0000 00xx xxxx */
383 : : /* LDRSH (register) 1111 1001 0011 xxxx xxxx 0000 00xx xxxx */
384 : : DECODE_EMULATEX (0xfe800fc0, 0xf8000000, PROBES_T32_LDRSTR,
385 : : REGS(NOPCX, NOSPPCX, 0, 0, NOSPPC)),
386 : :
387 : : /* Other unallocated instructions... */
388 : : DECODE_END
389 : : };
390 : :
391 : : static const union decode_item t32_table_1111_1010___1111[] = {
392 : : /* Data-processing (register) */
393 : :
394 : : /* ??? 1111 1010 011x xxxx 1111 xxxx 1xxx xxxx */
395 : : DECODE_REJECT (0xffe0f080, 0xfa60f080),
396 : :
397 : : /* SXTH 1111 1010 0000 1111 1111 xxxx 1xxx xxxx */
398 : : /* UXTH 1111 1010 0001 1111 1111 xxxx 1xxx xxxx */
399 : : /* SXTB16 1111 1010 0010 1111 1111 xxxx 1xxx xxxx */
400 : : /* UXTB16 1111 1010 0011 1111 1111 xxxx 1xxx xxxx */
401 : : /* SXTB 1111 1010 0100 1111 1111 xxxx 1xxx xxxx */
402 : : /* UXTB 1111 1010 0101 1111 1111 xxxx 1xxx xxxx */
403 : : DECODE_EMULATEX (0xff8ff080, 0xfa0ff080, PROBES_T32_SIGN_EXTEND,
404 : : REGS(0, 0, NOSPPC, 0, NOSPPC)),
405 : :
406 : :
407 : : /* ??? 1111 1010 1xxx xxxx 1111 xxxx 0x11 xxxx */
408 : : DECODE_REJECT (0xff80f0b0, 0xfa80f030),
409 : : /* ??? 1111 1010 1x11 xxxx 1111 xxxx 0xxx xxxx */
410 : : DECODE_REJECT (0xffb0f080, 0xfab0f000),
411 : :
412 : : /* SADD16 1111 1010 1001 xxxx 1111 xxxx 0000 xxxx */
413 : : /* SASX 1111 1010 1010 xxxx 1111 xxxx 0000 xxxx */
414 : : /* SSAX 1111 1010 1110 xxxx 1111 xxxx 0000 xxxx */
415 : : /* SSUB16 1111 1010 1101 xxxx 1111 xxxx 0000 xxxx */
416 : : /* SADD8 1111 1010 1000 xxxx 1111 xxxx 0000 xxxx */
417 : : /* SSUB8 1111 1010 1100 xxxx 1111 xxxx 0000 xxxx */
418 : :
419 : : /* QADD16 1111 1010 1001 xxxx 1111 xxxx 0001 xxxx */
420 : : /* QASX 1111 1010 1010 xxxx 1111 xxxx 0001 xxxx */
421 : : /* QSAX 1111 1010 1110 xxxx 1111 xxxx 0001 xxxx */
422 : : /* QSUB16 1111 1010 1101 xxxx 1111 xxxx 0001 xxxx */
423 : : /* QADD8 1111 1010 1000 xxxx 1111 xxxx 0001 xxxx */
424 : : /* QSUB8 1111 1010 1100 xxxx 1111 xxxx 0001 xxxx */
425 : :
426 : : /* SHADD16 1111 1010 1001 xxxx 1111 xxxx 0010 xxxx */
427 : : /* SHASX 1111 1010 1010 xxxx 1111 xxxx 0010 xxxx */
428 : : /* SHSAX 1111 1010 1110 xxxx 1111 xxxx 0010 xxxx */
429 : : /* SHSUB16 1111 1010 1101 xxxx 1111 xxxx 0010 xxxx */
430 : : /* SHADD8 1111 1010 1000 xxxx 1111 xxxx 0010 xxxx */
431 : : /* SHSUB8 1111 1010 1100 xxxx 1111 xxxx 0010 xxxx */
432 : :
433 : : /* UADD16 1111 1010 1001 xxxx 1111 xxxx 0100 xxxx */
434 : : /* UASX 1111 1010 1010 xxxx 1111 xxxx 0100 xxxx */
435 : : /* USAX 1111 1010 1110 xxxx 1111 xxxx 0100 xxxx */
436 : : /* USUB16 1111 1010 1101 xxxx 1111 xxxx 0100 xxxx */
437 : : /* UADD8 1111 1010 1000 xxxx 1111 xxxx 0100 xxxx */
438 : : /* USUB8 1111 1010 1100 xxxx 1111 xxxx 0100 xxxx */
439 : :
440 : : /* UQADD16 1111 1010 1001 xxxx 1111 xxxx 0101 xxxx */
441 : : /* UQASX 1111 1010 1010 xxxx 1111 xxxx 0101 xxxx */
442 : : /* UQSAX 1111 1010 1110 xxxx 1111 xxxx 0101 xxxx */
443 : : /* UQSUB16 1111 1010 1101 xxxx 1111 xxxx 0101 xxxx */
444 : : /* UQADD8 1111 1010 1000 xxxx 1111 xxxx 0101 xxxx */
445 : : /* UQSUB8 1111 1010 1100 xxxx 1111 xxxx 0101 xxxx */
446 : :
447 : : /* UHADD16 1111 1010 1001 xxxx 1111 xxxx 0110 xxxx */
448 : : /* UHASX 1111 1010 1010 xxxx 1111 xxxx 0110 xxxx */
449 : : /* UHSAX 1111 1010 1110 xxxx 1111 xxxx 0110 xxxx */
450 : : /* UHSUB16 1111 1010 1101 xxxx 1111 xxxx 0110 xxxx */
451 : : /* UHADD8 1111 1010 1000 xxxx 1111 xxxx 0110 xxxx */
452 : : /* UHSUB8 1111 1010 1100 xxxx 1111 xxxx 0110 xxxx */
453 : : DECODE_OR (0xff80f080, 0xfa80f000),
454 : :
455 : : /* SXTAH 1111 1010 0000 xxxx 1111 xxxx 1xxx xxxx */
456 : : /* UXTAH 1111 1010 0001 xxxx 1111 xxxx 1xxx xxxx */
457 : : /* SXTAB16 1111 1010 0010 xxxx 1111 xxxx 1xxx xxxx */
458 : : /* UXTAB16 1111 1010 0011 xxxx 1111 xxxx 1xxx xxxx */
459 : : /* SXTAB 1111 1010 0100 xxxx 1111 xxxx 1xxx xxxx */
460 : : /* UXTAB 1111 1010 0101 xxxx 1111 xxxx 1xxx xxxx */
461 : : DECODE_OR (0xff80f080, 0xfa00f080),
462 : :
463 : : /* QADD 1111 1010 1000 xxxx 1111 xxxx 1000 xxxx */
464 : : /* QDADD 1111 1010 1000 xxxx 1111 xxxx 1001 xxxx */
465 : : /* QSUB 1111 1010 1000 xxxx 1111 xxxx 1010 xxxx */
466 : : /* QDSUB 1111 1010 1000 xxxx 1111 xxxx 1011 xxxx */
467 : : DECODE_OR (0xfff0f0c0, 0xfa80f080),
468 : :
469 : : /* SEL 1111 1010 1010 xxxx 1111 xxxx 1000 xxxx */
470 : : DECODE_OR (0xfff0f0f0, 0xfaa0f080),
471 : :
472 : : /* LSL 1111 1010 000x xxxx 1111 xxxx 0000 xxxx */
473 : : /* LSR 1111 1010 001x xxxx 1111 xxxx 0000 xxxx */
474 : : /* ASR 1111 1010 010x xxxx 1111 xxxx 0000 xxxx */
475 : : /* ROR 1111 1010 011x xxxx 1111 xxxx 0000 xxxx */
476 : : DECODE_EMULATEX (0xff80f0f0, 0xfa00f000, PROBES_T32_MEDIA,
477 : : REGS(NOSPPC, 0, NOSPPC, 0, NOSPPC)),
478 : :
479 : : /* CLZ 1111 1010 1010 xxxx 1111 xxxx 1000 xxxx */
480 : : DECODE_OR (0xfff0f0f0, 0xfab0f080),
481 : :
482 : : /* REV 1111 1010 1001 xxxx 1111 xxxx 1000 xxxx */
483 : : /* REV16 1111 1010 1001 xxxx 1111 xxxx 1001 xxxx */
484 : : /* RBIT 1111 1010 1001 xxxx 1111 xxxx 1010 xxxx */
485 : : /* REVSH 1111 1010 1001 xxxx 1111 xxxx 1011 xxxx */
486 : : DECODE_EMULATEX (0xfff0f0c0, 0xfa90f080, PROBES_T32_REVERSE,
487 : : REGS(NOSPPC, 0, NOSPPC, 0, SAMEAS16)),
488 : :
489 : : /* Other unallocated instructions... */
490 : : DECODE_END
491 : : };
492 : :
493 : : static const union decode_item t32_table_1111_1011_0[] = {
494 : : /* Multiply, multiply accumulate, and absolute difference */
495 : :
496 : : /* ??? 1111 1011 0000 xxxx 1111 xxxx 0001 xxxx */
497 : : DECODE_REJECT (0xfff0f0f0, 0xfb00f010),
498 : : /* ??? 1111 1011 0111 xxxx 1111 xxxx 0001 xxxx */
499 : : DECODE_REJECT (0xfff0f0f0, 0xfb70f010),
500 : :
501 : : /* SMULxy 1111 1011 0001 xxxx 1111 xxxx 00xx xxxx */
502 : : DECODE_OR (0xfff0f0c0, 0xfb10f000),
503 : : /* MUL 1111 1011 0000 xxxx 1111 xxxx 0000 xxxx */
504 : : /* SMUAD{X} 1111 1011 0010 xxxx 1111 xxxx 000x xxxx */
505 : : /* SMULWy 1111 1011 0011 xxxx 1111 xxxx 000x xxxx */
506 : : /* SMUSD{X} 1111 1011 0100 xxxx 1111 xxxx 000x xxxx */
507 : : /* SMMUL{R} 1111 1011 0101 xxxx 1111 xxxx 000x xxxx */
508 : : /* USAD8 1111 1011 0111 xxxx 1111 xxxx 0000 xxxx */
509 : : DECODE_EMULATEX (0xff80f0e0, 0xfb00f000, PROBES_T32_MUL_ADD,
510 : : REGS(NOSPPC, 0, NOSPPC, 0, NOSPPC)),
511 : :
512 : : /* ??? 1111 1011 0111 xxxx xxxx xxxx 0001 xxxx */
513 : : DECODE_REJECT (0xfff000f0, 0xfb700010),
514 : :
515 : : /* SMLAxy 1111 1011 0001 xxxx xxxx xxxx 00xx xxxx */
516 : : DECODE_OR (0xfff000c0, 0xfb100000),
517 : : /* MLA 1111 1011 0000 xxxx xxxx xxxx 0000 xxxx */
518 : : /* MLS 1111 1011 0000 xxxx xxxx xxxx 0001 xxxx */
519 : : /* SMLAD{X} 1111 1011 0010 xxxx xxxx xxxx 000x xxxx */
520 : : /* SMLAWy 1111 1011 0011 xxxx xxxx xxxx 000x xxxx */
521 : : /* SMLSD{X} 1111 1011 0100 xxxx xxxx xxxx 000x xxxx */
522 : : /* SMMLA{R} 1111 1011 0101 xxxx xxxx xxxx 000x xxxx */
523 : : /* SMMLS{R} 1111 1011 0110 xxxx xxxx xxxx 000x xxxx */
524 : : /* USADA8 1111 1011 0111 xxxx xxxx xxxx 0000 xxxx */
525 : : DECODE_EMULATEX (0xff8000c0, 0xfb000000, PROBES_T32_MUL_ADD2,
526 : : REGS(NOSPPC, NOSPPCX, NOSPPC, 0, NOSPPC)),
527 : :
528 : : /* Other unallocated instructions... */
529 : : DECODE_END
530 : : };
531 : :
532 : : static const union decode_item t32_table_1111_1011_1[] = {
533 : : /* Long multiply, long multiply accumulate, and divide */
534 : :
535 : : /* UMAAL 1111 1011 1110 xxxx xxxx xxxx 0110 xxxx */
536 : : DECODE_OR (0xfff000f0, 0xfbe00060),
537 : : /* SMLALxy 1111 1011 1100 xxxx xxxx xxxx 10xx xxxx */
538 : : DECODE_OR (0xfff000c0, 0xfbc00080),
539 : : /* SMLALD{X} 1111 1011 1100 xxxx xxxx xxxx 110x xxxx */
540 : : /* SMLSLD{X} 1111 1011 1101 xxxx xxxx xxxx 110x xxxx */
541 : : DECODE_OR (0xffe000e0, 0xfbc000c0),
542 : : /* SMULL 1111 1011 1000 xxxx xxxx xxxx 0000 xxxx */
543 : : /* UMULL 1111 1011 1010 xxxx xxxx xxxx 0000 xxxx */
544 : : /* SMLAL 1111 1011 1100 xxxx xxxx xxxx 0000 xxxx */
545 : : /* UMLAL 1111 1011 1110 xxxx xxxx xxxx 0000 xxxx */
546 : : DECODE_EMULATEX (0xff9000f0, 0xfb800000, PROBES_T32_MUL_ADD_LONG,
547 : : REGS(NOSPPC, NOSPPC, NOSPPC, 0, NOSPPC)),
548 : :
549 : : /* SDIV 1111 1011 1001 xxxx xxxx xxxx 1111 xxxx */
550 : : /* UDIV 1111 1011 1011 xxxx xxxx xxxx 1111 xxxx */
551 : : /* Other unallocated instructions... */
552 : : DECODE_END
553 : : };
554 : :
555 : : const union decode_item probes_decode_thumb32_table[] = {
556 : :
557 : : /*
558 : : * Load/store multiple instructions
559 : : * 1110 100x x0xx xxxx xxxx xxxx xxxx xxxx
560 : : */
561 : : DECODE_TABLE (0xfe400000, 0xe8000000, t32_table_1110_100x_x0xx),
562 : :
563 : : /*
564 : : * Load/store dual, load/store exclusive, table branch
565 : : * 1110 100x x1xx xxxx xxxx xxxx xxxx xxxx
566 : : */
567 : : DECODE_TABLE (0xfe400000, 0xe8400000, t32_table_1110_100x_x1xx),
568 : :
569 : : /*
570 : : * Data-processing (shifted register)
571 : : * 1110 101x xxxx xxxx xxxx xxxx xxxx xxxx
572 : : */
573 : : DECODE_TABLE (0xfe000000, 0xea000000, t32_table_1110_101x),
574 : :
575 : : /*
576 : : * Coprocessor instructions
577 : : * 1110 11xx xxxx xxxx xxxx xxxx xxxx xxxx
578 : : */
579 : : DECODE_REJECT (0xfc000000, 0xec000000),
580 : :
581 : : /*
582 : : * Data-processing (modified immediate)
583 : : * 1111 0x0x xxxx xxxx 0xxx xxxx xxxx xxxx
584 : : */
585 : : DECODE_TABLE (0xfa008000, 0xf0000000, t32_table_1111_0x0x___0),
586 : :
587 : : /*
588 : : * Data-processing (plain binary immediate)
589 : : * 1111 0x1x xxxx xxxx 0xxx xxxx xxxx xxxx
590 : : */
591 : : DECODE_TABLE (0xfa008000, 0xf2000000, t32_table_1111_0x1x___0),
592 : :
593 : : /*
594 : : * Branches and miscellaneous control
595 : : * 1111 0xxx xxxx xxxx 1xxx xxxx xxxx xxxx
596 : : */
597 : : DECODE_TABLE (0xf8008000, 0xf0008000, t32_table_1111_0xxx___1),
598 : :
599 : : /*
600 : : * Advanced SIMD element or structure load/store instructions
601 : : * 1111 1001 xxx0 xxxx xxxx xxxx xxxx xxxx
602 : : */
603 : : DECODE_REJECT (0xff100000, 0xf9000000),
604 : :
605 : : /*
606 : : * Memory hints
607 : : * 1111 100x x0x1 xxxx 1111 xxxx xxxx xxxx
608 : : */
609 : : DECODE_TABLE (0xfe50f000, 0xf810f000, t32_table_1111_100x_x0x1__1111),
610 : :
611 : : /*
612 : : * Store single data item
613 : : * 1111 1000 xxx0 xxxx xxxx xxxx xxxx xxxx
614 : : * Load single data items
615 : : * 1111 100x xxx1 xxxx xxxx xxxx xxxx xxxx
616 : : */
617 : : DECODE_TABLE (0xfe000000, 0xf8000000, t32_table_1111_100x),
618 : :
619 : : /*
620 : : * Data-processing (register)
621 : : * 1111 1010 xxxx xxxx 1111 xxxx xxxx xxxx
622 : : */
623 : : DECODE_TABLE (0xff00f000, 0xfa00f000, t32_table_1111_1010___1111),
624 : :
625 : : /*
626 : : * Multiply, multiply accumulate, and absolute difference
627 : : * 1111 1011 0xxx xxxx xxxx xxxx xxxx xxxx
628 : : */
629 : : DECODE_TABLE (0xff800000, 0xfb000000, t32_table_1111_1011_0),
630 : :
631 : : /*
632 : : * Long multiply, long multiply accumulate, and divide
633 : : * 1111 1011 1xxx xxxx xxxx xxxx xxxx xxxx
634 : : */
635 : : DECODE_TABLE (0xff800000, 0xfb800000, t32_table_1111_1011_1),
636 : :
637 : : /*
638 : : * Coprocessor instructions
639 : : * 1111 11xx xxxx xxxx xxxx xxxx xxxx xxxx
640 : : */
641 : : DECODE_END
642 : : };
643 : : #ifdef CONFIG_ARM_KPROBES_TEST_MODULE
644 : : EXPORT_SYMBOL_GPL(probes_decode_thumb32_table);
645 : : #endif
646 : :
647 : : static const union decode_item t16_table_1011[] = {
648 : : /* Miscellaneous 16-bit instructions */
649 : :
650 : : /* ADD (SP plus immediate) 1011 0000 0xxx xxxx */
651 : : /* SUB (SP minus immediate) 1011 0000 1xxx xxxx */
652 : : DECODE_SIMULATE (0xff00, 0xb000, PROBES_T16_ADD_SP),
653 : :
654 : : /* CBZ 1011 00x1 xxxx xxxx */
655 : : /* CBNZ 1011 10x1 xxxx xxxx */
656 : : DECODE_SIMULATE (0xf500, 0xb100, PROBES_T16_CBZ),
657 : :
658 : : /* SXTH 1011 0010 00xx xxxx */
659 : : /* SXTB 1011 0010 01xx xxxx */
660 : : /* UXTH 1011 0010 10xx xxxx */
661 : : /* UXTB 1011 0010 11xx xxxx */
662 : : /* REV 1011 1010 00xx xxxx */
663 : : /* REV16 1011 1010 01xx xxxx */
664 : : /* ??? 1011 1010 10xx xxxx */
665 : : /* REVSH 1011 1010 11xx xxxx */
666 : : DECODE_REJECT (0xffc0, 0xba80),
667 : : DECODE_EMULATE (0xf500, 0xb000, PROBES_T16_SIGN_EXTEND),
668 : :
669 : : /* PUSH 1011 010x xxxx xxxx */
670 : : DECODE_CUSTOM (0xfe00, 0xb400, PROBES_T16_PUSH),
671 : : /* POP 1011 110x xxxx xxxx */
672 : : DECODE_CUSTOM (0xfe00, 0xbc00, PROBES_T16_POP),
673 : :
674 : : /*
675 : : * If-Then, and hints
676 : : * 1011 1111 xxxx xxxx
677 : : */
678 : :
679 : : /* YIELD 1011 1111 0001 0000 */
680 : : DECODE_OR (0xffff, 0xbf10),
681 : : /* SEV 1011 1111 0100 0000 */
682 : : DECODE_EMULATE (0xffff, 0xbf40, PROBES_T16_SEV),
683 : : /* NOP 1011 1111 0000 0000 */
684 : : /* WFE 1011 1111 0010 0000 */
685 : : /* WFI 1011 1111 0011 0000 */
686 : : DECODE_SIMULATE (0xffcf, 0xbf00, PROBES_T16_WFE),
687 : : /* Unassigned hints 1011 1111 xxxx 0000 */
688 : : DECODE_REJECT (0xff0f, 0xbf00),
689 : : /* IT 1011 1111 xxxx xxxx */
690 : : DECODE_CUSTOM (0xff00, 0xbf00, PROBES_T16_IT),
691 : :
692 : : /* SETEND 1011 0110 010x xxxx */
693 : : /* CPS 1011 0110 011x xxxx */
694 : : /* BKPT 1011 1110 xxxx xxxx */
695 : : /* And unallocated instructions... */
696 : : DECODE_END
697 : : };
698 : :
699 : : const union decode_item probes_decode_thumb16_table[] = {
700 : :
701 : : /*
702 : : * Shift (immediate), add, subtract, move, and compare
703 : : * 00xx xxxx xxxx xxxx
704 : : */
705 : :
706 : : /* CMP (immediate) 0010 1xxx xxxx xxxx */
707 : : DECODE_EMULATE (0xf800, 0x2800, PROBES_T16_CMP),
708 : :
709 : : /* ADD (register) 0001 100x xxxx xxxx */
710 : : /* SUB (register) 0001 101x xxxx xxxx */
711 : : /* LSL (immediate) 0000 0xxx xxxx xxxx */
712 : : /* LSR (immediate) 0000 1xxx xxxx xxxx */
713 : : /* ASR (immediate) 0001 0xxx xxxx xxxx */
714 : : /* ADD (immediate, Thumb) 0001 110x xxxx xxxx */
715 : : /* SUB (immediate, Thumb) 0001 111x xxxx xxxx */
716 : : /* MOV (immediate) 0010 0xxx xxxx xxxx */
717 : : /* ADD (immediate, Thumb) 0011 0xxx xxxx xxxx */
718 : : /* SUB (immediate, Thumb) 0011 1xxx xxxx xxxx */
719 : : DECODE_EMULATE (0xc000, 0x0000, PROBES_T16_ADDSUB),
720 : :
721 : : /*
722 : : * 16-bit Thumb data-processing instructions
723 : : * 0100 00xx xxxx xxxx
724 : : */
725 : :
726 : : /* TST (register) 0100 0010 00xx xxxx */
727 : : DECODE_EMULATE (0xffc0, 0x4200, PROBES_T16_CMP),
728 : : /* CMP (register) 0100 0010 10xx xxxx */
729 : : /* CMN (register) 0100 0010 11xx xxxx */
730 : : DECODE_EMULATE (0xff80, 0x4280, PROBES_T16_CMP),
731 : : /* AND (register) 0100 0000 00xx xxxx */
732 : : /* EOR (register) 0100 0000 01xx xxxx */
733 : : /* LSL (register) 0100 0000 10xx xxxx */
734 : : /* LSR (register) 0100 0000 11xx xxxx */
735 : : /* ASR (register) 0100 0001 00xx xxxx */
736 : : /* ADC (register) 0100 0001 01xx xxxx */
737 : : /* SBC (register) 0100 0001 10xx xxxx */
738 : : /* ROR (register) 0100 0001 11xx xxxx */
739 : : /* RSB (immediate) 0100 0010 01xx xxxx */
740 : : /* ORR (register) 0100 0011 00xx xxxx */
741 : : /* MUL 0100 0011 00xx xxxx */
742 : : /* BIC (register) 0100 0011 10xx xxxx */
743 : : /* MVN (register) 0100 0011 10xx xxxx */
744 : : DECODE_EMULATE (0xfc00, 0x4000, PROBES_T16_LOGICAL),
745 : :
746 : : /*
747 : : * Special data instructions and branch and exchange
748 : : * 0100 01xx xxxx xxxx
749 : : */
750 : :
751 : : /* BLX pc 0100 0111 1111 1xxx */
752 : : DECODE_REJECT (0xfff8, 0x47f8),
753 : :
754 : : /* BX (register) 0100 0111 0xxx xxxx */
755 : : /* BLX (register) 0100 0111 1xxx xxxx */
756 : : DECODE_SIMULATE (0xff00, 0x4700, PROBES_T16_BLX),
757 : :
758 : : /* ADD pc, pc 0100 0100 1111 1111 */
759 : : DECODE_REJECT (0xffff, 0x44ff),
760 : :
761 : : /* ADD (register) 0100 0100 xxxx xxxx */
762 : : /* CMP (register) 0100 0101 xxxx xxxx */
763 : : /* MOV (register) 0100 0110 xxxx xxxx */
764 : : DECODE_CUSTOM (0xfc00, 0x4400, PROBES_T16_HIREGOPS),
765 : :
766 : : /*
767 : : * Load from Literal Pool
768 : : * LDR (literal) 0100 1xxx xxxx xxxx
769 : : */
770 : : DECODE_SIMULATE (0xf800, 0x4800, PROBES_T16_LDR_LIT),
771 : :
772 : : /*
773 : : * 16-bit Thumb Load/store instructions
774 : : * 0101 xxxx xxxx xxxx
775 : : * 011x xxxx xxxx xxxx
776 : : * 100x xxxx xxxx xxxx
777 : : */
778 : :
779 : : /* STR (register) 0101 000x xxxx xxxx */
780 : : /* STRH (register) 0101 001x xxxx xxxx */
781 : : /* STRB (register) 0101 010x xxxx xxxx */
782 : : /* LDRSB (register) 0101 011x xxxx xxxx */
783 : : /* LDR (register) 0101 100x xxxx xxxx */
784 : : /* LDRH (register) 0101 101x xxxx xxxx */
785 : : /* LDRB (register) 0101 110x xxxx xxxx */
786 : : /* LDRSH (register) 0101 111x xxxx xxxx */
787 : : /* STR (immediate, Thumb) 0110 0xxx xxxx xxxx */
788 : : /* LDR (immediate, Thumb) 0110 1xxx xxxx xxxx */
789 : : /* STRB (immediate, Thumb) 0111 0xxx xxxx xxxx */
790 : : /* LDRB (immediate, Thumb) 0111 1xxx xxxx xxxx */
791 : : DECODE_EMULATE (0xc000, 0x4000, PROBES_T16_LDRHSTRH),
792 : : /* STRH (immediate, Thumb) 1000 0xxx xxxx xxxx */
793 : : /* LDRH (immediate, Thumb) 1000 1xxx xxxx xxxx */
794 : : DECODE_EMULATE (0xf000, 0x8000, PROBES_T16_LDRHSTRH),
795 : : /* STR (immediate, Thumb) 1001 0xxx xxxx xxxx */
796 : : /* LDR (immediate, Thumb) 1001 1xxx xxxx xxxx */
797 : : DECODE_SIMULATE (0xf000, 0x9000, PROBES_T16_LDRSTR),
798 : :
799 : : /*
800 : : * Generate PC-/SP-relative address
801 : : * ADR (literal) 1010 0xxx xxxx xxxx
802 : : * ADD (SP plus immediate) 1010 1xxx xxxx xxxx
803 : : */
804 : : DECODE_SIMULATE (0xf000, 0xa000, PROBES_T16_ADR),
805 : :
806 : : /*
807 : : * Miscellaneous 16-bit instructions
808 : : * 1011 xxxx xxxx xxxx
809 : : */
810 : : DECODE_TABLE (0xf000, 0xb000, t16_table_1011),
811 : :
812 : : /* STM 1100 0xxx xxxx xxxx */
813 : : /* LDM 1100 1xxx xxxx xxxx */
814 : : DECODE_EMULATE (0xf000, 0xc000, PROBES_T16_LDMSTM),
815 : :
816 : : /*
817 : : * Conditional branch, and Supervisor Call
818 : : */
819 : :
820 : : /* Permanently UNDEFINED 1101 1110 xxxx xxxx */
821 : : /* SVC 1101 1111 xxxx xxxx */
822 : : DECODE_REJECT (0xfe00, 0xde00),
823 : :
824 : : /* Conditional branch 1101 xxxx xxxx xxxx */
825 : : DECODE_CUSTOM (0xf000, 0xd000, PROBES_T16_BRANCH_COND),
826 : :
827 : : /*
828 : : * Unconditional branch
829 : : * B 1110 0xxx xxxx xxxx
830 : : */
831 : : DECODE_SIMULATE (0xf800, 0xe000, PROBES_T16_BRANCH),
832 : :
833 : : DECODE_END
834 : : };
835 : : #ifdef CONFIG_ARM_KPROBES_TEST_MODULE
836 : : EXPORT_SYMBOL_GPL(probes_decode_thumb16_table);
837 : : #endif
838 : :
839 : 0 : static unsigned long __kprobes thumb_check_cc(unsigned long cpsr)
840 : : {
841 [ # # ]: 0 : if (unlikely(in_it_block(cpsr)))
842 : 0 : return probes_condition_checks[current_cond(cpsr)](cpsr);
843 : : return true;
844 : : }
845 : :
846 : 0 : static void __kprobes thumb16_singlestep(probes_opcode_t opcode,
847 : : struct arch_probes_insn *asi,
848 : : struct pt_regs *regs)
849 : : {
850 : 0 : regs->ARM_pc += 2;
851 : 0 : asi->insn_handler(opcode, asi, regs);
852 : 0 : regs->ARM_cpsr = it_advance(regs->ARM_cpsr);
853 : 0 : }
854 : :
855 : 0 : static void __kprobes thumb32_singlestep(probes_opcode_t opcode,
856 : : struct arch_probes_insn *asi,
857 : : struct pt_regs *regs)
858 : : {
859 : 0 : regs->ARM_pc += 4;
860 : 0 : asi->insn_handler(opcode, asi, regs);
861 : 0 : regs->ARM_cpsr = it_advance(regs->ARM_cpsr);
862 : 0 : }
863 : :
864 : : enum probes_insn __kprobes
865 : 0 : thumb16_probes_decode_insn(probes_opcode_t insn, struct arch_probes_insn *asi,
866 : : bool emulate, const union decode_action *actions)
867 : : {
868 : 0 : asi->insn_singlestep = thumb16_singlestep;
869 : 0 : asi->insn_check_cc = thumb_check_cc;
870 : 0 : return probes_decode_insn(insn, asi, probes_decode_thumb16_table, true,
871 : : emulate, actions);
872 : : }
873 : :
874 : : enum probes_insn __kprobes
875 : 0 : thumb32_probes_decode_insn(probes_opcode_t insn, struct arch_probes_insn *asi,
876 : : bool emulate, const union decode_action *actions)
877 : : {
878 : 0 : asi->insn_singlestep = thumb32_singlestep;
879 : 0 : asi->insn_check_cc = thumb_check_cc;
880 : 0 : return probes_decode_insn(insn, asi, probes_decode_thumb32_table, true,
881 : : emulate, actions);
882 : : }
|