1fca08f32SWang Nan /* 2fca08f32SWang Nan * arch/arm/probes/decode-thumb.h 3fca08f32SWang Nan * 4fca08f32SWang Nan * Copyright 2013 Linaro Ltd. 5fca08f32SWang Nan * Written by: David A. Long 6fca08f32SWang Nan * 7fca08f32SWang Nan * The code contained herein is licensed under the GNU General Public 8fca08f32SWang Nan * License. You may obtain a copy of the GNU General Public License 9fca08f32SWang Nan * Version 2 or later at the following locations: 10fca08f32SWang Nan * 11fca08f32SWang Nan * http://www.opensource.org/licenses/gpl-license.html 12fca08f32SWang Nan * http://www.gnu.org/copyleft/gpl.html 13fca08f32SWang Nan */ 14fca08f32SWang Nan 15fca08f32SWang Nan #ifndef _ARM_KERNEL_PROBES_THUMB_H 16fca08f32SWang Nan #define _ARM_KERNEL_PROBES_THUMB_H 17fca08f32SWang Nan 18fca08f32SWang Nan #include "decode.h" 19fca08f32SWang Nan 20fca08f32SWang Nan /* 21fca08f32SWang Nan * True if current instruction is in an IT block. 22fca08f32SWang Nan */ 23fca08f32SWang Nan #define in_it_block(cpsr) ((cpsr & 0x06000c00) != 0x00000000) 24fca08f32SWang Nan 25fca08f32SWang Nan /* 26fca08f32SWang Nan * Return the condition code to check for the currently executing instruction. 27fca08f32SWang Nan * This is in ITSTATE<7:4> which is in CPSR<15:12> but is only valid if 28fca08f32SWang Nan * in_it_block returns true. 29fca08f32SWang Nan */ 30fca08f32SWang Nan #define current_cond(cpsr) ((cpsr >> 12) & 0xf) 31fca08f32SWang Nan 32fca08f32SWang Nan enum probes_t32_action { 33fca08f32SWang Nan PROBES_T32_EMULATE_NONE, 34fca08f32SWang Nan PROBES_T32_SIMULATE_NOP, 35fca08f32SWang Nan PROBES_T32_LDMSTM, 36fca08f32SWang Nan PROBES_T32_LDRDSTRD, 37fca08f32SWang Nan PROBES_T32_TABLE_BRANCH, 38fca08f32SWang Nan PROBES_T32_TST, 39fca08f32SWang Nan PROBES_T32_CMP, 40fca08f32SWang Nan PROBES_T32_MOV, 41fca08f32SWang Nan PROBES_T32_ADDSUB, 42fca08f32SWang Nan PROBES_T32_LOGICAL, 43fca08f32SWang Nan PROBES_T32_ADDWSUBW_PC, 44fca08f32SWang Nan PROBES_T32_ADDWSUBW, 45fca08f32SWang Nan PROBES_T32_MOVW, 46fca08f32SWang Nan PROBES_T32_SAT, 47fca08f32SWang Nan PROBES_T32_BITFIELD, 48fca08f32SWang Nan PROBES_T32_SEV, 49fca08f32SWang Nan PROBES_T32_WFE, 50fca08f32SWang Nan PROBES_T32_MRS, 51fca08f32SWang Nan PROBES_T32_BRANCH_COND, 52fca08f32SWang Nan PROBES_T32_BRANCH, 53fca08f32SWang Nan PROBES_T32_PLDI, 54fca08f32SWang Nan PROBES_T32_LDR_LIT, 55fca08f32SWang Nan PROBES_T32_LDRSTR, 56fca08f32SWang Nan PROBES_T32_SIGN_EXTEND, 57fca08f32SWang Nan PROBES_T32_MEDIA, 58fca08f32SWang Nan PROBES_T32_REVERSE, 59fca08f32SWang Nan PROBES_T32_MUL_ADD, 60fca08f32SWang Nan PROBES_T32_MUL_ADD2, 61fca08f32SWang Nan PROBES_T32_MUL_ADD_LONG, 62fca08f32SWang Nan NUM_PROBES_T32_ACTIONS 63fca08f32SWang Nan }; 64fca08f32SWang Nan 65fca08f32SWang Nan enum probes_t16_action { 66fca08f32SWang Nan PROBES_T16_ADD_SP, 67fca08f32SWang Nan PROBES_T16_CBZ, 68fca08f32SWang Nan PROBES_T16_SIGN_EXTEND, 69fca08f32SWang Nan PROBES_T16_PUSH, 70fca08f32SWang Nan PROBES_T16_POP, 71fca08f32SWang Nan PROBES_T16_SEV, 72fca08f32SWang Nan PROBES_T16_WFE, 73fca08f32SWang Nan PROBES_T16_IT, 74fca08f32SWang Nan PROBES_T16_CMP, 75fca08f32SWang Nan PROBES_T16_ADDSUB, 76fca08f32SWang Nan PROBES_T16_LOGICAL, 77fca08f32SWang Nan PROBES_T16_BLX, 78fca08f32SWang Nan PROBES_T16_HIREGOPS, 79fca08f32SWang Nan PROBES_T16_LDR_LIT, 80fca08f32SWang Nan PROBES_T16_LDRHSTRH, 81fca08f32SWang Nan PROBES_T16_LDRSTR, 82fca08f32SWang Nan PROBES_T16_ADR, 83fca08f32SWang Nan PROBES_T16_LDMSTM, 84fca08f32SWang Nan PROBES_T16_BRANCH_COND, 85fca08f32SWang Nan PROBES_T16_BRANCH, 86fca08f32SWang Nan NUM_PROBES_T16_ACTIONS 87fca08f32SWang Nan }; 88fca08f32SWang Nan 89fca08f32SWang Nan extern const union decode_item probes_decode_thumb32_table[]; 90fca08f32SWang Nan extern const union decode_item probes_decode_thumb16_table[]; 91fca08f32SWang Nan 92fca08f32SWang Nan enum probes_insn __kprobes 93fca08f32SWang Nan thumb16_probes_decode_insn(probes_opcode_t insn, struct arch_probes_insn *asi, 9483803d97SWang Nan bool emulate, const union decode_action *actions, 9583803d97SWang Nan const struct decode_checker *checkers[]); 96fca08f32SWang Nan enum probes_insn __kprobes 97fca08f32SWang Nan thumb32_probes_decode_insn(probes_opcode_t insn, struct arch_probes_insn *asi, 9883803d97SWang Nan bool emulate, const union decode_action *actions, 9983803d97SWang Nan const struct decode_checker *checkers[]); 100fca08f32SWang Nan 101fca08f32SWang Nan #endif 102