18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-or-later */ 28c2ecf20Sopenharmony_ci/* 38c2ecf20Sopenharmony_ci * arch/arm/probes/decode-thumb.h 48c2ecf20Sopenharmony_ci * 58c2ecf20Sopenharmony_ci * Copyright 2013 Linaro Ltd. 68c2ecf20Sopenharmony_ci * Written by: David A. Long 78c2ecf20Sopenharmony_ci */ 88c2ecf20Sopenharmony_ci 98c2ecf20Sopenharmony_ci#ifndef _ARM_KERNEL_PROBES_THUMB_H 108c2ecf20Sopenharmony_ci#define _ARM_KERNEL_PROBES_THUMB_H 118c2ecf20Sopenharmony_ci 128c2ecf20Sopenharmony_ci#include "decode.h" 138c2ecf20Sopenharmony_ci 148c2ecf20Sopenharmony_ci/* 158c2ecf20Sopenharmony_ci * True if current instruction is in an IT block. 168c2ecf20Sopenharmony_ci */ 178c2ecf20Sopenharmony_ci#define in_it_block(cpsr) ((cpsr & 0x06000c00) != 0x00000000) 188c2ecf20Sopenharmony_ci 198c2ecf20Sopenharmony_ci/* 208c2ecf20Sopenharmony_ci * Return the condition code to check for the currently executing instruction. 218c2ecf20Sopenharmony_ci * This is in ITSTATE<7:4> which is in CPSR<15:12> but is only valid if 228c2ecf20Sopenharmony_ci * in_it_block returns true. 238c2ecf20Sopenharmony_ci */ 248c2ecf20Sopenharmony_ci#define current_cond(cpsr) ((cpsr >> 12) & 0xf) 258c2ecf20Sopenharmony_ci 268c2ecf20Sopenharmony_cienum probes_t32_action { 278c2ecf20Sopenharmony_ci PROBES_T32_EMULATE_NONE, 288c2ecf20Sopenharmony_ci PROBES_T32_SIMULATE_NOP, 298c2ecf20Sopenharmony_ci PROBES_T32_LDMSTM, 308c2ecf20Sopenharmony_ci PROBES_T32_LDRDSTRD, 318c2ecf20Sopenharmony_ci PROBES_T32_TABLE_BRANCH, 328c2ecf20Sopenharmony_ci PROBES_T32_TST, 338c2ecf20Sopenharmony_ci PROBES_T32_CMP, 348c2ecf20Sopenharmony_ci PROBES_T32_MOV, 358c2ecf20Sopenharmony_ci PROBES_T32_ADDSUB, 368c2ecf20Sopenharmony_ci PROBES_T32_LOGICAL, 378c2ecf20Sopenharmony_ci PROBES_T32_ADDWSUBW_PC, 388c2ecf20Sopenharmony_ci PROBES_T32_ADDWSUBW, 398c2ecf20Sopenharmony_ci PROBES_T32_MOVW, 408c2ecf20Sopenharmony_ci PROBES_T32_SAT, 418c2ecf20Sopenharmony_ci PROBES_T32_BITFIELD, 428c2ecf20Sopenharmony_ci PROBES_T32_SEV, 438c2ecf20Sopenharmony_ci PROBES_T32_WFE, 448c2ecf20Sopenharmony_ci PROBES_T32_MRS, 458c2ecf20Sopenharmony_ci PROBES_T32_BRANCH_COND, 468c2ecf20Sopenharmony_ci PROBES_T32_BRANCH, 478c2ecf20Sopenharmony_ci PROBES_T32_PLDI, 488c2ecf20Sopenharmony_ci PROBES_T32_LDR_LIT, 498c2ecf20Sopenharmony_ci PROBES_T32_LDRSTR, 508c2ecf20Sopenharmony_ci PROBES_T32_SIGN_EXTEND, 518c2ecf20Sopenharmony_ci PROBES_T32_MEDIA, 528c2ecf20Sopenharmony_ci PROBES_T32_REVERSE, 538c2ecf20Sopenharmony_ci PROBES_T32_MUL_ADD, 548c2ecf20Sopenharmony_ci PROBES_T32_MUL_ADD2, 558c2ecf20Sopenharmony_ci PROBES_T32_MUL_ADD_LONG, 568c2ecf20Sopenharmony_ci NUM_PROBES_T32_ACTIONS 578c2ecf20Sopenharmony_ci}; 588c2ecf20Sopenharmony_ci 598c2ecf20Sopenharmony_cienum probes_t16_action { 608c2ecf20Sopenharmony_ci PROBES_T16_ADD_SP, 618c2ecf20Sopenharmony_ci PROBES_T16_CBZ, 628c2ecf20Sopenharmony_ci PROBES_T16_SIGN_EXTEND, 638c2ecf20Sopenharmony_ci PROBES_T16_PUSH, 648c2ecf20Sopenharmony_ci PROBES_T16_POP, 658c2ecf20Sopenharmony_ci PROBES_T16_SEV, 668c2ecf20Sopenharmony_ci PROBES_T16_WFE, 678c2ecf20Sopenharmony_ci PROBES_T16_IT, 688c2ecf20Sopenharmony_ci PROBES_T16_CMP, 698c2ecf20Sopenharmony_ci PROBES_T16_ADDSUB, 708c2ecf20Sopenharmony_ci PROBES_T16_LOGICAL, 718c2ecf20Sopenharmony_ci PROBES_T16_BLX, 728c2ecf20Sopenharmony_ci PROBES_T16_HIREGOPS, 738c2ecf20Sopenharmony_ci PROBES_T16_LDR_LIT, 748c2ecf20Sopenharmony_ci PROBES_T16_LDRHSTRH, 758c2ecf20Sopenharmony_ci PROBES_T16_LDRSTR, 768c2ecf20Sopenharmony_ci PROBES_T16_ADR, 778c2ecf20Sopenharmony_ci PROBES_T16_LDMSTM, 788c2ecf20Sopenharmony_ci PROBES_T16_BRANCH_COND, 798c2ecf20Sopenharmony_ci PROBES_T16_BRANCH, 808c2ecf20Sopenharmony_ci NUM_PROBES_T16_ACTIONS 818c2ecf20Sopenharmony_ci}; 828c2ecf20Sopenharmony_ci 838c2ecf20Sopenharmony_ciextern const union decode_item probes_decode_thumb32_table[]; 848c2ecf20Sopenharmony_ciextern const union decode_item probes_decode_thumb16_table[]; 858c2ecf20Sopenharmony_ci 868c2ecf20Sopenharmony_cienum probes_insn __kprobes 878c2ecf20Sopenharmony_cithumb16_probes_decode_insn(probes_opcode_t insn, struct arch_probes_insn *asi, 888c2ecf20Sopenharmony_ci bool emulate, const union decode_action *actions, 898c2ecf20Sopenharmony_ci const struct decode_checker *checkers[]); 908c2ecf20Sopenharmony_cienum probes_insn __kprobes 918c2ecf20Sopenharmony_cithumb32_probes_decode_insn(probes_opcode_t insn, struct arch_probes_insn *asi, 928c2ecf20Sopenharmony_ci bool emulate, const union decode_action *actions, 938c2ecf20Sopenharmony_ci const struct decode_checker *checkers[]); 948c2ecf20Sopenharmony_ci 958c2ecf20Sopenharmony_ci#endif 96