]> git.karo-electronics.de Git - karo-tx-linux.git/blob - arch/arm/kernel/kprobes-thumb.c
Merge branch 'upstream-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jlbec...
[karo-tx-linux.git] / arch / arm / kernel / kprobes-thumb.c
1 /*
2  * arch/arm/kernel/kprobes-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/kernel.h>
12 #include <linux/kprobes.h>
13 #include <linux/module.h>
14
15 #include "kprobes.h"
16
17
18 /*
19  * True if current instruction is in an IT block.
20  */
21 #define in_it_block(cpsr)       ((cpsr & 0x06000c00) != 0x00000000)
22
23 /*
24  * Return the condition code to check for the currently executing instruction.
25  * This is in ITSTATE<7:4> which is in CPSR<15:12> but is only valid if
26  * in_it_block returns true.
27  */
28 #define current_cond(cpsr)      ((cpsr >> 12) & 0xf)
29
30 /*
31  * Return the PC value for a probe in thumb code.
32  * This is the address of the probed instruction plus 4.
33  * We subtract one because the address will have bit zero set to indicate
34  * a pointer to thumb code.
35  */
36 static inline unsigned long __kprobes thumb_probe_pc(struct kprobe *p)
37 {
38         return (unsigned long)p->addr - 1 + 4;
39 }
40
41 static void __kprobes
42 t32_simulate_table_branch(struct kprobe *p, struct pt_regs *regs)
43 {
44         kprobe_opcode_t insn = p->opcode;
45         unsigned long pc = thumb_probe_pc(p);
46         int rn = (insn >> 16) & 0xf;
47         int rm = insn & 0xf;
48
49         unsigned long rnv = (rn == 15) ? pc : regs->uregs[rn];
50         unsigned long rmv = regs->uregs[rm];
51         unsigned int halfwords;
52
53         if (insn & 0x10) /* TBH */
54                 halfwords = ((u16 *)rnv)[rmv];
55         else /* TBB */
56                 halfwords = ((u8 *)rnv)[rmv];
57
58         regs->ARM_pc = pc + 2 * halfwords;
59 }
60
61 static void __kprobes
62 t32_simulate_mrs(struct kprobe *p, struct pt_regs *regs)
63 {
64         kprobe_opcode_t insn = p->opcode;
65         int rd = (insn >> 8) & 0xf;
66         unsigned long mask = 0xf8ff03df; /* Mask out execution state */
67         regs->uregs[rd] = regs->ARM_cpsr & mask;
68 }
69
70 static void __kprobes
71 t32_simulate_cond_branch(struct kprobe *p, struct pt_regs *regs)
72 {
73         kprobe_opcode_t insn = p->opcode;
74         unsigned long pc = thumb_probe_pc(p);
75
76         long offset = insn & 0x7ff;             /* imm11 */
77         offset += (insn & 0x003f0000) >> 5;     /* imm6 */
78         offset += (insn & 0x00002000) << 4;     /* J1 */
79         offset += (insn & 0x00000800) << 7;     /* J2 */
80         offset -= (insn & 0x04000000) >> 7;     /* Apply sign bit */
81
82         regs->ARM_pc = pc + (offset * 2);
83 }
84
85 static enum kprobe_insn __kprobes
86 t32_decode_cond_branch(kprobe_opcode_t insn, struct arch_specific_insn *asi)
87 {
88         int cc = (insn >> 22) & 0xf;
89         asi->insn_check_cc = kprobe_condition_checks[cc];
90         asi->insn_handler = t32_simulate_cond_branch;
91         return INSN_GOOD_NO_SLOT;
92 }
93
94 static void __kprobes
95 t32_simulate_branch(struct kprobe *p, struct pt_regs *regs)
96 {
97         kprobe_opcode_t insn = p->opcode;
98         unsigned long pc = thumb_probe_pc(p);
99
100         long offset = insn & 0x7ff;             /* imm11 */
101         offset += (insn & 0x03ff0000) >> 5;     /* imm10 */
102         offset += (insn & 0x00002000) << 9;     /* J1 */
103         offset += (insn & 0x00000800) << 10;    /* J2 */
104         if (insn & 0x04000000)
105                 offset -= 0x00800000; /* Apply sign bit */
106         else
107                 offset ^= 0x00600000; /* Invert J1 and J2 */
108
109         if (insn & (1 << 14)) {
110                 /* BL or BLX */
111                 regs->ARM_lr = (unsigned long)p->addr + 4;
112                 if (!(insn & (1 << 12))) {
113                         /* BLX so switch to ARM mode */
114                         regs->ARM_cpsr &= ~PSR_T_BIT;
115                         pc &= ~3;
116                 }
117         }
118
119         regs->ARM_pc = pc + (offset * 2);
120 }
121
122 static void __kprobes
123 t32_simulate_ldr_literal(struct kprobe *p, struct pt_regs *regs)
124 {
125         kprobe_opcode_t insn = p->opcode;
126         unsigned long addr = thumb_probe_pc(p) & ~3;
127         int rt = (insn >> 12) & 0xf;
128         unsigned long rtv;
129
130         long offset = insn & 0xfff;
131         if (insn & 0x00800000)
132                 addr += offset;
133         else
134                 addr -= offset;
135
136         if (insn & 0x00400000) {
137                 /* LDR */
138                 rtv = *(unsigned long *)addr;
139                 if (rt == 15) {
140                         bx_write_pc(rtv, regs);
141                         return;
142                 }
143         } else if (insn & 0x00200000) {
144                 /* LDRH */
145                 if (insn & 0x01000000)
146                         rtv = *(s16 *)addr;
147                 else
148                         rtv = *(u16 *)addr;
149         } else {
150                 /* LDRB */
151                 if (insn & 0x01000000)
152                         rtv = *(s8 *)addr;
153                 else
154                         rtv = *(u8 *)addr;
155         }
156
157         regs->uregs[rt] = rtv;
158 }
159
160 static enum kprobe_insn __kprobes
161 t32_decode_ldmstm(kprobe_opcode_t insn, struct arch_specific_insn *asi)
162 {
163         enum kprobe_insn ret = kprobe_decode_ldmstm(insn, asi);
164
165         /* Fixup modified instruction to have halfwords in correct order...*/
166         insn = asi->insn[0];
167         ((u16 *)asi->insn)[0] = insn >> 16;
168         ((u16 *)asi->insn)[1] = insn & 0xffff;
169
170         return ret;
171 }
172
173 static void __kprobes
174 t32_emulate_ldrdstrd(struct kprobe *p, struct pt_regs *regs)
175 {
176         kprobe_opcode_t insn = p->opcode;
177         unsigned long pc = thumb_probe_pc(p) & ~3;
178         int rt1 = (insn >> 12) & 0xf;
179         int rt2 = (insn >> 8) & 0xf;
180         int rn = (insn >> 16) & 0xf;
181
182         register unsigned long rt1v asm("r0") = regs->uregs[rt1];
183         register unsigned long rt2v asm("r1") = regs->uregs[rt2];
184         register unsigned long rnv asm("r2") = (rn == 15) ? pc
185                                                           : regs->uregs[rn];
186
187         __asm__ __volatile__ (
188                 "blx    %[fn]"
189                 : "=r" (rt1v), "=r" (rt2v), "=r" (rnv)
190                 : "0" (rt1v), "1" (rt2v), "2" (rnv), [fn] "r" (p->ainsn.insn_fn)
191                 : "lr", "memory", "cc"
192         );
193
194         if (rn != 15)
195                 regs->uregs[rn] = rnv; /* Writeback base register */
196         regs->uregs[rt1] = rt1v;
197         regs->uregs[rt2] = rt2v;
198 }
199
200 static void __kprobes
201 t32_emulate_ldrstr(struct kprobe *p, struct pt_regs *regs)
202 {
203         kprobe_opcode_t insn = p->opcode;
204         int rt = (insn >> 12) & 0xf;
205         int rn = (insn >> 16) & 0xf;
206         int rm = insn & 0xf;
207
208         register unsigned long rtv asm("r0") = regs->uregs[rt];
209         register unsigned long rnv asm("r2") = regs->uregs[rn];
210         register unsigned long rmv asm("r3") = regs->uregs[rm];
211
212         __asm__ __volatile__ (
213                 "blx    %[fn]"
214                 : "=r" (rtv), "=r" (rnv)
215                 : "0" (rtv), "1" (rnv), "r" (rmv), [fn] "r" (p->ainsn.insn_fn)
216                 : "lr", "memory", "cc"
217         );
218
219         regs->uregs[rn] = rnv; /* Writeback base register */
220         if (rt == 15) /* Can't be true for a STR as they aren't allowed */
221                 bx_write_pc(rtv, regs);
222         else
223                 regs->uregs[rt] = rtv;
224 }
225
226 static void __kprobes
227 t32_emulate_rd8rn16rm0_rwflags(struct kprobe *p, struct pt_regs *regs)
228 {
229         kprobe_opcode_t insn = p->opcode;
230         int rd = (insn >> 8) & 0xf;
231         int rn = (insn >> 16) & 0xf;
232         int rm = insn & 0xf;
233
234         register unsigned long rdv asm("r1") = regs->uregs[rd];
235         register unsigned long rnv asm("r2") = regs->uregs[rn];
236         register unsigned long rmv asm("r3") = regs->uregs[rm];
237         unsigned long cpsr = regs->ARM_cpsr;
238
239         __asm__ __volatile__ (
240                 "msr    cpsr_fs, %[cpsr]        \n\t"
241                 "blx    %[fn]                   \n\t"
242                 "mrs    %[cpsr], cpsr           \n\t"
243                 : "=r" (rdv), [cpsr] "=r" (cpsr)
244                 : "0" (rdv), "r" (rnv), "r" (rmv),
245                   "1" (cpsr), [fn] "r" (p->ainsn.insn_fn)
246                 : "lr", "memory", "cc"
247         );
248
249         regs->uregs[rd] = rdv;
250         regs->ARM_cpsr = (regs->ARM_cpsr & ~APSR_MASK) | (cpsr & APSR_MASK);
251 }
252
253 static void __kprobes
254 t32_emulate_rd8pc16_noflags(struct kprobe *p, struct pt_regs *regs)
255 {
256         kprobe_opcode_t insn = p->opcode;
257         unsigned long pc = thumb_probe_pc(p);
258         int rd = (insn >> 8) & 0xf;
259
260         register unsigned long rdv asm("r1") = regs->uregs[rd];
261         register unsigned long rnv asm("r2") = pc & ~3;
262
263         __asm__ __volatile__ (
264                 "blx    %[fn]"
265                 : "=r" (rdv)
266                 : "0" (rdv), "r" (rnv), [fn] "r" (p->ainsn.insn_fn)
267                 : "lr", "memory", "cc"
268         );
269
270         regs->uregs[rd] = rdv;
271 }
272
273 static void __kprobes
274 t32_emulate_rd8rn16_noflags(struct kprobe *p, struct pt_regs *regs)
275 {
276         kprobe_opcode_t insn = p->opcode;
277         int rd = (insn >> 8) & 0xf;
278         int rn = (insn >> 16) & 0xf;
279
280         register unsigned long rdv asm("r1") = regs->uregs[rd];
281         register unsigned long rnv asm("r2") = regs->uregs[rn];
282
283         __asm__ __volatile__ (
284                 "blx    %[fn]"
285                 : "=r" (rdv)
286                 : "0" (rdv), "r" (rnv), [fn] "r" (p->ainsn.insn_fn)
287                 : "lr", "memory", "cc"
288         );
289
290         regs->uregs[rd] = rdv;
291 }
292
293 static void __kprobes
294 t32_emulate_rdlo12rdhi8rn16rm0_noflags(struct kprobe *p, struct pt_regs *regs)
295 {
296         kprobe_opcode_t insn = p->opcode;
297         int rdlo = (insn >> 12) & 0xf;
298         int rdhi = (insn >> 8) & 0xf;
299         int rn = (insn >> 16) & 0xf;
300         int rm = insn & 0xf;
301
302         register unsigned long rdlov asm("r0") = regs->uregs[rdlo];
303         register unsigned long rdhiv asm("r1") = regs->uregs[rdhi];
304         register unsigned long rnv asm("r2") = regs->uregs[rn];
305         register unsigned long rmv asm("r3") = regs->uregs[rm];
306
307         __asm__ __volatile__ (
308                 "blx    %[fn]"
309                 : "=r" (rdlov), "=r" (rdhiv)
310                 : "0" (rdlov), "1" (rdhiv), "r" (rnv), "r" (rmv),
311                   [fn] "r" (p->ainsn.insn_fn)
312                 : "lr", "memory", "cc"
313         );
314
315         regs->uregs[rdlo] = rdlov;
316         regs->uregs[rdhi] = rdhiv;
317 }
318
319 /* These emulation encodings are functionally equivalent... */
320 #define t32_emulate_rd8rn16rm0ra12_noflags \
321                 t32_emulate_rdlo12rdhi8rn16rm0_noflags
322
323 static const union decode_item t32_table_1110_100x_x0xx[] = {
324         /* Load/store multiple instructions */
325
326         /* Rn is PC             1110 100x x0xx 1111 xxxx xxxx xxxx xxxx */
327         DECODE_REJECT   (0xfe4f0000, 0xe80f0000),
328
329         /* SRS                  1110 1000 00x0 xxxx xxxx xxxx xxxx xxxx */
330         /* RFE                  1110 1000 00x1 xxxx xxxx xxxx xxxx xxxx */
331         DECODE_REJECT   (0xffc00000, 0xe8000000),
332         /* SRS                  1110 1001 10x0 xxxx xxxx xxxx xxxx xxxx */
333         /* RFE                  1110 1001 10x1 xxxx xxxx xxxx xxxx xxxx */
334         DECODE_REJECT   (0xffc00000, 0xe9800000),
335
336         /* STM Rn, {...pc}      1110 100x x0x0 xxxx 1xxx xxxx xxxx xxxx */
337         DECODE_REJECT   (0xfe508000, 0xe8008000),
338         /* LDM Rn, {...lr,pc}   1110 100x x0x1 xxxx 11xx xxxx xxxx xxxx */
339         DECODE_REJECT   (0xfe50c000, 0xe810c000),
340         /* LDM/STM Rn, {...sp}  1110 100x x0xx xxxx xx1x xxxx xxxx xxxx */
341         DECODE_REJECT   (0xfe402000, 0xe8002000),
342
343         /* STMIA                1110 1000 10x0 xxxx xxxx xxxx xxxx xxxx */
344         /* LDMIA                1110 1000 10x1 xxxx xxxx xxxx xxxx xxxx */
345         /* STMDB                1110 1001 00x0 xxxx xxxx xxxx xxxx xxxx */
346         /* LDMDB                1110 1001 00x1 xxxx xxxx xxxx xxxx xxxx */
347         DECODE_CUSTOM   (0xfe400000, 0xe8000000, t32_decode_ldmstm),
348
349         DECODE_END
350 };
351
352 static const union decode_item t32_table_1110_100x_x1xx[] = {
353         /* Load/store dual, load/store exclusive, table branch */
354
355         /* STRD (immediate)     1110 1000 x110 xxxx xxxx xxxx xxxx xxxx */
356         /* LDRD (immediate)     1110 1000 x111 xxxx xxxx xxxx xxxx xxxx */
357         DECODE_OR       (0xff600000, 0xe8600000),
358         /* STRD (immediate)     1110 1001 x1x0 xxxx xxxx xxxx xxxx xxxx */
359         /* LDRD (immediate)     1110 1001 x1x1 xxxx xxxx xxxx xxxx xxxx */
360         DECODE_EMULATEX (0xff400000, 0xe9400000, t32_emulate_ldrdstrd,
361                                                  REGS(NOPCWB, NOSPPC, NOSPPC, 0, 0)),
362
363         /* TBB                  1110 1000 1101 xxxx xxxx xxxx 0000 xxxx */
364         /* TBH                  1110 1000 1101 xxxx xxxx xxxx 0001 xxxx */
365         DECODE_SIMULATEX(0xfff000e0, 0xe8d00000, t32_simulate_table_branch,
366                                                  REGS(NOSP, 0, 0, 0, NOSPPC)),
367
368         /* STREX                1110 1000 0100 xxxx xxxx xxxx xxxx xxxx */
369         /* LDREX                1110 1000 0101 xxxx xxxx xxxx xxxx xxxx */
370         /* STREXB               1110 1000 1100 xxxx xxxx xxxx 0100 xxxx */
371         /* STREXH               1110 1000 1100 xxxx xxxx xxxx 0101 xxxx */
372         /* STREXD               1110 1000 1100 xxxx xxxx xxxx 0111 xxxx */
373         /* LDREXB               1110 1000 1101 xxxx xxxx xxxx 0100 xxxx */
374         /* LDREXH               1110 1000 1101 xxxx xxxx xxxx 0101 xxxx */
375         /* LDREXD               1110 1000 1101 xxxx xxxx xxxx 0111 xxxx */
376         /* And unallocated instructions...                              */
377         DECODE_END
378 };
379
380 static const union decode_item t32_table_1110_101x[] = {
381         /* Data-processing (shifted register)                           */
382
383         /* TST                  1110 1010 0001 xxxx xxxx 1111 xxxx xxxx */
384         /* TEQ                  1110 1010 1001 xxxx xxxx 1111 xxxx xxxx */
385         DECODE_EMULATEX (0xff700f00, 0xea100f00, t32_emulate_rd8rn16rm0_rwflags,
386                                                  REGS(NOSPPC, 0, 0, 0, NOSPPC)),
387
388         /* CMN                  1110 1011 0001 xxxx xxxx 1111 xxxx xxxx */
389         DECODE_OR       (0xfff00f00, 0xeb100f00),
390         /* CMP                  1110 1011 1011 xxxx xxxx 1111 xxxx xxxx */
391         DECODE_EMULATEX (0xfff00f00, 0xebb00f00, t32_emulate_rd8rn16rm0_rwflags,
392                                                  REGS(NOPC, 0, 0, 0, NOSPPC)),
393
394         /* MOV                  1110 1010 010x 1111 xxxx xxxx xxxx xxxx */
395         /* MVN                  1110 1010 011x 1111 xxxx xxxx xxxx xxxx */
396         DECODE_EMULATEX (0xffcf0000, 0xea4f0000, t32_emulate_rd8rn16rm0_rwflags,
397                                                  REGS(0, 0, NOSPPC, 0, NOSPPC)),
398
399         /* ???                  1110 1010 101x xxxx xxxx xxxx xxxx xxxx */
400         /* ???                  1110 1010 111x xxxx xxxx xxxx xxxx xxxx */
401         DECODE_REJECT   (0xffa00000, 0xeaa00000),
402         /* ???                  1110 1011 001x xxxx xxxx xxxx xxxx xxxx */
403         DECODE_REJECT   (0xffe00000, 0xeb200000),
404         /* ???                  1110 1011 100x xxxx xxxx xxxx xxxx xxxx */
405         DECODE_REJECT   (0xffe00000, 0xeb800000),
406         /* ???                  1110 1011 111x xxxx xxxx xxxx xxxx xxxx */
407         DECODE_REJECT   (0xffe00000, 0xebe00000),
408
409         /* ADD/SUB SP, SP, Rm, LSL #0..3                                */
410         /*                      1110 1011 x0xx 1101 x000 1101 xx00 xxxx */
411         DECODE_EMULATEX (0xff4f7f30, 0xeb0d0d00, t32_emulate_rd8rn16rm0_rwflags,
412                                                  REGS(SP, 0, SP, 0, NOSPPC)),
413
414         /* ADD/SUB SP, SP, Rm, shift                                    */
415         /*                      1110 1011 x0xx 1101 xxxx 1101 xxxx xxxx */
416         DECODE_REJECT   (0xff4f0f00, 0xeb0d0d00),
417
418         /* ADD/SUB Rd, SP, Rm, shift                                    */
419         /*                      1110 1011 x0xx 1101 xxxx xxxx xxxx xxxx */
420         DECODE_EMULATEX (0xff4f0000, 0xeb0d0000, t32_emulate_rd8rn16rm0_rwflags,
421                                                  REGS(SP, 0, NOPC, 0, NOSPPC)),
422
423         /* AND                  1110 1010 000x xxxx xxxx xxxx xxxx xxxx */
424         /* BIC                  1110 1010 001x xxxx xxxx xxxx xxxx xxxx */
425         /* ORR                  1110 1010 010x xxxx xxxx xxxx xxxx xxxx */
426         /* ORN                  1110 1010 011x xxxx xxxx xxxx xxxx xxxx */
427         /* EOR                  1110 1010 100x xxxx xxxx xxxx xxxx xxxx */
428         /* PKH                  1110 1010 110x xxxx xxxx xxxx xxxx xxxx */
429         /* ADD                  1110 1011 000x xxxx xxxx xxxx xxxx xxxx */
430         /* ADC                  1110 1011 010x xxxx xxxx xxxx xxxx xxxx */
431         /* SBC                  1110 1011 011x xxxx xxxx xxxx xxxx xxxx */
432         /* SUB                  1110 1011 101x xxxx xxxx xxxx xxxx xxxx */
433         /* RSB                  1110 1011 110x xxxx xxxx xxxx xxxx xxxx */
434         DECODE_EMULATEX (0xfe000000, 0xea000000, t32_emulate_rd8rn16rm0_rwflags,
435                                                  REGS(NOSPPC, 0, NOSPPC, 0, NOSPPC)),
436
437         DECODE_END
438 };
439
440 static const union decode_item t32_table_1111_0x0x___0[] = {
441         /* Data-processing (modified immediate)                         */
442
443         /* TST                  1111 0x00 0001 xxxx 0xxx 1111 xxxx xxxx */
444         /* TEQ                  1111 0x00 1001 xxxx 0xxx 1111 xxxx xxxx */
445         DECODE_EMULATEX (0xfb708f00, 0xf0100f00, t32_emulate_rd8rn16rm0_rwflags,
446                                                  REGS(NOSPPC, 0, 0, 0, 0)),
447
448         /* CMN                  1111 0x01 0001 xxxx 0xxx 1111 xxxx xxxx */
449         DECODE_OR       (0xfbf08f00, 0xf1100f00),
450         /* CMP                  1111 0x01 1011 xxxx 0xxx 1111 xxxx xxxx */
451         DECODE_EMULATEX (0xfbf08f00, 0xf1b00f00, t32_emulate_rd8rn16rm0_rwflags,
452                                                  REGS(NOPC, 0, 0, 0, 0)),
453
454         /* MOV                  1111 0x00 010x 1111 0xxx xxxx xxxx xxxx */
455         /* MVN                  1111 0x00 011x 1111 0xxx xxxx xxxx xxxx */
456         DECODE_EMULATEX (0xfbcf8000, 0xf04f0000, t32_emulate_rd8rn16rm0_rwflags,
457                                                  REGS(0, 0, NOSPPC, 0, 0)),
458
459         /* ???                  1111 0x00 101x xxxx 0xxx xxxx xxxx xxxx */
460         DECODE_REJECT   (0xfbe08000, 0xf0a00000),
461         /* ???                  1111 0x00 110x xxxx 0xxx xxxx xxxx xxxx */
462         /* ???                  1111 0x00 111x xxxx 0xxx xxxx xxxx xxxx */
463         DECODE_REJECT   (0xfbc08000, 0xf0c00000),
464         /* ???                  1111 0x01 001x xxxx 0xxx xxxx xxxx xxxx */
465         DECODE_REJECT   (0xfbe08000, 0xf1200000),
466         /* ???                  1111 0x01 100x xxxx 0xxx xxxx xxxx xxxx */
467         DECODE_REJECT   (0xfbe08000, 0xf1800000),
468         /* ???                  1111 0x01 111x xxxx 0xxx xxxx xxxx xxxx */
469         DECODE_REJECT   (0xfbe08000, 0xf1e00000),
470
471         /* ADD Rd, SP, #imm     1111 0x01 000x 1101 0xxx xxxx xxxx xxxx */
472         /* SUB Rd, SP, #imm     1111 0x01 101x 1101 0xxx xxxx xxxx xxxx */
473         DECODE_EMULATEX (0xfb4f8000, 0xf10d0000, t32_emulate_rd8rn16rm0_rwflags,
474                                                  REGS(SP, 0, NOPC, 0, 0)),
475
476         /* AND                  1111 0x00 000x xxxx 0xxx xxxx xxxx xxxx */
477         /* BIC                  1111 0x00 001x xxxx 0xxx xxxx xxxx xxxx */
478         /* ORR                  1111 0x00 010x xxxx 0xxx xxxx xxxx xxxx */
479         /* ORN                  1111 0x00 011x xxxx 0xxx xxxx xxxx xxxx */
480         /* EOR                  1111 0x00 100x xxxx 0xxx xxxx xxxx xxxx */
481         /* ADD                  1111 0x01 000x xxxx 0xxx xxxx xxxx xxxx */
482         /* ADC                  1111 0x01 010x xxxx 0xxx xxxx xxxx xxxx */
483         /* SBC                  1111 0x01 011x xxxx 0xxx xxxx xxxx xxxx */
484         /* SUB                  1111 0x01 101x xxxx 0xxx xxxx xxxx xxxx */
485         /* RSB                  1111 0x01 110x xxxx 0xxx xxxx xxxx xxxx */
486         DECODE_EMULATEX (0xfa008000, 0xf0000000, t32_emulate_rd8rn16rm0_rwflags,
487                                                  REGS(NOSPPC, 0, NOSPPC, 0, 0)),
488
489         DECODE_END
490 };
491
492 static const union decode_item t32_table_1111_0x1x___0[] = {
493         /* Data-processing (plain binary immediate)                     */
494
495         /* ADDW Rd, PC, #imm    1111 0x10 0000 1111 0xxx xxxx xxxx xxxx */
496         DECODE_OR       (0xfbff8000, 0xf20f0000),
497         /* SUBW Rd, PC, #imm    1111 0x10 1010 1111 0xxx xxxx xxxx xxxx */
498         DECODE_EMULATEX (0xfbff8000, 0xf2af0000, t32_emulate_rd8pc16_noflags,
499                                                  REGS(PC, 0, NOSPPC, 0, 0)),
500
501         /* ADDW SP, SP, #imm    1111 0x10 0000 1101 0xxx 1101 xxxx xxxx */
502         DECODE_OR       (0xfbff8f00, 0xf20d0d00),
503         /* SUBW SP, SP, #imm    1111 0x10 1010 1101 0xxx 1101 xxxx xxxx */
504         DECODE_EMULATEX (0xfbff8f00, 0xf2ad0d00, t32_emulate_rd8rn16_noflags,
505                                                  REGS(SP, 0, SP, 0, 0)),
506
507         /* ADDW                 1111 0x10 0000 xxxx 0xxx xxxx xxxx xxxx */
508         DECODE_OR       (0xfbf08000, 0xf2000000),
509         /* SUBW                 1111 0x10 1010 xxxx 0xxx xxxx xxxx xxxx */
510         DECODE_EMULATEX (0xfbf08000, 0xf2a00000, t32_emulate_rd8rn16_noflags,
511                                                  REGS(NOPCX, 0, NOSPPC, 0, 0)),
512
513         /* MOVW                 1111 0x10 0100 xxxx 0xxx xxxx xxxx xxxx */
514         /* MOVT                 1111 0x10 1100 xxxx 0xxx xxxx xxxx xxxx */
515         DECODE_EMULATEX (0xfb708000, 0xf2400000, t32_emulate_rd8rn16_noflags,
516                                                  REGS(0, 0, NOSPPC, 0, 0)),
517
518         /* SSAT16               1111 0x11 0010 xxxx 0000 xxxx 00xx xxxx */
519         /* SSAT                 1111 0x11 00x0 xxxx 0xxx xxxx xxxx xxxx */
520         /* USAT16               1111 0x11 1010 xxxx 0000 xxxx 00xx xxxx */
521         /* USAT                 1111 0x11 10x0 xxxx 0xxx xxxx xxxx xxxx */
522         DECODE_EMULATEX (0xfb508000, 0xf3000000, t32_emulate_rd8rn16rm0_rwflags,
523                                                  REGS(NOSPPC, 0, NOSPPC, 0, 0)),
524
525         /* SFBX                 1111 0x11 0100 xxxx 0xxx xxxx xxxx xxxx */
526         /* UFBX                 1111 0x11 1100 xxxx 0xxx xxxx xxxx xxxx */
527         DECODE_EMULATEX (0xfb708000, 0xf3400000, t32_emulate_rd8rn16_noflags,
528                                                  REGS(NOSPPC, 0, NOSPPC, 0, 0)),
529
530         /* BFC                  1111 0x11 0110 1111 0xxx xxxx xxxx xxxx */
531         DECODE_EMULATEX (0xfbff8000, 0xf36f0000, t32_emulate_rd8rn16_noflags,
532                                                  REGS(0, 0, NOSPPC, 0, 0)),
533
534         /* BFI                  1111 0x11 0110 xxxx 0xxx xxxx xxxx xxxx */
535         DECODE_EMULATEX (0xfbf08000, 0xf3600000, t32_emulate_rd8rn16_noflags,
536                                                  REGS(NOSPPCX, 0, NOSPPC, 0, 0)),
537
538         DECODE_END
539 };
540
541 static const union decode_item t32_table_1111_0xxx___1[] = {
542         /* Branches and miscellaneous control                           */
543
544         /* YIELD                1111 0011 1010 xxxx 10x0 x000 0000 0001 */
545         DECODE_OR       (0xfff0d7ff, 0xf3a08001),
546         /* SEV                  1111 0011 1010 xxxx 10x0 x000 0000 0100 */
547         DECODE_EMULATE  (0xfff0d7ff, 0xf3a08004, kprobe_emulate_none),
548         /* NOP                  1111 0011 1010 xxxx 10x0 x000 0000 0000 */
549         /* WFE                  1111 0011 1010 xxxx 10x0 x000 0000 0010 */
550         /* WFI                  1111 0011 1010 xxxx 10x0 x000 0000 0011 */
551         DECODE_SIMULATE (0xfff0d7fc, 0xf3a08000, kprobe_simulate_nop),
552
553         /* MRS Rd, CPSR         1111 0011 1110 xxxx 10x0 xxxx xxxx xxxx */
554         DECODE_SIMULATEX(0xfff0d000, 0xf3e08000, t32_simulate_mrs,
555                                                  REGS(0, 0, NOSPPC, 0, 0)),
556
557         /*
558          * Unsupported instructions
559          *                      1111 0x11 1xxx xxxx 10x0 xxxx xxxx xxxx
560          *
561          * MSR                  1111 0011 100x xxxx 10x0 xxxx xxxx xxxx
562          * DBG hint             1111 0011 1010 xxxx 10x0 x000 1111 xxxx
563          * Unallocated hints    1111 0011 1010 xxxx 10x0 x000 xxxx xxxx
564          * CPS                  1111 0011 1010 xxxx 10x0 xxxx xxxx xxxx
565          * CLREX/DSB/DMB/ISB    1111 0011 1011 xxxx 10x0 xxxx xxxx xxxx
566          * BXJ                  1111 0011 1100 xxxx 10x0 xxxx xxxx xxxx
567          * SUBS PC,LR,#<imm8>   1111 0011 1101 xxxx 10x0 xxxx xxxx xxxx
568          * MRS Rd, SPSR         1111 0011 1111 xxxx 10x0 xxxx xxxx xxxx
569          * SMC                  1111 0111 1111 xxxx 1000 xxxx xxxx xxxx
570          * UNDEFINED            1111 0111 1111 xxxx 1010 xxxx xxxx xxxx
571          * ???                  1111 0111 1xxx xxxx 1010 xxxx xxxx xxxx
572          */
573         DECODE_REJECT   (0xfb80d000, 0xf3808000),
574
575         /* Bcc                  1111 0xxx xxxx xxxx 10x0 xxxx xxxx xxxx */
576         DECODE_CUSTOM   (0xf800d000, 0xf0008000, t32_decode_cond_branch),
577
578         /* BLX                  1111 0xxx xxxx xxxx 11x0 xxxx xxxx xxx0 */
579         DECODE_OR       (0xf800d001, 0xf000c000),
580         /* B                    1111 0xxx xxxx xxxx 10x1 xxxx xxxx xxxx */
581         /* BL                   1111 0xxx xxxx xxxx 11x1 xxxx xxxx xxxx */
582         DECODE_SIMULATE (0xf8009000, 0xf0009000, t32_simulate_branch),
583
584         DECODE_END
585 };
586
587 static const union decode_item t32_table_1111_100x_x0x1__1111[] = {
588         /* Memory hints                                                 */
589
590         /* PLD (literal)        1111 1000 x001 1111 1111 xxxx xxxx xxxx */
591         /* PLI (literal)        1111 1001 x001 1111 1111 xxxx xxxx xxxx */
592         DECODE_SIMULATE (0xfe7ff000, 0xf81ff000, kprobe_simulate_nop),
593
594         /* PLD{W} (immediate)   1111 1000 10x1 xxxx 1111 xxxx xxxx xxxx */
595         DECODE_OR       (0xffd0f000, 0xf890f000),
596         /* PLD{W} (immediate)   1111 1000 00x1 xxxx 1111 1100 xxxx xxxx */
597         DECODE_OR       (0xffd0ff00, 0xf810fc00),
598         /* PLI (immediate)      1111 1001 1001 xxxx 1111 xxxx xxxx xxxx */
599         DECODE_OR       (0xfff0f000, 0xf990f000),
600         /* PLI (immediate)      1111 1001 0001 xxxx 1111 1100 xxxx xxxx */
601         DECODE_SIMULATEX(0xfff0ff00, 0xf910fc00, kprobe_simulate_nop,
602                                                  REGS(NOPCX, 0, 0, 0, 0)),
603
604         /* PLD{W} (register)    1111 1000 00x1 xxxx 1111 0000 00xx xxxx */
605         DECODE_OR       (0xffd0ffc0, 0xf810f000),
606         /* PLI (register)       1111 1001 0001 xxxx 1111 0000 00xx xxxx */
607         DECODE_SIMULATEX(0xfff0ffc0, 0xf910f000, kprobe_simulate_nop,
608                                                  REGS(NOPCX, 0, 0, 0, NOSPPC)),
609
610         /* Other unallocated instructions...                            */
611         DECODE_END
612 };
613
614 static const union decode_item t32_table_1111_100x[] = {
615         /* Store/Load single data item                                  */
616
617         /* ???                  1111 100x x11x xxxx xxxx xxxx xxxx xxxx */
618         DECODE_REJECT   (0xfe600000, 0xf8600000),
619
620         /* ???                  1111 1001 0101 xxxx xxxx xxxx xxxx xxxx */
621         DECODE_REJECT   (0xfff00000, 0xf9500000),
622
623         /* ???                  1111 100x 0xxx xxxx xxxx 10x0 xxxx xxxx */
624         DECODE_REJECT   (0xfe800d00, 0xf8000800),
625
626         /* STRBT                1111 1000 0000 xxxx xxxx 1110 xxxx xxxx */
627         /* STRHT                1111 1000 0010 xxxx xxxx 1110 xxxx xxxx */
628         /* STRT                 1111 1000 0100 xxxx xxxx 1110 xxxx xxxx */
629         /* LDRBT                1111 1000 0001 xxxx xxxx 1110 xxxx xxxx */
630         /* LDRSBT               1111 1001 0001 xxxx xxxx 1110 xxxx xxxx */
631         /* LDRHT                1111 1000 0011 xxxx xxxx 1110 xxxx xxxx */
632         /* LDRSHT               1111 1001 0011 xxxx xxxx 1110 xxxx xxxx */
633         /* LDRT                 1111 1000 0101 xxxx xxxx 1110 xxxx xxxx */
634         DECODE_REJECT   (0xfe800f00, 0xf8000e00),
635
636         /* STR{,B,H} Rn,[PC...] 1111 1000 xxx0 1111 xxxx xxxx xxxx xxxx */
637         DECODE_REJECT   (0xff1f0000, 0xf80f0000),
638
639         /* STR{,B,H} PC,[Rn...] 1111 1000 xxx0 xxxx 1111 xxxx xxxx xxxx */
640         DECODE_REJECT   (0xff10f000, 0xf800f000),
641
642         /* LDR (literal)        1111 1000 x101 1111 xxxx xxxx xxxx xxxx */
643         DECODE_SIMULATEX(0xff7f0000, 0xf85f0000, t32_simulate_ldr_literal,
644                                                  REGS(PC, ANY, 0, 0, 0)),
645
646         /* STR (immediate)      1111 1000 0100 xxxx xxxx 1xxx xxxx xxxx */
647         /* LDR (immediate)      1111 1000 0101 xxxx xxxx 1xxx xxxx xxxx */
648         DECODE_OR       (0xffe00800, 0xf8400800),
649         /* STR (immediate)      1111 1000 1100 xxxx xxxx xxxx xxxx xxxx */
650         /* LDR (immediate)      1111 1000 1101 xxxx xxxx xxxx xxxx xxxx */
651         DECODE_EMULATEX (0xffe00000, 0xf8c00000, t32_emulate_ldrstr,
652                                                  REGS(NOPCX, ANY, 0, 0, 0)),
653
654         /* STR (register)       1111 1000 0100 xxxx xxxx 0000 00xx xxxx */
655         /* LDR (register)       1111 1000 0101 xxxx xxxx 0000 00xx xxxx */
656         DECODE_EMULATEX (0xffe00fc0, 0xf8400000, t32_emulate_ldrstr,
657                                                  REGS(NOPCX, ANY, 0, 0, NOSPPC)),
658
659         /* LDRB (literal)       1111 1000 x001 1111 xxxx xxxx xxxx xxxx */
660         /* LDRSB (literal)      1111 1001 x001 1111 xxxx xxxx xxxx xxxx */
661         /* LDRH (literal)       1111 1000 x011 1111 xxxx xxxx xxxx xxxx */
662         /* LDRSH (literal)      1111 1001 x011 1111 xxxx xxxx xxxx xxxx */
663         DECODE_EMULATEX (0xfe5f0000, 0xf81f0000, t32_simulate_ldr_literal,
664                                                  REGS(PC, NOSPPCX, 0, 0, 0)),
665
666         /* STRB (immediate)     1111 1000 0000 xxxx xxxx 1xxx xxxx xxxx */
667         /* STRH (immediate)     1111 1000 0010 xxxx xxxx 1xxx xxxx xxxx */
668         /* LDRB (immediate)     1111 1000 0001 xxxx xxxx 1xxx xxxx xxxx */
669         /* LDRSB (immediate)    1111 1001 0001 xxxx xxxx 1xxx xxxx xxxx */
670         /* LDRH (immediate)     1111 1000 0011 xxxx xxxx 1xxx xxxx xxxx */
671         /* LDRSH (immediate)    1111 1001 0011 xxxx xxxx 1xxx xxxx xxxx */
672         DECODE_OR       (0xfec00800, 0xf8000800),
673         /* STRB (immediate)     1111 1000 1000 xxxx xxxx xxxx xxxx xxxx */
674         /* STRH (immediate)     1111 1000 1010 xxxx xxxx xxxx xxxx xxxx */
675         /* LDRB (immediate)     1111 1000 1001 xxxx xxxx xxxx xxxx xxxx */
676         /* LDRSB (immediate)    1111 1001 1001 xxxx xxxx xxxx xxxx xxxx */
677         /* LDRH (immediate)     1111 1000 1011 xxxx xxxx xxxx xxxx xxxx */
678         /* LDRSH (immediate)    1111 1001 1011 xxxx xxxx xxxx xxxx xxxx */
679         DECODE_EMULATEX (0xfec00000, 0xf8800000, t32_emulate_ldrstr,
680                                                  REGS(NOPCX, NOSPPCX, 0, 0, 0)),
681
682         /* STRB (register)      1111 1000 0000 xxxx xxxx 0000 00xx xxxx */
683         /* STRH (register)      1111 1000 0010 xxxx xxxx 0000 00xx xxxx */
684         /* LDRB (register)      1111 1000 0001 xxxx xxxx 0000 00xx xxxx */
685         /* LDRSB (register)     1111 1001 0001 xxxx xxxx 0000 00xx xxxx */
686         /* LDRH (register)      1111 1000 0011 xxxx xxxx 0000 00xx xxxx */
687         /* LDRSH (register)     1111 1001 0011 xxxx xxxx 0000 00xx xxxx */
688         DECODE_EMULATEX (0xfe800fc0, 0xf8000000, t32_emulate_ldrstr,
689                                                  REGS(NOPCX, NOSPPCX, 0, 0, NOSPPC)),
690
691         /* Other unallocated instructions...                            */
692         DECODE_END
693 };
694
695 static const union decode_item t32_table_1111_1010___1111[] = {
696         /* Data-processing (register)                                   */
697
698         /* ???                  1111 1010 011x xxxx 1111 xxxx 1xxx xxxx */
699         DECODE_REJECT   (0xffe0f080, 0xfa60f080),
700
701         /* SXTH                 1111 1010 0000 1111 1111 xxxx 1xxx xxxx */
702         /* UXTH                 1111 1010 0001 1111 1111 xxxx 1xxx xxxx */
703         /* SXTB16               1111 1010 0010 1111 1111 xxxx 1xxx xxxx */
704         /* UXTB16               1111 1010 0011 1111 1111 xxxx 1xxx xxxx */
705         /* SXTB                 1111 1010 0100 1111 1111 xxxx 1xxx xxxx */
706         /* UXTB                 1111 1010 0101 1111 1111 xxxx 1xxx xxxx */
707         DECODE_EMULATEX (0xff8ff080, 0xfa0ff080, t32_emulate_rd8rn16rm0_rwflags,
708                                                  REGS(0, 0, NOSPPC, 0, NOSPPC)),
709
710
711         /* ???                  1111 1010 1xxx xxxx 1111 xxxx 0x11 xxxx */
712         DECODE_REJECT   (0xff80f0b0, 0xfa80f030),
713         /* ???                  1111 1010 1x11 xxxx 1111 xxxx 0xxx xxxx */
714         DECODE_REJECT   (0xffb0f080, 0xfab0f000),
715
716         /* SADD16               1111 1010 1001 xxxx 1111 xxxx 0000 xxxx */
717         /* SASX                 1111 1010 1010 xxxx 1111 xxxx 0000 xxxx */
718         /* SSAX                 1111 1010 1110 xxxx 1111 xxxx 0000 xxxx */
719         /* SSUB16               1111 1010 1101 xxxx 1111 xxxx 0000 xxxx */
720         /* SADD8                1111 1010 1000 xxxx 1111 xxxx 0000 xxxx */
721         /* SSUB8                1111 1010 1100 xxxx 1111 xxxx 0000 xxxx */
722
723         /* QADD16               1111 1010 1001 xxxx 1111 xxxx 0001 xxxx */
724         /* QASX                 1111 1010 1010 xxxx 1111 xxxx 0001 xxxx */
725         /* QSAX                 1111 1010 1110 xxxx 1111 xxxx 0001 xxxx */
726         /* QSUB16               1111 1010 1101 xxxx 1111 xxxx 0001 xxxx */
727         /* QADD8                1111 1010 1000 xxxx 1111 xxxx 0001 xxxx */
728         /* QSUB8                1111 1010 1100 xxxx 1111 xxxx 0001 xxxx */
729
730         /* SHADD16              1111 1010 1001 xxxx 1111 xxxx 0010 xxxx */
731         /* SHASX                1111 1010 1010 xxxx 1111 xxxx 0010 xxxx */
732         /* SHSAX                1111 1010 1110 xxxx 1111 xxxx 0010 xxxx */
733         /* SHSUB16              1111 1010 1101 xxxx 1111 xxxx 0010 xxxx */
734         /* SHADD8               1111 1010 1000 xxxx 1111 xxxx 0010 xxxx */
735         /* SHSUB8               1111 1010 1100 xxxx 1111 xxxx 0010 xxxx */
736
737         /* UADD16               1111 1010 1001 xxxx 1111 xxxx 0100 xxxx */
738         /* UASX                 1111 1010 1010 xxxx 1111 xxxx 0100 xxxx */
739         /* USAX                 1111 1010 1110 xxxx 1111 xxxx 0100 xxxx */
740         /* USUB16               1111 1010 1101 xxxx 1111 xxxx 0100 xxxx */
741         /* UADD8                1111 1010 1000 xxxx 1111 xxxx 0100 xxxx */
742         /* USUB8                1111 1010 1100 xxxx 1111 xxxx 0100 xxxx */
743
744         /* UQADD16              1111 1010 1001 xxxx 1111 xxxx 0101 xxxx */
745         /* UQASX                1111 1010 1010 xxxx 1111 xxxx 0101 xxxx */
746         /* UQSAX                1111 1010 1110 xxxx 1111 xxxx 0101 xxxx */
747         /* UQSUB16              1111 1010 1101 xxxx 1111 xxxx 0101 xxxx */
748         /* UQADD8               1111 1010 1000 xxxx 1111 xxxx 0101 xxxx */
749         /* UQSUB8               1111 1010 1100 xxxx 1111 xxxx 0101 xxxx */
750
751         /* UHADD16              1111 1010 1001 xxxx 1111 xxxx 0110 xxxx */
752         /* UHASX                1111 1010 1010 xxxx 1111 xxxx 0110 xxxx */
753         /* UHSAX                1111 1010 1110 xxxx 1111 xxxx 0110 xxxx */
754         /* UHSUB16              1111 1010 1101 xxxx 1111 xxxx 0110 xxxx */
755         /* UHADD8               1111 1010 1000 xxxx 1111 xxxx 0110 xxxx */
756         /* UHSUB8               1111 1010 1100 xxxx 1111 xxxx 0110 xxxx */
757         DECODE_OR       (0xff80f080, 0xfa80f000),
758
759         /* SXTAH                1111 1010 0000 xxxx 1111 xxxx 1xxx xxxx */
760         /* UXTAH                1111 1010 0001 xxxx 1111 xxxx 1xxx xxxx */
761         /* SXTAB16              1111 1010 0010 xxxx 1111 xxxx 1xxx xxxx */
762         /* UXTAB16              1111 1010 0011 xxxx 1111 xxxx 1xxx xxxx */
763         /* SXTAB                1111 1010 0100 xxxx 1111 xxxx 1xxx xxxx */
764         /* UXTAB                1111 1010 0101 xxxx 1111 xxxx 1xxx xxxx */
765         DECODE_OR       (0xff80f080, 0xfa00f080),
766
767         /* QADD                 1111 1010 1000 xxxx 1111 xxxx 1000 xxxx */
768         /* QDADD                1111 1010 1000 xxxx 1111 xxxx 1001 xxxx */
769         /* QSUB                 1111 1010 1000 xxxx 1111 xxxx 1010 xxxx */
770         /* QDSUB                1111 1010 1000 xxxx 1111 xxxx 1011 xxxx */
771         DECODE_OR       (0xfff0f0c0, 0xfa80f080),
772
773         /* SEL                  1111 1010 1010 xxxx 1111 xxxx 1000 xxxx */
774         DECODE_OR       (0xfff0f0f0, 0xfaa0f080),
775
776         /* LSL                  1111 1010 000x xxxx 1111 xxxx 0000 xxxx */
777         /* LSR                  1111 1010 001x xxxx 1111 xxxx 0000 xxxx */
778         /* ASR                  1111 1010 010x xxxx 1111 xxxx 0000 xxxx */
779         /* ROR                  1111 1010 011x xxxx 1111 xxxx 0000 xxxx */
780         DECODE_EMULATEX (0xff80f0f0, 0xfa00f000, t32_emulate_rd8rn16rm0_rwflags,
781                                                  REGS(NOSPPC, 0, NOSPPC, 0, NOSPPC)),
782
783         /* CLZ                  1111 1010 1010 xxxx 1111 xxxx 1000 xxxx */
784         DECODE_OR       (0xfff0f0f0, 0xfab0f080),
785
786         /* REV                  1111 1010 1001 xxxx 1111 xxxx 1000 xxxx */
787         /* REV16                1111 1010 1001 xxxx 1111 xxxx 1001 xxxx */
788         /* RBIT                 1111 1010 1001 xxxx 1111 xxxx 1010 xxxx */
789         /* REVSH                1111 1010 1001 xxxx 1111 xxxx 1011 xxxx */
790         DECODE_EMULATEX (0xfff0f0c0, 0xfa90f080, t32_emulate_rd8rn16_noflags,
791                                                  REGS(NOSPPC, 0, NOSPPC, 0, SAMEAS16)),
792
793         /* Other unallocated instructions...                            */
794         DECODE_END
795 };
796
797 static const union decode_item t32_table_1111_1011_0[] = {
798         /* Multiply, multiply accumulate, and absolute difference       */
799
800         /* ???                  1111 1011 0000 xxxx 1111 xxxx 0001 xxxx */
801         DECODE_REJECT   (0xfff0f0f0, 0xfb00f010),
802         /* ???                  1111 1011 0111 xxxx 1111 xxxx 0001 xxxx */
803         DECODE_REJECT   (0xfff0f0f0, 0xfb70f010),
804
805         /* SMULxy               1111 1011 0001 xxxx 1111 xxxx 00xx xxxx */
806         DECODE_OR       (0xfff0f0c0, 0xfb10f000),
807         /* MUL                  1111 1011 0000 xxxx 1111 xxxx 0000 xxxx */
808         /* SMUAD{X}             1111 1011 0010 xxxx 1111 xxxx 000x xxxx */
809         /* SMULWy               1111 1011 0011 xxxx 1111 xxxx 000x xxxx */
810         /* SMUSD{X}             1111 1011 0100 xxxx 1111 xxxx 000x xxxx */
811         /* SMMUL{R}             1111 1011 0101 xxxx 1111 xxxx 000x xxxx */
812         /* USAD8                1111 1011 0111 xxxx 1111 xxxx 0000 xxxx */
813         DECODE_EMULATEX (0xff80f0e0, 0xfb00f000, t32_emulate_rd8rn16rm0_rwflags,
814                                                  REGS(NOSPPC, 0, NOSPPC, 0, NOSPPC)),
815
816         /* ???                  1111 1011 0111 xxxx xxxx xxxx 0001 xxxx */
817         DECODE_REJECT   (0xfff000f0, 0xfb700010),
818
819         /* SMLAxy               1111 1011 0001 xxxx xxxx xxxx 00xx xxxx */
820         DECODE_OR       (0xfff000c0, 0xfb100000),
821         /* MLA                  1111 1011 0000 xxxx xxxx xxxx 0000 xxxx */
822         /* MLS                  1111 1011 0000 xxxx xxxx xxxx 0001 xxxx */
823         /* SMLAD{X}             1111 1011 0010 xxxx xxxx xxxx 000x xxxx */
824         /* SMLAWy               1111 1011 0011 xxxx xxxx xxxx 000x xxxx */
825         /* SMLSD{X}             1111 1011 0100 xxxx xxxx xxxx 000x xxxx */
826         /* SMMLA{R}             1111 1011 0101 xxxx xxxx xxxx 000x xxxx */
827         /* SMMLS{R}             1111 1011 0110 xxxx xxxx xxxx 000x xxxx */
828         /* USADA8               1111 1011 0111 xxxx xxxx xxxx 0000 xxxx */
829         DECODE_EMULATEX (0xff8000c0, 0xfb000000, t32_emulate_rd8rn16rm0ra12_noflags,
830                                                  REGS(NOSPPC, NOSPPCX, NOSPPC, 0, NOSPPC)),
831
832         /* Other unallocated instructions...                            */
833         DECODE_END
834 };
835
836 static const union decode_item t32_table_1111_1011_1[] = {
837         /* Long multiply, long multiply accumulate, and divide          */
838
839         /* UMAAL                1111 1011 1110 xxxx xxxx xxxx 0110 xxxx */
840         DECODE_OR       (0xfff000f0, 0xfbe00060),
841         /* SMLALxy              1111 1011 1100 xxxx xxxx xxxx 10xx xxxx */
842         DECODE_OR       (0xfff000c0, 0xfbc00080),
843         /* SMLALD{X}            1111 1011 1100 xxxx xxxx xxxx 110x xxxx */
844         /* SMLSLD{X}            1111 1011 1101 xxxx xxxx xxxx 110x xxxx */
845         DECODE_OR       (0xffe000e0, 0xfbc000c0),
846         /* SMULL                1111 1011 1000 xxxx xxxx xxxx 0000 xxxx */
847         /* UMULL                1111 1011 1010 xxxx xxxx xxxx 0000 xxxx */
848         /* SMLAL                1111 1011 1100 xxxx xxxx xxxx 0000 xxxx */
849         /* UMLAL                1111 1011 1110 xxxx xxxx xxxx 0000 xxxx */
850         DECODE_EMULATEX (0xff9000f0, 0xfb800000, t32_emulate_rdlo12rdhi8rn16rm0_noflags,
851                                                  REGS(NOSPPC, NOSPPC, NOSPPC, 0, NOSPPC)),
852
853         /* SDIV                 1111 1011 1001 xxxx xxxx xxxx 1111 xxxx */
854         /* UDIV                 1111 1011 1011 xxxx xxxx xxxx 1111 xxxx */
855         /* Other unallocated instructions...                            */
856         DECODE_END
857 };
858
859 const union decode_item kprobe_decode_thumb32_table[] = {
860
861         /*
862          * Load/store multiple instructions
863          *                      1110 100x x0xx xxxx xxxx xxxx xxxx xxxx
864          */
865         DECODE_TABLE    (0xfe400000, 0xe8000000, t32_table_1110_100x_x0xx),
866
867         /*
868          * Load/store dual, load/store exclusive, table branch
869          *                      1110 100x x1xx xxxx xxxx xxxx xxxx xxxx
870          */
871         DECODE_TABLE    (0xfe400000, 0xe8400000, t32_table_1110_100x_x1xx),
872
873         /*
874          * Data-processing (shifted register)
875          *                      1110 101x xxxx xxxx xxxx xxxx xxxx xxxx
876          */
877         DECODE_TABLE    (0xfe000000, 0xea000000, t32_table_1110_101x),
878
879         /*
880          * Coprocessor instructions
881          *                      1110 11xx xxxx xxxx xxxx xxxx xxxx xxxx
882          */
883         DECODE_REJECT   (0xfc000000, 0xec000000),
884
885         /*
886          * Data-processing (modified immediate)
887          *                      1111 0x0x xxxx xxxx 0xxx xxxx xxxx xxxx
888          */
889         DECODE_TABLE    (0xfa008000, 0xf0000000, t32_table_1111_0x0x___0),
890
891         /*
892          * Data-processing (plain binary immediate)
893          *                      1111 0x1x xxxx xxxx 0xxx xxxx xxxx xxxx
894          */
895         DECODE_TABLE    (0xfa008000, 0xf2000000, t32_table_1111_0x1x___0),
896
897         /*
898          * Branches and miscellaneous control
899          *                      1111 0xxx xxxx xxxx 1xxx xxxx xxxx xxxx
900          */
901         DECODE_TABLE    (0xf8008000, 0xf0008000, t32_table_1111_0xxx___1),
902
903         /*
904          * Advanced SIMD element or structure load/store instructions
905          *                      1111 1001 xxx0 xxxx xxxx xxxx xxxx xxxx
906          */
907         DECODE_REJECT   (0xff100000, 0xf9000000),
908
909         /*
910          * Memory hints
911          *                      1111 100x x0x1 xxxx 1111 xxxx xxxx xxxx
912          */
913         DECODE_TABLE    (0xfe50f000, 0xf810f000, t32_table_1111_100x_x0x1__1111),
914
915         /*
916          * Store single data item
917          *                      1111 1000 xxx0 xxxx xxxx xxxx xxxx xxxx
918          * Load single data items
919          *                      1111 100x xxx1 xxxx xxxx xxxx xxxx xxxx
920          */
921         DECODE_TABLE    (0xfe000000, 0xf8000000, t32_table_1111_100x),
922
923         /*
924          * Data-processing (register)
925          *                      1111 1010 xxxx xxxx 1111 xxxx xxxx xxxx
926          */
927         DECODE_TABLE    (0xff00f000, 0xfa00f000, t32_table_1111_1010___1111),
928
929         /*
930          * Multiply, multiply accumulate, and absolute difference
931          *                      1111 1011 0xxx xxxx xxxx xxxx xxxx xxxx
932          */
933         DECODE_TABLE    (0xff800000, 0xfb000000, t32_table_1111_1011_0),
934
935         /*
936          * Long multiply, long multiply accumulate, and divide
937          *                      1111 1011 1xxx xxxx xxxx xxxx xxxx xxxx
938          */
939         DECODE_TABLE    (0xff800000, 0xfb800000, t32_table_1111_1011_1),
940
941         /*
942          * Coprocessor instructions
943          *                      1111 11xx xxxx xxxx xxxx xxxx xxxx xxxx
944          */
945         DECODE_END
946 };
947 #ifdef CONFIG_ARM_KPROBES_TEST_MODULE
948 EXPORT_SYMBOL_GPL(kprobe_decode_thumb32_table);
949 #endif
950
951 static void __kprobes
952 t16_simulate_bxblx(struct kprobe *p, struct pt_regs *regs)
953 {
954         kprobe_opcode_t insn = p->opcode;
955         unsigned long pc = thumb_probe_pc(p);
956         int rm = (insn >> 3) & 0xf;
957         unsigned long rmv = (rm == 15) ? pc : regs->uregs[rm];
958
959         if (insn & (1 << 7)) /* BLX ? */
960                 regs->ARM_lr = (unsigned long)p->addr + 2;
961
962         bx_write_pc(rmv, regs);
963 }
964
965 static void __kprobes
966 t16_simulate_ldr_literal(struct kprobe *p, struct pt_regs *regs)
967 {
968         kprobe_opcode_t insn = p->opcode;
969         unsigned long* base = (unsigned long *)(thumb_probe_pc(p) & ~3);
970         long index = insn & 0xff;
971         int rt = (insn >> 8) & 0x7;
972         regs->uregs[rt] = base[index];
973 }
974
975 static void __kprobes
976 t16_simulate_ldrstr_sp_relative(struct kprobe *p, struct pt_regs *regs)
977 {
978         kprobe_opcode_t insn = p->opcode;
979         unsigned long* base = (unsigned long *)regs->ARM_sp;
980         long index = insn & 0xff;
981         int rt = (insn >> 8) & 0x7;
982         if (insn & 0x800) /* LDR */
983                 regs->uregs[rt] = base[index];
984         else /* STR */
985                 base[index] = regs->uregs[rt];
986 }
987
988 static void __kprobes
989 t16_simulate_reladr(struct kprobe *p, struct pt_regs *regs)
990 {
991         kprobe_opcode_t insn = p->opcode;
992         unsigned long base = (insn & 0x800) ? regs->ARM_sp
993                                             : (thumb_probe_pc(p) & ~3);
994         long offset = insn & 0xff;
995         int rt = (insn >> 8) & 0x7;
996         regs->uregs[rt] = base + offset * 4;
997 }
998
999 static void __kprobes
1000 t16_simulate_add_sp_imm(struct kprobe *p, struct pt_regs *regs)
1001 {
1002         kprobe_opcode_t insn = p->opcode;
1003         long imm = insn & 0x7f;
1004         if (insn & 0x80) /* SUB */
1005                 regs->ARM_sp -= imm * 4;
1006         else /* ADD */
1007                 regs->ARM_sp += imm * 4;
1008 }
1009
1010 static void __kprobes
1011 t16_simulate_cbz(struct kprobe *p, struct pt_regs *regs)
1012 {
1013         kprobe_opcode_t insn = p->opcode;
1014         int rn = insn & 0x7;
1015         kprobe_opcode_t nonzero = regs->uregs[rn] ? insn : ~insn;
1016         if (nonzero & 0x800) {
1017                 long i = insn & 0x200;
1018                 long imm5 = insn & 0xf8;
1019                 unsigned long pc = thumb_probe_pc(p);
1020                 regs->ARM_pc = pc + (i >> 3) + (imm5 >> 2);
1021         }
1022 }
1023
1024 static void __kprobes
1025 t16_simulate_it(struct kprobe *p, struct pt_regs *regs)
1026 {
1027         /*
1028          * The 8 IT state bits are split into two parts in CPSR:
1029          *      ITSTATE<1:0> are in CPSR<26:25>
1030          *      ITSTATE<7:2> are in CPSR<15:10>
1031          * The new IT state is in the lower byte of insn.
1032          */
1033         kprobe_opcode_t insn = p->opcode;
1034         unsigned long cpsr = regs->ARM_cpsr;
1035         cpsr &= ~PSR_IT_MASK;
1036         cpsr |= (insn & 0xfc) << 8;
1037         cpsr |= (insn & 0x03) << 25;
1038         regs->ARM_cpsr = cpsr;
1039 }
1040
1041 static void __kprobes
1042 t16_singlestep_it(struct kprobe *p, struct pt_regs *regs)
1043 {
1044         regs->ARM_pc += 2;
1045         t16_simulate_it(p, regs);
1046 }
1047
1048 static enum kprobe_insn __kprobes
1049 t16_decode_it(kprobe_opcode_t insn, struct arch_specific_insn *asi)
1050 {
1051         asi->insn_singlestep = t16_singlestep_it;
1052         return INSN_GOOD_NO_SLOT;
1053 }
1054
1055 static void __kprobes
1056 t16_simulate_cond_branch(struct kprobe *p, struct pt_regs *regs)
1057 {
1058         kprobe_opcode_t insn = p->opcode;
1059         unsigned long pc = thumb_probe_pc(p);
1060         long offset = insn & 0x7f;
1061         offset -= insn & 0x80; /* Apply sign bit */
1062         regs->ARM_pc = pc + (offset * 2);
1063 }
1064
1065 static enum kprobe_insn __kprobes
1066 t16_decode_cond_branch(kprobe_opcode_t insn, struct arch_specific_insn *asi)
1067 {
1068         int cc = (insn >> 8) & 0xf;
1069         asi->insn_check_cc = kprobe_condition_checks[cc];
1070         asi->insn_handler = t16_simulate_cond_branch;
1071         return INSN_GOOD_NO_SLOT;
1072 }
1073
1074 static void __kprobes
1075 t16_simulate_branch(struct kprobe *p, struct pt_regs *regs)
1076 {
1077         kprobe_opcode_t insn = p->opcode;
1078         unsigned long pc = thumb_probe_pc(p);
1079         long offset = insn & 0x3ff;
1080         offset -= insn & 0x400; /* Apply sign bit */
1081         regs->ARM_pc = pc + (offset * 2);
1082 }
1083
1084 static unsigned long __kprobes
1085 t16_emulate_loregs(struct kprobe *p, struct pt_regs *regs)
1086 {
1087         unsigned long oldcpsr = regs->ARM_cpsr;
1088         unsigned long newcpsr;
1089
1090         __asm__ __volatile__ (
1091                 "msr    cpsr_fs, %[oldcpsr]     \n\t"
1092                 "ldmia  %[regs], {r0-r7}        \n\t"
1093                 "blx    %[fn]                   \n\t"
1094                 "stmia  %[regs], {r0-r7}        \n\t"
1095                 "mrs    %[newcpsr], cpsr        \n\t"
1096                 : [newcpsr] "=r" (newcpsr)
1097                 : [oldcpsr] "r" (oldcpsr), [regs] "r" (regs),
1098                   [fn] "r" (p->ainsn.insn_fn)
1099                 : "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
1100                   "lr", "memory", "cc"
1101                 );
1102
1103         return (oldcpsr & ~APSR_MASK) | (newcpsr & APSR_MASK);
1104 }
1105
1106 static void __kprobes
1107 t16_emulate_loregs_rwflags(struct kprobe *p, struct pt_regs *regs)
1108 {
1109         regs->ARM_cpsr = t16_emulate_loregs(p, regs);
1110 }
1111
1112 static void __kprobes
1113 t16_emulate_loregs_noitrwflags(struct kprobe *p, struct pt_regs *regs)
1114 {
1115         unsigned long cpsr = t16_emulate_loregs(p, regs);
1116         if (!in_it_block(cpsr))
1117                 regs->ARM_cpsr = cpsr;
1118 }
1119
1120 static void __kprobes
1121 t16_emulate_hiregs(struct kprobe *p, struct pt_regs *regs)
1122 {
1123         kprobe_opcode_t insn = p->opcode;
1124         unsigned long pc = thumb_probe_pc(p);
1125         int rdn = (insn & 0x7) | ((insn & 0x80) >> 4);
1126         int rm = (insn >> 3) & 0xf;
1127
1128         register unsigned long rdnv asm("r1");
1129         register unsigned long rmv asm("r0");
1130         unsigned long cpsr = regs->ARM_cpsr;
1131
1132         rdnv = (rdn == 15) ? pc : regs->uregs[rdn];
1133         rmv = (rm == 15) ? pc : regs->uregs[rm];
1134
1135         __asm__ __volatile__ (
1136                 "msr    cpsr_fs, %[cpsr]        \n\t"
1137                 "blx    %[fn]                   \n\t"
1138                 "mrs    %[cpsr], cpsr           \n\t"
1139                 : "=r" (rdnv), [cpsr] "=r" (cpsr)
1140                 : "0" (rdnv), "r" (rmv), "1" (cpsr), [fn] "r" (p->ainsn.insn_fn)
1141                 : "lr", "memory", "cc"
1142         );
1143
1144         if (rdn == 15)
1145                 rdnv &= ~1;
1146
1147         regs->uregs[rdn] = rdnv;
1148         regs->ARM_cpsr = (regs->ARM_cpsr & ~APSR_MASK) | (cpsr & APSR_MASK);
1149 }
1150
1151 static enum kprobe_insn __kprobes
1152 t16_decode_hiregs(kprobe_opcode_t insn, struct arch_specific_insn *asi)
1153 {
1154         insn &= ~0x00ff;
1155         insn |= 0x001; /* Set Rdn = R1 and Rm = R0 */
1156         ((u16 *)asi->insn)[0] = insn;
1157         asi->insn_handler = t16_emulate_hiregs;
1158         return INSN_GOOD;
1159 }
1160
1161 static void __kprobes
1162 t16_emulate_push(struct kprobe *p, struct pt_regs *regs)
1163 {
1164         __asm__ __volatile__ (
1165                 "ldr    r9, [%[regs], #13*4]    \n\t"
1166                 "ldr    r8, [%[regs], #14*4]    \n\t"
1167                 "ldmia  %[regs], {r0-r7}        \n\t"
1168                 "blx    %[fn]                   \n\t"
1169                 "str    r9, [%[regs], #13*4]    \n\t"
1170                 :
1171                 : [regs] "r" (regs), [fn] "r" (p->ainsn.insn_fn)
1172                 : "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9",
1173                   "lr", "memory", "cc"
1174                 );
1175 }
1176
1177 static enum kprobe_insn __kprobes
1178 t16_decode_push(kprobe_opcode_t insn, struct arch_specific_insn *asi)
1179 {
1180         /*
1181          * To simulate a PUSH we use a Thumb-2 "STMDB R9!, {registers}"
1182          * and call it with R9=SP and LR in the register list represented
1183          * by R8.
1184          */
1185         ((u16 *)asi->insn)[0] = 0xe929;         /* 1st half STMDB R9!,{} */
1186         ((u16 *)asi->insn)[1] = insn & 0x1ff;   /* 2nd half (register list) */
1187         asi->insn_handler = t16_emulate_push;
1188         return INSN_GOOD;
1189 }
1190
1191 static void __kprobes
1192 t16_emulate_pop_nopc(struct kprobe *p, struct pt_regs *regs)
1193 {
1194         __asm__ __volatile__ (
1195                 "ldr    r9, [%[regs], #13*4]    \n\t"
1196                 "ldmia  %[regs], {r0-r7}        \n\t"
1197                 "blx    %[fn]                   \n\t"
1198                 "stmia  %[regs], {r0-r7}        \n\t"
1199                 "str    r9, [%[regs], #13*4]    \n\t"
1200                 :
1201                 : [regs] "r" (regs), [fn] "r" (p->ainsn.insn_fn)
1202                 : "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7", "r9",
1203                   "lr", "memory", "cc"
1204                 );
1205 }
1206
1207 static void __kprobes
1208 t16_emulate_pop_pc(struct kprobe *p, struct pt_regs *regs)
1209 {
1210         register unsigned long pc asm("r8");
1211
1212         __asm__ __volatile__ (
1213                 "ldr    r9, [%[regs], #13*4]    \n\t"
1214                 "ldmia  %[regs], {r0-r7}        \n\t"
1215                 "blx    %[fn]                   \n\t"
1216                 "stmia  %[regs], {r0-r7}        \n\t"
1217                 "str    r9, [%[regs], #13*4]    \n\t"
1218                 : "=r" (pc)
1219                 : [regs] "r" (regs), [fn] "r" (p->ainsn.insn_fn)
1220                 : "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7", "r9",
1221                   "lr", "memory", "cc"
1222                 );
1223
1224         bx_write_pc(pc, regs);
1225 }
1226
1227 static enum kprobe_insn __kprobes
1228 t16_decode_pop(kprobe_opcode_t insn, struct arch_specific_insn *asi)
1229 {
1230         /*
1231          * To simulate a POP we use a Thumb-2 "LDMDB R9!, {registers}"
1232          * and call it with R9=SP and PC in the register list represented
1233          * by R8.
1234          */
1235         ((u16 *)asi->insn)[0] = 0xe8b9;         /* 1st half LDMIA R9!,{} */
1236         ((u16 *)asi->insn)[1] = insn & 0x1ff;   /* 2nd half (register list) */
1237         asi->insn_handler = insn & 0x100 ? t16_emulate_pop_pc
1238                                          : t16_emulate_pop_nopc;
1239         return INSN_GOOD;
1240 }
1241
1242 static const union decode_item t16_table_1011[] = {
1243         /* Miscellaneous 16-bit instructions                */
1244
1245         /* ADD (SP plus immediate)      1011 0000 0xxx xxxx */
1246         /* SUB (SP minus immediate)     1011 0000 1xxx xxxx */
1247         DECODE_SIMULATE (0xff00, 0xb000, t16_simulate_add_sp_imm),
1248
1249         /* CBZ                          1011 00x1 xxxx xxxx */
1250         /* CBNZ                         1011 10x1 xxxx xxxx */
1251         DECODE_SIMULATE (0xf500, 0xb100, t16_simulate_cbz),
1252
1253         /* SXTH                         1011 0010 00xx xxxx */
1254         /* SXTB                         1011 0010 01xx xxxx */
1255         /* UXTH                         1011 0010 10xx xxxx */
1256         /* UXTB                         1011 0010 11xx xxxx */
1257         /* REV                          1011 1010 00xx xxxx */
1258         /* REV16                        1011 1010 01xx xxxx */
1259         /* ???                          1011 1010 10xx xxxx */
1260         /* REVSH                        1011 1010 11xx xxxx */
1261         DECODE_REJECT   (0xffc0, 0xba80),
1262         DECODE_EMULATE  (0xf500, 0xb000, t16_emulate_loregs_rwflags),
1263
1264         /* PUSH                         1011 010x xxxx xxxx */
1265         DECODE_CUSTOM   (0xfe00, 0xb400, t16_decode_push),
1266         /* POP                          1011 110x xxxx xxxx */
1267         DECODE_CUSTOM   (0xfe00, 0xbc00, t16_decode_pop),
1268
1269         /*
1270          * If-Then, and hints
1271          *                              1011 1111 xxxx xxxx
1272          */
1273
1274         /* YIELD                        1011 1111 0001 0000 */
1275         DECODE_OR       (0xffff, 0xbf10),
1276         /* SEV                          1011 1111 0100 0000 */
1277         DECODE_EMULATE  (0xffff, 0xbf40, kprobe_emulate_none),
1278         /* NOP                          1011 1111 0000 0000 */
1279         /* WFE                          1011 1111 0010 0000 */
1280         /* WFI                          1011 1111 0011 0000 */
1281         DECODE_SIMULATE (0xffcf, 0xbf00, kprobe_simulate_nop),
1282         /* Unassigned hints             1011 1111 xxxx 0000 */
1283         DECODE_REJECT   (0xff0f, 0xbf00),
1284         /* IT                           1011 1111 xxxx xxxx */
1285         DECODE_CUSTOM   (0xff00, 0xbf00, t16_decode_it),
1286
1287         /* SETEND                       1011 0110 010x xxxx */
1288         /* CPS                          1011 0110 011x xxxx */
1289         /* BKPT                         1011 1110 xxxx xxxx */
1290         /* And unallocated instructions...                  */
1291         DECODE_END
1292 };
1293
1294 const union decode_item kprobe_decode_thumb16_table[] = {
1295
1296         /*
1297          * Shift (immediate), add, subtract, move, and compare
1298          *                              00xx xxxx xxxx xxxx
1299          */
1300
1301         /* CMP (immediate)              0010 1xxx xxxx xxxx */
1302         DECODE_EMULATE  (0xf800, 0x2800, t16_emulate_loregs_rwflags),
1303
1304         /* ADD (register)               0001 100x xxxx xxxx */
1305         /* SUB (register)               0001 101x xxxx xxxx */
1306         /* LSL (immediate)              0000 0xxx xxxx xxxx */
1307         /* LSR (immediate)              0000 1xxx xxxx xxxx */
1308         /* ASR (immediate)              0001 0xxx xxxx xxxx */
1309         /* ADD (immediate, Thumb)       0001 110x xxxx xxxx */
1310         /* SUB (immediate, Thumb)       0001 111x xxxx xxxx */
1311         /* MOV (immediate)              0010 0xxx xxxx xxxx */
1312         /* ADD (immediate, Thumb)       0011 0xxx xxxx xxxx */
1313         /* SUB (immediate, Thumb)       0011 1xxx xxxx xxxx */
1314         DECODE_EMULATE  (0xc000, 0x0000, t16_emulate_loregs_noitrwflags),
1315
1316         /*
1317          * 16-bit Thumb data-processing instructions
1318          *                              0100 00xx xxxx xxxx
1319          */
1320
1321         /* TST (register)               0100 0010 00xx xxxx */
1322         DECODE_EMULATE  (0xffc0, 0x4200, t16_emulate_loregs_rwflags),
1323         /* CMP (register)               0100 0010 10xx xxxx */
1324         /* CMN (register)               0100 0010 11xx xxxx */
1325         DECODE_EMULATE  (0xff80, 0x4280, t16_emulate_loregs_rwflags),
1326         /* AND (register)               0100 0000 00xx xxxx */
1327         /* EOR (register)               0100 0000 01xx xxxx */
1328         /* LSL (register)               0100 0000 10xx xxxx */
1329         /* LSR (register)               0100 0000 11xx xxxx */
1330         /* ASR (register)               0100 0001 00xx xxxx */
1331         /* ADC (register)               0100 0001 01xx xxxx */
1332         /* SBC (register)               0100 0001 10xx xxxx */
1333         /* ROR (register)               0100 0001 11xx xxxx */
1334         /* RSB (immediate)              0100 0010 01xx xxxx */
1335         /* ORR (register)               0100 0011 00xx xxxx */
1336         /* MUL                          0100 0011 00xx xxxx */
1337         /* BIC (register)               0100 0011 10xx xxxx */
1338         /* MVN (register)               0100 0011 10xx xxxx */
1339         DECODE_EMULATE  (0xfc00, 0x4000, t16_emulate_loregs_noitrwflags),
1340
1341         /*
1342          * Special data instructions and branch and exchange
1343          *                              0100 01xx xxxx xxxx
1344          */
1345
1346         /* BLX pc                       0100 0111 1111 1xxx */
1347         DECODE_REJECT   (0xfff8, 0x47f8),
1348
1349         /* BX (register)                0100 0111 0xxx xxxx */
1350         /* BLX (register)               0100 0111 1xxx xxxx */
1351         DECODE_SIMULATE (0xff00, 0x4700, t16_simulate_bxblx),
1352
1353         /* ADD pc, pc                   0100 0100 1111 1111 */
1354         DECODE_REJECT   (0xffff, 0x44ff),
1355
1356         /* ADD (register)               0100 0100 xxxx xxxx */
1357         /* CMP (register)               0100 0101 xxxx xxxx */
1358         /* MOV (register)               0100 0110 xxxx xxxx */
1359         DECODE_CUSTOM   (0xfc00, 0x4400, t16_decode_hiregs),
1360
1361         /*
1362          * Load from Literal Pool
1363          * LDR (literal)                0100 1xxx xxxx xxxx
1364          */
1365         DECODE_SIMULATE (0xf800, 0x4800, t16_simulate_ldr_literal),
1366
1367         /*
1368          * 16-bit Thumb Load/store instructions
1369          *                              0101 xxxx xxxx xxxx
1370          *                              011x xxxx xxxx xxxx
1371          *                              100x xxxx xxxx xxxx
1372          */
1373
1374         /* STR (register)               0101 000x xxxx xxxx */
1375         /* STRH (register)              0101 001x xxxx xxxx */
1376         /* STRB (register)              0101 010x xxxx xxxx */
1377         /* LDRSB (register)             0101 011x xxxx xxxx */
1378         /* LDR (register)               0101 100x xxxx xxxx */
1379         /* LDRH (register)              0101 101x xxxx xxxx */
1380         /* LDRB (register)              0101 110x xxxx xxxx */
1381         /* LDRSH (register)             0101 111x xxxx xxxx */
1382         /* STR (immediate, Thumb)       0110 0xxx xxxx xxxx */
1383         /* LDR (immediate, Thumb)       0110 1xxx xxxx xxxx */
1384         /* STRB (immediate, Thumb)      0111 0xxx xxxx xxxx */
1385         /* LDRB (immediate, Thumb)      0111 1xxx xxxx xxxx */
1386         DECODE_EMULATE  (0xc000, 0x4000, t16_emulate_loregs_rwflags),
1387         /* STRH (immediate, Thumb)      1000 0xxx xxxx xxxx */
1388         /* LDRH (immediate, Thumb)      1000 1xxx xxxx xxxx */
1389         DECODE_EMULATE  (0xf000, 0x8000, t16_emulate_loregs_rwflags),
1390         /* STR (immediate, Thumb)       1001 0xxx xxxx xxxx */
1391         /* LDR (immediate, Thumb)       1001 1xxx xxxx xxxx */
1392         DECODE_SIMULATE (0xf000, 0x9000, t16_simulate_ldrstr_sp_relative),
1393
1394         /*
1395          * Generate PC-/SP-relative address
1396          * ADR (literal)                1010 0xxx xxxx xxxx
1397          * ADD (SP plus immediate)      1010 1xxx xxxx xxxx
1398          */
1399         DECODE_SIMULATE (0xf000, 0xa000, t16_simulate_reladr),
1400
1401         /*
1402          * Miscellaneous 16-bit instructions
1403          *                              1011 xxxx xxxx xxxx
1404          */
1405         DECODE_TABLE    (0xf000, 0xb000, t16_table_1011),
1406
1407         /* STM                          1100 0xxx xxxx xxxx */
1408         /* LDM                          1100 1xxx xxxx xxxx */
1409         DECODE_EMULATE  (0xf000, 0xc000, t16_emulate_loregs_rwflags),
1410
1411         /*
1412          * Conditional branch, and Supervisor Call
1413          */
1414
1415         /* Permanently UNDEFINED        1101 1110 xxxx xxxx */
1416         /* SVC                          1101 1111 xxxx xxxx */
1417         DECODE_REJECT   (0xfe00, 0xde00),
1418
1419         /* Conditional branch           1101 xxxx xxxx xxxx */
1420         DECODE_CUSTOM   (0xf000, 0xd000, t16_decode_cond_branch),
1421
1422         /*
1423          * Unconditional branch
1424          * B                            1110 0xxx xxxx xxxx
1425          */
1426         DECODE_SIMULATE (0xf800, 0xe000, t16_simulate_branch),
1427
1428         DECODE_END
1429 };
1430 #ifdef CONFIG_ARM_KPROBES_TEST_MODULE
1431 EXPORT_SYMBOL_GPL(kprobe_decode_thumb16_table);
1432 #endif
1433
1434 static unsigned long __kprobes thumb_check_cc(unsigned long cpsr)
1435 {
1436         if (unlikely(in_it_block(cpsr)))
1437                 return kprobe_condition_checks[current_cond(cpsr)](cpsr);
1438         return true;
1439 }
1440
1441 static void __kprobes thumb16_singlestep(struct kprobe *p, struct pt_regs *regs)
1442 {
1443         regs->ARM_pc += 2;
1444         p->ainsn.insn_handler(p, regs);
1445         regs->ARM_cpsr = it_advance(regs->ARM_cpsr);
1446 }
1447
1448 static void __kprobes thumb32_singlestep(struct kprobe *p, struct pt_regs *regs)
1449 {
1450         regs->ARM_pc += 4;
1451         p->ainsn.insn_handler(p, regs);
1452         regs->ARM_cpsr = it_advance(regs->ARM_cpsr);
1453 }
1454
1455 enum kprobe_insn __kprobes
1456 thumb16_kprobe_decode_insn(kprobe_opcode_t insn, struct arch_specific_insn *asi)
1457 {
1458         asi->insn_singlestep = thumb16_singlestep;
1459         asi->insn_check_cc = thumb_check_cc;
1460         return kprobe_decode_insn(insn, asi, kprobe_decode_thumb16_table, true);
1461 }
1462
1463 enum kprobe_insn __kprobes
1464 thumb32_kprobe_decode_insn(kprobe_opcode_t insn, struct arch_specific_insn *asi)
1465 {
1466         asi->insn_singlestep = thumb32_singlestep;
1467         asi->insn_check_cc = thumb_check_cc;
1468         return kprobe_decode_insn(insn, asi, kprobe_decode_thumb32_table, true);
1469 }