162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-or-later */ 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * arch/arm/probes/decode-thumb.h 462306a36Sopenharmony_ci * 562306a36Sopenharmony_ci * Copyright 2013 Linaro Ltd. 662306a36Sopenharmony_ci * Written by: David A. Long 762306a36Sopenharmony_ci */ 862306a36Sopenharmony_ci 962306a36Sopenharmony_ci#ifndef _ARM_KERNEL_PROBES_THUMB_H 1062306a36Sopenharmony_ci#define _ARM_KERNEL_PROBES_THUMB_H 1162306a36Sopenharmony_ci 1262306a36Sopenharmony_ci#include "decode.h" 1362306a36Sopenharmony_ci 1462306a36Sopenharmony_ci/* 1562306a36Sopenharmony_ci * True if current instruction is in an IT block. 1662306a36Sopenharmony_ci */ 1762306a36Sopenharmony_ci#define in_it_block(cpsr) ((cpsr & 0x06000c00) != 0x00000000) 1862306a36Sopenharmony_ci 1962306a36Sopenharmony_ci/* 2062306a36Sopenharmony_ci * Return the condition code to check for the currently executing instruction. 2162306a36Sopenharmony_ci * This is in ITSTATE<7:4> which is in CPSR<15:12> but is only valid if 2262306a36Sopenharmony_ci * in_it_block returns true. 2362306a36Sopenharmony_ci */ 2462306a36Sopenharmony_ci#define current_cond(cpsr) ((cpsr >> 12) & 0xf) 2562306a36Sopenharmony_ci 2662306a36Sopenharmony_cienum probes_t32_action { 2762306a36Sopenharmony_ci PROBES_T32_EMULATE_NONE, 2862306a36Sopenharmony_ci PROBES_T32_SIMULATE_NOP, 2962306a36Sopenharmony_ci PROBES_T32_LDMSTM, 3062306a36Sopenharmony_ci PROBES_T32_LDRDSTRD, 3162306a36Sopenharmony_ci PROBES_T32_TABLE_BRANCH, 3262306a36Sopenharmony_ci PROBES_T32_TST, 3362306a36Sopenharmony_ci PROBES_T32_CMP, 3462306a36Sopenharmony_ci PROBES_T32_MOV, 3562306a36Sopenharmony_ci PROBES_T32_ADDSUB, 3662306a36Sopenharmony_ci PROBES_T32_LOGICAL, 3762306a36Sopenharmony_ci PROBES_T32_ADDWSUBW_PC, 3862306a36Sopenharmony_ci PROBES_T32_ADDWSUBW, 3962306a36Sopenharmony_ci PROBES_T32_MOVW, 4062306a36Sopenharmony_ci PROBES_T32_SAT, 4162306a36Sopenharmony_ci PROBES_T32_BITFIELD, 4262306a36Sopenharmony_ci PROBES_T32_SEV, 4362306a36Sopenharmony_ci PROBES_T32_WFE, 4462306a36Sopenharmony_ci PROBES_T32_MRS, 4562306a36Sopenharmony_ci PROBES_T32_BRANCH_COND, 4662306a36Sopenharmony_ci PROBES_T32_BRANCH, 4762306a36Sopenharmony_ci PROBES_T32_PLDI, 4862306a36Sopenharmony_ci PROBES_T32_LDR_LIT, 4962306a36Sopenharmony_ci PROBES_T32_LDRSTR, 5062306a36Sopenharmony_ci PROBES_T32_SIGN_EXTEND, 5162306a36Sopenharmony_ci PROBES_T32_MEDIA, 5262306a36Sopenharmony_ci PROBES_T32_REVERSE, 5362306a36Sopenharmony_ci PROBES_T32_MUL_ADD, 5462306a36Sopenharmony_ci PROBES_T32_MUL_ADD2, 5562306a36Sopenharmony_ci PROBES_T32_MUL_ADD_LONG, 5662306a36Sopenharmony_ci NUM_PROBES_T32_ACTIONS 5762306a36Sopenharmony_ci}; 5862306a36Sopenharmony_ci 5962306a36Sopenharmony_cienum probes_t16_action { 6062306a36Sopenharmony_ci PROBES_T16_ADD_SP, 6162306a36Sopenharmony_ci PROBES_T16_CBZ, 6262306a36Sopenharmony_ci PROBES_T16_SIGN_EXTEND, 6362306a36Sopenharmony_ci PROBES_T16_PUSH, 6462306a36Sopenharmony_ci PROBES_T16_POP, 6562306a36Sopenharmony_ci PROBES_T16_SEV, 6662306a36Sopenharmony_ci PROBES_T16_WFE, 6762306a36Sopenharmony_ci PROBES_T16_IT, 6862306a36Sopenharmony_ci PROBES_T16_CMP, 6962306a36Sopenharmony_ci PROBES_T16_ADDSUB, 7062306a36Sopenharmony_ci PROBES_T16_LOGICAL, 7162306a36Sopenharmony_ci PROBES_T16_BLX, 7262306a36Sopenharmony_ci PROBES_T16_HIREGOPS, 7362306a36Sopenharmony_ci PROBES_T16_LDR_LIT, 7462306a36Sopenharmony_ci PROBES_T16_LDRHSTRH, 7562306a36Sopenharmony_ci PROBES_T16_LDRSTR, 7662306a36Sopenharmony_ci PROBES_T16_ADR, 7762306a36Sopenharmony_ci PROBES_T16_LDMSTM, 7862306a36Sopenharmony_ci PROBES_T16_BRANCH_COND, 7962306a36Sopenharmony_ci PROBES_T16_BRANCH, 8062306a36Sopenharmony_ci NUM_PROBES_T16_ACTIONS 8162306a36Sopenharmony_ci}; 8262306a36Sopenharmony_ci 8362306a36Sopenharmony_ciextern const union decode_item probes_decode_thumb32_table[]; 8462306a36Sopenharmony_ciextern const union decode_item probes_decode_thumb16_table[]; 8562306a36Sopenharmony_ci 8662306a36Sopenharmony_cienum probes_insn __kprobes 8762306a36Sopenharmony_cithumb16_probes_decode_insn(probes_opcode_t insn, struct arch_probes_insn *asi, 8862306a36Sopenharmony_ci bool emulate, const union decode_action *actions, 8962306a36Sopenharmony_ci const struct decode_checker *checkers[]); 9062306a36Sopenharmony_cienum probes_insn __kprobes 9162306a36Sopenharmony_cithumb32_probes_decode_insn(probes_opcode_t insn, struct arch_probes_insn *asi, 9262306a36Sopenharmony_ci bool emulate, const union decode_action *actions, 9362306a36Sopenharmony_ci const struct decode_checker *checkers[]); 9462306a36Sopenharmony_ci 9562306a36Sopenharmony_ci#endif 96