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