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