^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) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4) * arch/arm/probes/decode-arm.c
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6) * Some code moved here from arch/arm/kernel/kprobes-arm.c
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8) * Copyright (C) 2006, 2007 Motorola Inc.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11) #include <linux/kernel.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) #include <linux/module.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) #include <linux/stddef.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14) #include <linux/ptrace.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) #include "decode.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) #include "decode-arm.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) #define sign_extend(x, signbit) ((x) | (0 - ((x) & (1 << (signbit)))))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) #define branch_displacement(insn) sign_extend(((insn) & 0xffffff) << 2, 25)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) * To avoid the complications of mimicing single-stepping on a
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) * processor without a Next-PC or a single-step mode, and to
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26) * avoid having to deal with the side-effects of boosting, we
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) * simulate or emulate (almost) all ARM instructions.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) * "Simulation" is where the instruction's behavior is duplicated in
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) * C code. "Emulation" is where the original instruction is rewritten
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) * and executed, often by altering its registers.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) * By having all behavior of the kprobe'd instruction completed before
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) * returning from the kprobe_handler(), all locks (scheduler and
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) * interrupt) can safely be released. There is no need for secondary
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) * breakpoints, no race with MP or preemptable kernels, nor having to
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) * clean up resources counts at a later time impacting overall system
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) * performance. By rewriting the instruction, only the minimum registers
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) * need to be loaded and saved back optimizing performance.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) * Calling the insnslot_*_rwflags version of a function doesn't hurt
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) * anything even when the CPSR flags aren't updated by the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) * instruction. It's just a little slower in return for saving
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44) * a little space by not having a duplicate function that doesn't
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) * update the flags. (The same optimization can be said for
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46) * instructions that do or don't perform register writeback)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) * Also, instructions can either read the flags, only write the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48) * flags, or read and write the flags. To save combinations
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) * rather than for sheer performance, flag functions just assume
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50) * read and write of flags.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) void __kprobes simulate_bbl(probes_opcode_t insn,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54) struct arch_probes_insn *asi, struct pt_regs *regs)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) long iaddr = (long) regs->ARM_pc - 4;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) int disp = branch_displacement(insn);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59) if (insn & (1 << 24))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60) regs->ARM_lr = iaddr + 4;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) regs->ARM_pc = iaddr + 8 + disp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) void __kprobes simulate_blx1(probes_opcode_t insn,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66) struct arch_probes_insn *asi, struct pt_regs *regs)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68) long iaddr = (long) regs->ARM_pc - 4;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69) int disp = branch_displacement(insn);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71) regs->ARM_lr = iaddr + 4;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72) regs->ARM_pc = iaddr + 8 + disp + ((insn >> 23) & 0x2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73) regs->ARM_cpsr |= PSR_T_BIT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76) void __kprobes simulate_blx2bx(probes_opcode_t insn,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77) struct arch_probes_insn *asi, struct pt_regs *regs)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79) int rm = insn & 0xf;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80) long rmv = regs->uregs[rm];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82) if (insn & (1 << 5))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83) regs->ARM_lr = (long) regs->ARM_pc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85) regs->ARM_pc = rmv & ~0x1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86) regs->ARM_cpsr &= ~PSR_T_BIT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87) if (rmv & 0x1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88) regs->ARM_cpsr |= PSR_T_BIT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91) void __kprobes simulate_mrs(probes_opcode_t insn,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92) struct arch_probes_insn *asi, struct pt_regs *regs)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94) int rd = (insn >> 12) & 0xf;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95) unsigned long mask = 0xf8ff03df; /* Mask out execution state */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 96) regs->uregs[rd] = regs->ARM_cpsr & mask;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 97) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 98)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 99) void __kprobes simulate_mov_ipsp(probes_opcode_t insn,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) struct arch_probes_insn *asi, struct pt_regs *regs)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) regs->uregs[12] = regs->uregs[13];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) * For the instruction masking and comparisons in all the "space_*"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) * functions below, Do _not_ rearrange the order of tests unless
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) * you're very, very sure of what you are doing. For the sake of
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) * efficiency, the masks for some tests sometimes assume other test
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) * have been done prior to them so the number of patterns to test
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) * for an instruction set can be as broad as possible to reduce the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) * number of tests needed.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) static const union decode_item arm_1111_table[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) /* Unconditional instructions */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118) /* memory hint 1111 0100 x001 xxxx xxxx xxxx xxxx xxxx */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119) /* PLDI (immediate) 1111 0100 x101 xxxx xxxx xxxx xxxx xxxx */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) /* PLDW (immediate) 1111 0101 x001 xxxx xxxx xxxx xxxx xxxx */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) /* PLD (immediate) 1111 0101 x101 xxxx xxxx xxxx xxxx xxxx */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122) DECODE_SIMULATE (0xfe300000, 0xf4100000, PROBES_PRELOAD_IMM),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124) /* memory hint 1111 0110 x001 xxxx xxxx xxxx xxx0 xxxx */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125) /* PLDI (register) 1111 0110 x101 xxxx xxxx xxxx xxx0 xxxx */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126) /* PLDW (register) 1111 0111 x001 xxxx xxxx xxxx xxx0 xxxx */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127) /* PLD (register) 1111 0111 x101 xxxx xxxx xxxx xxx0 xxxx */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128) DECODE_SIMULATE (0xfe300010, 0xf6100000, PROBES_PRELOAD_REG),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130) /* BLX (immediate) 1111 101x xxxx xxxx xxxx xxxx xxxx xxxx */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131) DECODE_SIMULATE (0xfe000000, 0xfa000000, PROBES_BRANCH_IMM),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133) /* CPS 1111 0001 0000 xxx0 xxxx xxxx xx0x xxxx */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134) /* SETEND 1111 0001 0000 0001 xxxx xxxx 0000 xxxx */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135) /* SRS 1111 100x x1x0 xxxx xxxx xxxx xxxx xxxx */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136) /* RFE 1111 100x x0x1 xxxx xxxx xxxx xxxx xxxx */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138) /* Coprocessor instructions... */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139) /* MCRR2 1111 1100 0100 xxxx xxxx xxxx xxxx xxxx */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140) /* MRRC2 1111 1100 0101 xxxx xxxx xxxx xxxx xxxx */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141) /* LDC2 1111 110x xxx1 xxxx xxxx xxxx xxxx xxxx */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142) /* STC2 1111 110x xxx0 xxxx xxxx xxxx xxxx xxxx */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143) /* CDP2 1111 1110 xxxx xxxx xxxx xxxx xxx0 xxxx */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144) /* MCR2 1111 1110 xxx0 xxxx xxxx xxxx xxx1 xxxx */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145) /* MRC2 1111 1110 xxx1 xxxx xxxx xxxx xxx1 xxxx */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147) /* Other unallocated instructions... */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148) DECODE_END
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151) static const union decode_item arm_cccc_0001_0xx0____0xxx_table[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 152) /* Miscellaneous instructions */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 153)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 154) /* MRS cpsr cccc 0001 0000 xxxx xxxx xxxx 0000 xxxx */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 155) DECODE_SIMULATEX(0x0ff000f0, 0x01000000, PROBES_MRS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 156) REGS(0, NOPC, 0, 0, 0)),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 157)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 158) /* BX cccc 0001 0010 xxxx xxxx xxxx 0001 xxxx */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 159) DECODE_SIMULATE (0x0ff000f0, 0x01200010, PROBES_BRANCH_REG),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 160)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 161) /* BLX (register) cccc 0001 0010 xxxx xxxx xxxx 0011 xxxx */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 162) DECODE_SIMULATEX(0x0ff000f0, 0x01200030, PROBES_BRANCH_REG,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 163) REGS(0, 0, 0, 0, NOPC)),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 164)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 165) /* CLZ cccc 0001 0110 xxxx xxxx xxxx 0001 xxxx */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 166) DECODE_EMULATEX (0x0ff000f0, 0x01600010, PROBES_CLZ,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 167) REGS(0, NOPC, 0, 0, NOPC)),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 168)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 169) /* QADD cccc 0001 0000 xxxx xxxx xxxx 0101 xxxx */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 170) /* QSUB cccc 0001 0010 xxxx xxxx xxxx 0101 xxxx */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 171) /* QDADD cccc 0001 0100 xxxx xxxx xxxx 0101 xxxx */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 172) /* QDSUB cccc 0001 0110 xxxx xxxx xxxx 0101 xxxx */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 173) DECODE_EMULATEX (0x0f9000f0, 0x01000050, PROBES_SATURATING_ARITHMETIC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 174) REGS(NOPC, NOPC, 0, 0, NOPC)),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 175)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 176) /* BXJ cccc 0001 0010 xxxx xxxx xxxx 0010 xxxx */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 177) /* MSR cccc 0001 0x10 xxxx xxxx xxxx 0000 xxxx */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 178) /* MRS spsr cccc 0001 0100 xxxx xxxx xxxx 0000 xxxx */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 179) /* BKPT 1110 0001 0010 xxxx xxxx xxxx 0111 xxxx */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 180) /* SMC cccc 0001 0110 xxxx xxxx xxxx 0111 xxxx */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 181) /* And unallocated instructions... */
^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 arm_cccc_0001_0xx0____1xx0_table[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 186) /* Halfword multiply and multiply-accumulate */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 187)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 188) /* SMLALxy cccc 0001 0100 xxxx xxxx xxxx 1xx0 xxxx */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 189) DECODE_EMULATEX (0x0ff00090, 0x01400080, PROBES_MUL1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 190) REGS(NOPC, NOPC, NOPC, 0, NOPC)),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 191)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 192) /* SMULWy cccc 0001 0010 xxxx xxxx xxxx 1x10 xxxx */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 193) DECODE_OR (0x0ff000b0, 0x012000a0),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 194) /* SMULxy cccc 0001 0110 xxxx xxxx xxxx 1xx0 xxxx */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 195) DECODE_EMULATEX (0x0ff00090, 0x01600080, PROBES_MUL2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 196) REGS(NOPC, 0, NOPC, 0, NOPC)),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 197)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 198) /* SMLAxy cccc 0001 0000 xxxx xxxx xxxx 1xx0 xxxx */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 199) DECODE_OR (0x0ff00090, 0x01000080),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 200) /* SMLAWy cccc 0001 0010 xxxx xxxx xxxx 1x00 xxxx */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 201) DECODE_EMULATEX (0x0ff000b0, 0x01200080, PROBES_MUL2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 202) REGS(NOPC, NOPC, NOPC, 0, NOPC)),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 203)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 204) DECODE_END
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 205) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 206)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 207) static const union decode_item arm_cccc_0000_____1001_table[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 208) /* Multiply and multiply-accumulate */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 209)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 210) /* MUL cccc 0000 0000 xxxx xxxx xxxx 1001 xxxx */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 211) /* MULS cccc 0000 0001 xxxx xxxx xxxx 1001 xxxx */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 212) DECODE_EMULATEX (0x0fe000f0, 0x00000090, PROBES_MUL2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 213) REGS(NOPC, 0, NOPC, 0, NOPC)),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 214)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 215) /* MLA cccc 0000 0010 xxxx xxxx xxxx 1001 xxxx */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 216) /* MLAS cccc 0000 0011 xxxx xxxx xxxx 1001 xxxx */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 217) DECODE_OR (0x0fe000f0, 0x00200090),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 218) /* MLS cccc 0000 0110 xxxx xxxx xxxx 1001 xxxx */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 219) DECODE_EMULATEX (0x0ff000f0, 0x00600090, PROBES_MUL2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 220) REGS(NOPC, NOPC, NOPC, 0, NOPC)),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 221)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 222) /* UMAAL cccc 0000 0100 xxxx xxxx xxxx 1001 xxxx */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 223) DECODE_OR (0x0ff000f0, 0x00400090),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 224) /* UMULL cccc 0000 1000 xxxx xxxx xxxx 1001 xxxx */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 225) /* UMULLS cccc 0000 1001 xxxx xxxx xxxx 1001 xxxx */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 226) /* UMLAL cccc 0000 1010 xxxx xxxx xxxx 1001 xxxx */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 227) /* UMLALS cccc 0000 1011 xxxx xxxx xxxx 1001 xxxx */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 228) /* SMULL cccc 0000 1100 xxxx xxxx xxxx 1001 xxxx */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 229) /* SMULLS cccc 0000 1101 xxxx xxxx xxxx 1001 xxxx */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 230) /* SMLAL cccc 0000 1110 xxxx xxxx xxxx 1001 xxxx */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 231) /* SMLALS cccc 0000 1111 xxxx xxxx xxxx 1001 xxxx */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 232) DECODE_EMULATEX (0x0f8000f0, 0x00800090, PROBES_MUL1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 233) REGS(NOPC, NOPC, NOPC, 0, NOPC)),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 234)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 235) DECODE_END
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 236) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 237)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 238) static const union decode_item arm_cccc_0001_____1001_table[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 239) /* Synchronization primitives */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 240)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 241) #if __LINUX_ARM_ARCH__ < 6
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 242) /* Deprecated on ARMv6 and may be UNDEFINED on v7 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 243) /* SMP/SWPB cccc 0001 0x00 xxxx xxxx xxxx 1001 xxxx */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 244) DECODE_EMULATEX (0x0fb000f0, 0x01000090, PROBES_SWP,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 245) REGS(NOPC, NOPC, 0, 0, NOPC)),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 246) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 247) /* LDREX/STREX{,D,B,H} cccc 0001 1xxx xxxx xxxx xxxx 1001 xxxx */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 248) /* And unallocated instructions... */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 249) DECODE_END
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 250) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 251)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 252) static const union decode_item arm_cccc_000x_____1xx1_table[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 253) /* Extra load/store instructions */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 254)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 255) /* STRHT cccc 0000 xx10 xxxx xxxx xxxx 1011 xxxx */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 256) /* ??? cccc 0000 xx10 xxxx xxxx xxxx 11x1 xxxx */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 257) /* LDRHT cccc 0000 xx11 xxxx xxxx xxxx 1011 xxxx */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 258) /* LDRSBT cccc 0000 xx11 xxxx xxxx xxxx 1101 xxxx */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 259) /* LDRSHT cccc 0000 xx11 xxxx xxxx xxxx 1111 xxxx */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 260) DECODE_REJECT (0x0f200090, 0x00200090),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 261)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 262) /* LDRD/STRD lr,pc,{... cccc 000x x0x0 xxxx 111x xxxx 1101 xxxx */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 263) DECODE_REJECT (0x0e10e0d0, 0x0000e0d0),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 264)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 265) /* LDRD (register) cccc 000x x0x0 xxxx xxxx xxxx 1101 xxxx */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 266) /* STRD (register) cccc 000x x0x0 xxxx xxxx xxxx 1111 xxxx */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 267) DECODE_EMULATEX (0x0e5000d0, 0x000000d0, PROBES_LDRSTRD,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 268) REGS(NOPCWB, NOPCX, 0, 0, NOPC)),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 269)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 270) /* LDRD (immediate) cccc 000x x1x0 xxxx xxxx xxxx 1101 xxxx */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 271) /* STRD (immediate) cccc 000x x1x0 xxxx xxxx xxxx 1111 xxxx */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 272) DECODE_EMULATEX (0x0e5000d0, 0x004000d0, PROBES_LDRSTRD,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 273) REGS(NOPCWB, NOPCX, 0, 0, 0)),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 274)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 275) /* STRH (register) cccc 000x x0x0 xxxx xxxx xxxx 1011 xxxx */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 276) DECODE_EMULATEX (0x0e5000f0, 0x000000b0, PROBES_STORE_EXTRA,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 277) REGS(NOPCWB, NOPC, 0, 0, NOPC)),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 278)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 279) /* LDRH (register) cccc 000x x0x1 xxxx xxxx xxxx 1011 xxxx */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 280) /* LDRSB (register) cccc 000x x0x1 xxxx xxxx xxxx 1101 xxxx */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 281) /* LDRSH (register) cccc 000x x0x1 xxxx xxxx xxxx 1111 xxxx */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 282) DECODE_EMULATEX (0x0e500090, 0x00100090, PROBES_LOAD_EXTRA,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 283) REGS(NOPCWB, NOPC, 0, 0, NOPC)),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 284)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 285) /* STRH (immediate) cccc 000x x1x0 xxxx xxxx xxxx 1011 xxxx */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 286) DECODE_EMULATEX (0x0e5000f0, 0x004000b0, PROBES_STORE_EXTRA,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 287) REGS(NOPCWB, NOPC, 0, 0, 0)),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 288)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 289) /* LDRH (immediate) cccc 000x x1x1 xxxx xxxx xxxx 1011 xxxx */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 290) /* LDRSB (immediate) cccc 000x x1x1 xxxx xxxx xxxx 1101 xxxx */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 291) /* LDRSH (immediate) cccc 000x x1x1 xxxx xxxx xxxx 1111 xxxx */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 292) DECODE_EMULATEX (0x0e500090, 0x00500090, PROBES_LOAD_EXTRA,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 293) REGS(NOPCWB, NOPC, 0, 0, 0)),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 294)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 295) DECODE_END
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 296) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 297)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 298) static const union decode_item arm_cccc_000x_table[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 299) /* Data-processing (register) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 300)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 301) /* <op>S PC, ... cccc 000x xxx1 xxxx 1111 xxxx xxxx xxxx */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 302) DECODE_REJECT (0x0e10f000, 0x0010f000),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 303)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 304) /* MOV IP, SP 1110 0001 1010 0000 1100 0000 0000 1101 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 305) DECODE_SIMULATE (0xffffffff, 0xe1a0c00d, PROBES_MOV_IP_SP),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 306)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 307) /* TST (register) cccc 0001 0001 xxxx xxxx xxxx xxx0 xxxx */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 308) /* TEQ (register) cccc 0001 0011 xxxx xxxx xxxx xxx0 xxxx */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 309) /* CMP (register) cccc 0001 0101 xxxx xxxx xxxx xxx0 xxxx */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 310) /* CMN (register) cccc 0001 0111 xxxx xxxx xxxx xxx0 xxxx */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 311) DECODE_EMULATEX (0x0f900010, 0x01100000, PROBES_DATA_PROCESSING_REG,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 312) REGS(ANY, 0, 0, 0, ANY)),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 313)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 314) /* MOV (register) cccc 0001 101x xxxx xxxx xxxx xxx0 xxxx */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 315) /* MVN (register) cccc 0001 111x xxxx xxxx xxxx xxx0 xxxx */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 316) DECODE_EMULATEX (0x0fa00010, 0x01a00000, PROBES_DATA_PROCESSING_REG,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 317) REGS(0, ANY, 0, 0, ANY)),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 318)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 319) /* AND (register) cccc 0000 000x xxxx xxxx xxxx xxx0 xxxx */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 320) /* EOR (register) cccc 0000 001x xxxx xxxx xxxx xxx0 xxxx */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 321) /* SUB (register) cccc 0000 010x xxxx xxxx xxxx xxx0 xxxx */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 322) /* RSB (register) cccc 0000 011x xxxx xxxx xxxx xxx0 xxxx */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 323) /* ADD (register) cccc 0000 100x xxxx xxxx xxxx xxx0 xxxx */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 324) /* ADC (register) cccc 0000 101x xxxx xxxx xxxx xxx0 xxxx */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 325) /* SBC (register) cccc 0000 110x xxxx xxxx xxxx xxx0 xxxx */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 326) /* RSC (register) cccc 0000 111x xxxx xxxx xxxx xxx0 xxxx */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 327) /* ORR (register) cccc 0001 100x xxxx xxxx xxxx xxx0 xxxx */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 328) /* BIC (register) cccc 0001 110x xxxx xxxx xxxx xxx0 xxxx */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 329) DECODE_EMULATEX (0x0e000010, 0x00000000, PROBES_DATA_PROCESSING_REG,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 330) REGS(ANY, ANY, 0, 0, ANY)),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 331)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 332) /* TST (reg-shift reg) cccc 0001 0001 xxxx xxxx xxxx 0xx1 xxxx */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 333) /* TEQ (reg-shift reg) cccc 0001 0011 xxxx xxxx xxxx 0xx1 xxxx */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 334) /* CMP (reg-shift reg) cccc 0001 0101 xxxx xxxx xxxx 0xx1 xxxx */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 335) /* CMN (reg-shift reg) cccc 0001 0111 xxxx xxxx xxxx 0xx1 xxxx */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 336) DECODE_EMULATEX (0x0f900090, 0x01100010, PROBES_DATA_PROCESSING_REG,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 337) REGS(NOPC, 0, NOPC, 0, NOPC)),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 338)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 339) /* MOV (reg-shift reg) cccc 0001 101x xxxx xxxx xxxx 0xx1 xxxx */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 340) /* MVN (reg-shift reg) cccc 0001 111x xxxx xxxx xxxx 0xx1 xxxx */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 341) DECODE_EMULATEX (0x0fa00090, 0x01a00010, PROBES_DATA_PROCESSING_REG,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 342) REGS(0, NOPC, NOPC, 0, NOPC)),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 343)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 344) /* AND (reg-shift reg) cccc 0000 000x xxxx xxxx xxxx 0xx1 xxxx */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 345) /* EOR (reg-shift reg) cccc 0000 001x xxxx xxxx xxxx 0xx1 xxxx */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 346) /* SUB (reg-shift reg) cccc 0000 010x xxxx xxxx xxxx 0xx1 xxxx */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 347) /* RSB (reg-shift reg) cccc 0000 011x xxxx xxxx xxxx 0xx1 xxxx */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 348) /* ADD (reg-shift reg) cccc 0000 100x xxxx xxxx xxxx 0xx1 xxxx */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 349) /* ADC (reg-shift reg) cccc 0000 101x xxxx xxxx xxxx 0xx1 xxxx */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 350) /* SBC (reg-shift reg) cccc 0000 110x xxxx xxxx xxxx 0xx1 xxxx */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 351) /* RSC (reg-shift reg) cccc 0000 111x xxxx xxxx xxxx 0xx1 xxxx */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 352) /* ORR (reg-shift reg) cccc 0001 100x xxxx xxxx xxxx 0xx1 xxxx */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 353) /* BIC (reg-shift reg) cccc 0001 110x xxxx xxxx xxxx 0xx1 xxxx */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 354) DECODE_EMULATEX (0x0e000090, 0x00000010, PROBES_DATA_PROCESSING_REG,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 355) REGS(NOPC, NOPC, NOPC, 0, NOPC)),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 356)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 357) DECODE_END
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 358) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 359)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 360) static const union decode_item arm_cccc_001x_table[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 361) /* Data-processing (immediate) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 362)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 363) /* MOVW cccc 0011 0000 xxxx xxxx xxxx xxxx xxxx */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 364) /* MOVT cccc 0011 0100 xxxx xxxx xxxx xxxx xxxx */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 365) DECODE_EMULATEX (0x0fb00000, 0x03000000, PROBES_MOV_HALFWORD,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 366) REGS(0, NOPC, 0, 0, 0)),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 367)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 368) /* YIELD cccc 0011 0010 0000 xxxx xxxx 0000 0001 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 369) DECODE_OR (0x0fff00ff, 0x03200001),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 370) /* SEV cccc 0011 0010 0000 xxxx xxxx 0000 0100 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 371) DECODE_EMULATE (0x0fff00ff, 0x03200004, PROBES_SEV),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 372) /* NOP cccc 0011 0010 0000 xxxx xxxx 0000 0000 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 373) /* WFE cccc 0011 0010 0000 xxxx xxxx 0000 0010 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 374) /* WFI cccc 0011 0010 0000 xxxx xxxx 0000 0011 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 375) DECODE_SIMULATE (0x0fff00fc, 0x03200000, PROBES_WFE),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 376) /* DBG cccc 0011 0010 0000 xxxx xxxx ffff xxxx */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 377) /* unallocated hints cccc 0011 0010 0000 xxxx xxxx xxxx xxxx */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 378) /* MSR (immediate) cccc 0011 0x10 xxxx xxxx xxxx xxxx xxxx */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 379) DECODE_REJECT (0x0fb00000, 0x03200000),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 380)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 381) /* <op>S PC, ... cccc 001x xxx1 xxxx 1111 xxxx xxxx xxxx */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 382) DECODE_REJECT (0x0e10f000, 0x0210f000),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 383)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 384) /* TST (immediate) cccc 0011 0001 xxxx xxxx xxxx xxxx xxxx */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 385) /* TEQ (immediate) cccc 0011 0011 xxxx xxxx xxxx xxxx xxxx */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 386) /* CMP (immediate) cccc 0011 0101 xxxx xxxx xxxx xxxx xxxx */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 387) /* CMN (immediate) cccc 0011 0111 xxxx xxxx xxxx xxxx xxxx */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 388) DECODE_EMULATEX (0x0f900000, 0x03100000, PROBES_DATA_PROCESSING_IMM,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 389) REGS(ANY, 0, 0, 0, 0)),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 390)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 391) /* MOV (immediate) cccc 0011 101x xxxx xxxx xxxx xxxx xxxx */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 392) /* MVN (immediate) cccc 0011 111x xxxx xxxx xxxx xxxx xxxx */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 393) DECODE_EMULATEX (0x0fa00000, 0x03a00000, PROBES_DATA_PROCESSING_IMM,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 394) REGS(0, ANY, 0, 0, 0)),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 395)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 396) /* AND (immediate) cccc 0010 000x xxxx xxxx xxxx xxxx xxxx */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 397) /* EOR (immediate) cccc 0010 001x xxxx xxxx xxxx xxxx xxxx */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 398) /* SUB (immediate) cccc 0010 010x xxxx xxxx xxxx xxxx xxxx */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 399) /* RSB (immediate) cccc 0010 011x xxxx xxxx xxxx xxxx xxxx */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 400) /* ADD (immediate) cccc 0010 100x xxxx xxxx xxxx xxxx xxxx */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 401) /* ADC (immediate) cccc 0010 101x xxxx xxxx xxxx xxxx xxxx */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 402) /* SBC (immediate) cccc 0010 110x xxxx xxxx xxxx xxxx xxxx */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 403) /* RSC (immediate) cccc 0010 111x xxxx xxxx xxxx xxxx xxxx */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 404) /* ORR (immediate) cccc 0011 100x xxxx xxxx xxxx xxxx xxxx */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 405) /* BIC (immediate) cccc 0011 110x xxxx xxxx xxxx xxxx xxxx */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 406) DECODE_EMULATEX (0x0e000000, 0x02000000, PROBES_DATA_PROCESSING_IMM,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 407) REGS(ANY, ANY, 0, 0, 0)),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 408)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 409) DECODE_END
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 410) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 411)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 412) static const union decode_item arm_cccc_0110_____xxx1_table[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 413) /* Media instructions */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 414)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 415) /* SEL cccc 0110 1000 xxxx xxxx xxxx 1011 xxxx */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 416) DECODE_EMULATEX (0x0ff000f0, 0x068000b0, PROBES_SATURATE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 417) REGS(NOPC, NOPC, 0, 0, NOPC)),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 418)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 419) /* SSAT cccc 0110 101x xxxx xxxx xxxx xx01 xxxx */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 420) /* USAT cccc 0110 111x xxxx xxxx xxxx xx01 xxxx */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 421) DECODE_OR(0x0fa00030, 0x06a00010),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 422) /* SSAT16 cccc 0110 1010 xxxx xxxx xxxx 0011 xxxx */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 423) /* USAT16 cccc 0110 1110 xxxx xxxx xxxx 0011 xxxx */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 424) DECODE_EMULATEX (0x0fb000f0, 0x06a00030, PROBES_SATURATE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 425) REGS(0, NOPC, 0, 0, NOPC)),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 426)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 427) /* REV cccc 0110 1011 xxxx xxxx xxxx 0011 xxxx */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 428) /* REV16 cccc 0110 1011 xxxx xxxx xxxx 1011 xxxx */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 429) /* RBIT cccc 0110 1111 xxxx xxxx xxxx 0011 xxxx */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 430) /* REVSH cccc 0110 1111 xxxx xxxx xxxx 1011 xxxx */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 431) DECODE_EMULATEX (0x0fb00070, 0x06b00030, PROBES_REV,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 432) REGS(0, NOPC, 0, 0, NOPC)),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 433)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 434) /* ??? cccc 0110 0x00 xxxx xxxx xxxx xxx1 xxxx */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 435) DECODE_REJECT (0x0fb00010, 0x06000010),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 436) /* ??? cccc 0110 0xxx xxxx xxxx xxxx 1011 xxxx */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 437) DECODE_REJECT (0x0f8000f0, 0x060000b0),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 438) /* ??? cccc 0110 0xxx xxxx xxxx xxxx 1101 xxxx */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 439) DECODE_REJECT (0x0f8000f0, 0x060000d0),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 440) /* SADD16 cccc 0110 0001 xxxx xxxx xxxx 0001 xxxx */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 441) /* SADDSUBX cccc 0110 0001 xxxx xxxx xxxx 0011 xxxx */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 442) /* SSUBADDX cccc 0110 0001 xxxx xxxx xxxx 0101 xxxx */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 443) /* SSUB16 cccc 0110 0001 xxxx xxxx xxxx 0111 xxxx */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 444) /* SADD8 cccc 0110 0001 xxxx xxxx xxxx 1001 xxxx */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 445) /* SSUB8 cccc 0110 0001 xxxx xxxx xxxx 1111 xxxx */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 446) /* QADD16 cccc 0110 0010 xxxx xxxx xxxx 0001 xxxx */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 447) /* QADDSUBX cccc 0110 0010 xxxx xxxx xxxx 0011 xxxx */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 448) /* QSUBADDX cccc 0110 0010 xxxx xxxx xxxx 0101 xxxx */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 449) /* QSUB16 cccc 0110 0010 xxxx xxxx xxxx 0111 xxxx */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 450) /* QADD8 cccc 0110 0010 xxxx xxxx xxxx 1001 xxxx */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 451) /* QSUB8 cccc 0110 0010 xxxx xxxx xxxx 1111 xxxx */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 452) /* SHADD16 cccc 0110 0011 xxxx xxxx xxxx 0001 xxxx */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 453) /* SHADDSUBX cccc 0110 0011 xxxx xxxx xxxx 0011 xxxx */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 454) /* SHSUBADDX cccc 0110 0011 xxxx xxxx xxxx 0101 xxxx */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 455) /* SHSUB16 cccc 0110 0011 xxxx xxxx xxxx 0111 xxxx */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 456) /* SHADD8 cccc 0110 0011 xxxx xxxx xxxx 1001 xxxx */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 457) /* SHSUB8 cccc 0110 0011 xxxx xxxx xxxx 1111 xxxx */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 458) /* UADD16 cccc 0110 0101 xxxx xxxx xxxx 0001 xxxx */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 459) /* UADDSUBX cccc 0110 0101 xxxx xxxx xxxx 0011 xxxx */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 460) /* USUBADDX cccc 0110 0101 xxxx xxxx xxxx 0101 xxxx */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 461) /* USUB16 cccc 0110 0101 xxxx xxxx xxxx 0111 xxxx */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 462) /* UADD8 cccc 0110 0101 xxxx xxxx xxxx 1001 xxxx */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 463) /* USUB8 cccc 0110 0101 xxxx xxxx xxxx 1111 xxxx */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 464) /* UQADD16 cccc 0110 0110 xxxx xxxx xxxx 0001 xxxx */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 465) /* UQADDSUBX cccc 0110 0110 xxxx xxxx xxxx 0011 xxxx */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 466) /* UQSUBADDX cccc 0110 0110 xxxx xxxx xxxx 0101 xxxx */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 467) /* UQSUB16 cccc 0110 0110 xxxx xxxx xxxx 0111 xxxx */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 468) /* UQADD8 cccc 0110 0110 xxxx xxxx xxxx 1001 xxxx */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 469) /* UQSUB8 cccc 0110 0110 xxxx xxxx xxxx 1111 xxxx */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 470) /* UHADD16 cccc 0110 0111 xxxx xxxx xxxx 0001 xxxx */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 471) /* UHADDSUBX cccc 0110 0111 xxxx xxxx xxxx 0011 xxxx */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 472) /* UHSUBADDX cccc 0110 0111 xxxx xxxx xxxx 0101 xxxx */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 473) /* UHSUB16 cccc 0110 0111 xxxx xxxx xxxx 0111 xxxx */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 474) /* UHADD8 cccc 0110 0111 xxxx xxxx xxxx 1001 xxxx */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 475) /* UHSUB8 cccc 0110 0111 xxxx xxxx xxxx 1111 xxxx */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 476) DECODE_EMULATEX (0x0f800010, 0x06000010, PROBES_MMI,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 477) REGS(NOPC, NOPC, 0, 0, NOPC)),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 478)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 479) /* PKHBT cccc 0110 1000 xxxx xxxx xxxx x001 xxxx */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 480) /* PKHTB cccc 0110 1000 xxxx xxxx xxxx x101 xxxx */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 481) DECODE_EMULATEX (0x0ff00030, 0x06800010, PROBES_PACK,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 482) REGS(NOPC, NOPC, 0, 0, NOPC)),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 483)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 484) /* ??? cccc 0110 1001 xxxx xxxx xxxx 0111 xxxx */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 485) /* ??? cccc 0110 1101 xxxx xxxx xxxx 0111 xxxx */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 486) DECODE_REJECT (0x0fb000f0, 0x06900070),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 487)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 488) /* SXTB16 cccc 0110 1000 1111 xxxx xxxx 0111 xxxx */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 489) /* SXTB cccc 0110 1010 1111 xxxx xxxx 0111 xxxx */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 490) /* SXTH cccc 0110 1011 1111 xxxx xxxx 0111 xxxx */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 491) /* UXTB16 cccc 0110 1100 1111 xxxx xxxx 0111 xxxx */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 492) /* UXTB cccc 0110 1110 1111 xxxx xxxx 0111 xxxx */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 493) /* UXTH cccc 0110 1111 1111 xxxx xxxx 0111 xxxx */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 494) DECODE_EMULATEX (0x0f8f00f0, 0x068f0070, PROBES_EXTEND,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 495) REGS(0, NOPC, 0, 0, NOPC)),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 496)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 497) /* SXTAB16 cccc 0110 1000 xxxx xxxx xxxx 0111 xxxx */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 498) /* SXTAB cccc 0110 1010 xxxx xxxx xxxx 0111 xxxx */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 499) /* SXTAH cccc 0110 1011 xxxx xxxx xxxx 0111 xxxx */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 500) /* UXTAB16 cccc 0110 1100 xxxx xxxx xxxx 0111 xxxx */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 501) /* UXTAB cccc 0110 1110 xxxx xxxx xxxx 0111 xxxx */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 502) /* UXTAH cccc 0110 1111 xxxx xxxx xxxx 0111 xxxx */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 503) DECODE_EMULATEX (0x0f8000f0, 0x06800070, PROBES_EXTEND_ADD,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 504) REGS(NOPCX, NOPC, 0, 0, NOPC)),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 505)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 506) DECODE_END
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 507) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 508)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 509) static const union decode_item arm_cccc_0111_____xxx1_table[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 510) /* Media instructions */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 511)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 512) /* UNDEFINED cccc 0111 1111 xxxx xxxx xxxx 1111 xxxx */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 513) DECODE_REJECT (0x0ff000f0, 0x07f000f0),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 514)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 515) /* SMLALD cccc 0111 0100 xxxx xxxx xxxx 00x1 xxxx */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 516) /* SMLSLD cccc 0111 0100 xxxx xxxx xxxx 01x1 xxxx */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 517) DECODE_EMULATEX (0x0ff00090, 0x07400010, PROBES_MUL_ADD_LONG,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 518) REGS(NOPC, NOPC, NOPC, 0, NOPC)),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 519)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 520) /* SMUAD cccc 0111 0000 xxxx 1111 xxxx 00x1 xxxx */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 521) /* SMUSD cccc 0111 0000 xxxx 1111 xxxx 01x1 xxxx */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 522) DECODE_OR (0x0ff0f090, 0x0700f010),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 523) /* SMMUL cccc 0111 0101 xxxx 1111 xxxx 00x1 xxxx */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 524) DECODE_OR (0x0ff0f0d0, 0x0750f010),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 525) /* USAD8 cccc 0111 1000 xxxx 1111 xxxx 0001 xxxx */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 526) DECODE_EMULATEX (0x0ff0f0f0, 0x0780f010, PROBES_MUL_ADD,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 527) REGS(NOPC, 0, NOPC, 0, NOPC)),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 528)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 529) /* SMLAD cccc 0111 0000 xxxx xxxx xxxx 00x1 xxxx */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 530) /* SMLSD cccc 0111 0000 xxxx xxxx xxxx 01x1 xxxx */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 531) DECODE_OR (0x0ff00090, 0x07000010),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 532) /* SMMLA cccc 0111 0101 xxxx xxxx xxxx 00x1 xxxx */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 533) DECODE_OR (0x0ff000d0, 0x07500010),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 534) /* USADA8 cccc 0111 1000 xxxx xxxx xxxx 0001 xxxx */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 535) DECODE_EMULATEX (0x0ff000f0, 0x07800010, PROBES_MUL_ADD,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 536) REGS(NOPC, NOPCX, NOPC, 0, NOPC)),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 537)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 538) /* SMMLS cccc 0111 0101 xxxx xxxx xxxx 11x1 xxxx */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 539) DECODE_EMULATEX (0x0ff000d0, 0x075000d0, PROBES_MUL_ADD,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 540) REGS(NOPC, NOPC, NOPC, 0, NOPC)),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 541)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 542) /* SBFX cccc 0111 101x xxxx xxxx xxxx x101 xxxx */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 543) /* UBFX cccc 0111 111x xxxx xxxx xxxx x101 xxxx */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 544) DECODE_EMULATEX (0x0fa00070, 0x07a00050, PROBES_BITFIELD,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 545) REGS(0, NOPC, 0, 0, NOPC)),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 546)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 547) /* BFC cccc 0111 110x xxxx xxxx xxxx x001 1111 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 548) DECODE_EMULATEX (0x0fe0007f, 0x07c0001f, PROBES_BITFIELD,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 549) REGS(0, NOPC, 0, 0, 0)),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 550)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 551) /* BFI cccc 0111 110x xxxx xxxx xxxx x001 xxxx */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 552) DECODE_EMULATEX (0x0fe00070, 0x07c00010, PROBES_BITFIELD,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 553) REGS(0, NOPC, 0, 0, NOPCX)),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 554)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 555) DECODE_END
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 556) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 557)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 558) static const union decode_item arm_cccc_01xx_table[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 559) /* Load/store word and unsigned byte */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 560)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 561) /* LDRB/STRB pc,[...] cccc 01xx x0xx xxxx xxxx xxxx xxxx xxxx */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 562) DECODE_REJECT (0x0c40f000, 0x0440f000),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 563)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 564) /* STRT cccc 01x0 x010 xxxx xxxx xxxx xxxx xxxx */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 565) /* LDRT cccc 01x0 x011 xxxx xxxx xxxx xxxx xxxx */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 566) /* STRBT cccc 01x0 x110 xxxx xxxx xxxx xxxx xxxx */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 567) /* LDRBT cccc 01x0 x111 xxxx xxxx xxxx xxxx xxxx */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 568) DECODE_REJECT (0x0d200000, 0x04200000),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 569)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 570) /* STR (immediate) cccc 010x x0x0 xxxx xxxx xxxx xxxx xxxx */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 571) /* STRB (immediate) cccc 010x x1x0 xxxx xxxx xxxx xxxx xxxx */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 572) DECODE_EMULATEX (0x0e100000, 0x04000000, PROBES_STORE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 573) REGS(NOPCWB, ANY, 0, 0, 0)),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 574)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 575) /* LDR (immediate) cccc 010x x0x1 xxxx xxxx xxxx xxxx xxxx */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 576) /* LDRB (immediate) cccc 010x x1x1 xxxx xxxx xxxx xxxx xxxx */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 577) DECODE_EMULATEX (0x0e100000, 0x04100000, PROBES_LOAD,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 578) REGS(NOPCWB, ANY, 0, 0, 0)),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 579)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 580) /* STR (register) cccc 011x x0x0 xxxx xxxx xxxx xxxx xxxx */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 581) /* STRB (register) cccc 011x x1x0 xxxx xxxx xxxx xxxx xxxx */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 582) DECODE_EMULATEX (0x0e100000, 0x06000000, PROBES_STORE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 583) REGS(NOPCWB, ANY, 0, 0, NOPC)),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 584)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 585) /* LDR (register) cccc 011x x0x1 xxxx xxxx xxxx xxxx xxxx */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 586) /* LDRB (register) cccc 011x x1x1 xxxx xxxx xxxx xxxx xxxx */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 587) DECODE_EMULATEX (0x0e100000, 0x06100000, PROBES_LOAD,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 588) REGS(NOPCWB, ANY, 0, 0, NOPC)),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 589)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 590) DECODE_END
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 591) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 592)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 593) static const union decode_item arm_cccc_100x_table[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 594) /* Block data transfer instructions */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 595)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 596) /* LDM cccc 100x x0x1 xxxx xxxx xxxx xxxx xxxx */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 597) /* STM cccc 100x x0x0 xxxx xxxx xxxx xxxx xxxx */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 598) DECODE_CUSTOM (0x0e400000, 0x08000000, PROBES_LDMSTM),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 599)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 600) /* STM (user registers) cccc 100x x1x0 xxxx xxxx xxxx xxxx xxxx */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 601) /* LDM (user registers) cccc 100x x1x1 xxxx 0xxx xxxx xxxx xxxx */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 602) /* LDM (exception ret) cccc 100x x1x1 xxxx 1xxx xxxx xxxx xxxx */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 603) DECODE_END
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 604) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 605)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 606) const union decode_item probes_decode_arm_table[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 607) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 608) * Unconditional instructions
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 609) * 1111 xxxx xxxx xxxx xxxx xxxx xxxx xxxx
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 610) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 611) DECODE_TABLE (0xf0000000, 0xf0000000, arm_1111_table),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 612)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 613) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 614) * Miscellaneous instructions
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 615) * cccc 0001 0xx0 xxxx xxxx xxxx 0xxx xxxx
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 616) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 617) DECODE_TABLE (0x0f900080, 0x01000000, arm_cccc_0001_0xx0____0xxx_table),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 618)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 619) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 620) * Halfword multiply and multiply-accumulate
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 621) * cccc 0001 0xx0 xxxx xxxx xxxx 1xx0 xxxx
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 622) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 623) DECODE_TABLE (0x0f900090, 0x01000080, arm_cccc_0001_0xx0____1xx0_table),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 624)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 625) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 626) * Multiply and multiply-accumulate
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 627) * cccc 0000 xxxx xxxx xxxx xxxx 1001 xxxx
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 628) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 629) DECODE_TABLE (0x0f0000f0, 0x00000090, arm_cccc_0000_____1001_table),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 630)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 631) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 632) * Synchronization primitives
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 633) * cccc 0001 xxxx xxxx xxxx xxxx 1001 xxxx
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 634) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 635) DECODE_TABLE (0x0f0000f0, 0x01000090, arm_cccc_0001_____1001_table),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 636)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 637) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 638) * Extra load/store instructions
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 639) * cccc 000x xxxx xxxx xxxx xxxx 1xx1 xxxx
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 640) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 641) DECODE_TABLE (0x0e000090, 0x00000090, arm_cccc_000x_____1xx1_table),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 642)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 643) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 644) * Data-processing (register)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 645) * cccc 000x xxxx xxxx xxxx xxxx xxx0 xxxx
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 646) * Data-processing (register-shifted register)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 647) * cccc 000x xxxx xxxx xxxx xxxx 0xx1 xxxx
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 648) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 649) DECODE_TABLE (0x0e000000, 0x00000000, arm_cccc_000x_table),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 650)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 651) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 652) * Data-processing (immediate)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 653) * cccc 001x xxxx xxxx xxxx xxxx xxxx xxxx
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 654) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 655) DECODE_TABLE (0x0e000000, 0x02000000, arm_cccc_001x_table),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 656)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 657) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 658) * Media instructions
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 659) * cccc 011x xxxx xxxx xxxx xxxx xxx1 xxxx
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 660) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 661) DECODE_TABLE (0x0f000010, 0x06000010, arm_cccc_0110_____xxx1_table),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 662) DECODE_TABLE (0x0f000010, 0x07000010, arm_cccc_0111_____xxx1_table),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 663)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 664) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 665) * Load/store word and unsigned byte
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 666) * cccc 01xx xxxx xxxx xxxx xxxx xxxx xxxx
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 667) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 668) DECODE_TABLE (0x0c000000, 0x04000000, arm_cccc_01xx_table),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 669)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 670) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 671) * Block data transfer instructions
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 672) * cccc 100x xxxx xxxx xxxx xxxx xxxx xxxx
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 673) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 674) DECODE_TABLE (0x0e000000, 0x08000000, arm_cccc_100x_table),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 675)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 676) /* B cccc 1010 xxxx xxxx xxxx xxxx xxxx xxxx */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 677) /* BL cccc 1011 xxxx xxxx xxxx xxxx xxxx xxxx */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 678) DECODE_SIMULATE (0x0e000000, 0x0a000000, PROBES_BRANCH),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 679)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 680) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 681) * Supervisor Call, and coprocessor instructions
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 682) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 683)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 684) /* MCRR cccc 1100 0100 xxxx xxxx xxxx xxxx xxxx */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 685) /* MRRC cccc 1100 0101 xxxx xxxx xxxx xxxx xxxx */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 686) /* LDC cccc 110x xxx1 xxxx xxxx xxxx xxxx xxxx */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 687) /* STC cccc 110x xxx0 xxxx xxxx xxxx xxxx xxxx */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 688) /* CDP cccc 1110 xxxx xxxx xxxx xxxx xxx0 xxxx */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 689) /* MCR cccc 1110 xxx0 xxxx xxxx xxxx xxx1 xxxx */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 690) /* MRC cccc 1110 xxx1 xxxx xxxx xxxx xxx1 xxxx */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 691) /* SVC cccc 1111 xxxx xxxx xxxx xxxx xxxx xxxx */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 692) DECODE_REJECT (0x0c000000, 0x0c000000),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 693)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 694) DECODE_END
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 695) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 696) #ifdef CONFIG_ARM_KPROBES_TEST_MODULE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 697) EXPORT_SYMBOL_GPL(probes_decode_arm_table);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 698) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 699)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 700) static void __kprobes arm_singlestep(probes_opcode_t insn,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 701) struct arch_probes_insn *asi, struct pt_regs *regs)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 702) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 703) regs->ARM_pc += 4;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 704) asi->insn_handler(insn, asi, regs);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 705) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 706)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 707) /* Return:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 708) * INSN_REJECTED If instruction is one not allowed to kprobe,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 709) * INSN_GOOD If instruction is supported and uses instruction slot,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 710) * INSN_GOOD_NO_SLOT If instruction is supported but doesn't use its slot.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 711) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 712) * For instructions we don't want to kprobe (INSN_REJECTED return result):
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 713) * These are generally ones that modify the processor state making
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 714) * them "hard" to simulate such as switches processor modes or
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 715) * make accesses in alternate modes. Any of these could be simulated
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 716) * if the work was put into it, but low return considering they
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 717) * should also be very rare.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 718) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 719) enum probes_insn __kprobes
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 720) arm_probes_decode_insn(probes_opcode_t insn, struct arch_probes_insn *asi,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 721) bool emulate, const union decode_action *actions,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 722) const struct decode_checker *checkers[])
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 723) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 724) asi->insn_singlestep = arm_singlestep;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 725) asi->insn_check_cc = probes_condition_checks[insn>>28];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 726) return probes_decode_insn(insn, asi, probes_decode_arm_table, false,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 727) emulate, actions, checkers);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 728) }