187abef63ead5ac9e2c67f0c07c461eda6be16aebDavid A. Long/* 287abef63ead5ac9e2c67f0c07c461eda6be16aebDavid A. Long * arch/arm/kernel/probes-thumb.h 387abef63ead5ac9e2c67f0c07c461eda6be16aebDavid A. Long * 487abef63ead5ac9e2c67f0c07c461eda6be16aebDavid A. Long * Copyright 2013 Linaro Ltd. 587abef63ead5ac9e2c67f0c07c461eda6be16aebDavid A. Long * Written by: David A. Long 687abef63ead5ac9e2c67f0c07c461eda6be16aebDavid A. Long * 787abef63ead5ac9e2c67f0c07c461eda6be16aebDavid A. Long * The code contained herein is licensed under the GNU General Public 887abef63ead5ac9e2c67f0c07c461eda6be16aebDavid A. Long * License. You may obtain a copy of the GNU General Public License 987abef63ead5ac9e2c67f0c07c461eda6be16aebDavid A. Long * Version 2 or later at the following locations: 1087abef63ead5ac9e2c67f0c07c461eda6be16aebDavid A. Long * 1187abef63ead5ac9e2c67f0c07c461eda6be16aebDavid A. Long * http://www.opensource.org/licenses/gpl-license.html 1287abef63ead5ac9e2c67f0c07c461eda6be16aebDavid A. Long * http://www.gnu.org/copyleft/gpl.html 1387abef63ead5ac9e2c67f0c07c461eda6be16aebDavid A. Long */ 1487abef63ead5ac9e2c67f0c07c461eda6be16aebDavid A. Long 1587abef63ead5ac9e2c67f0c07c461eda6be16aebDavid A. Long#ifndef _ARM_KERNEL_PROBES_THUMB_H 1687abef63ead5ac9e2c67f0c07c461eda6be16aebDavid A. Long#define _ARM_KERNEL_PROBES_THUMB_H 1787abef63ead5ac9e2c67f0c07c461eda6be16aebDavid A. Long 1887abef63ead5ac9e2c67f0c07c461eda6be16aebDavid A. Long/* 1987abef63ead5ac9e2c67f0c07c461eda6be16aebDavid A. Long * True if current instruction is in an IT block. 2087abef63ead5ac9e2c67f0c07c461eda6be16aebDavid A. Long */ 2187abef63ead5ac9e2c67f0c07c461eda6be16aebDavid A. Long#define in_it_block(cpsr) ((cpsr & 0x06000c00) != 0x00000000) 2287abef63ead5ac9e2c67f0c07c461eda6be16aebDavid A. Long 2387abef63ead5ac9e2c67f0c07c461eda6be16aebDavid A. Long/* 2487abef63ead5ac9e2c67f0c07c461eda6be16aebDavid A. Long * Return the condition code to check for the currently executing instruction. 2587abef63ead5ac9e2c67f0c07c461eda6be16aebDavid A. Long * This is in ITSTATE<7:4> which is in CPSR<15:12> but is only valid if 2687abef63ead5ac9e2c67f0c07c461eda6be16aebDavid A. Long * in_it_block returns true. 2787abef63ead5ac9e2c67f0c07c461eda6be16aebDavid A. Long */ 2887abef63ead5ac9e2c67f0c07c461eda6be16aebDavid A. Long#define current_cond(cpsr) ((cpsr >> 12) & 0xf) 2987abef63ead5ac9e2c67f0c07c461eda6be16aebDavid A. Long 303e6cd394bb10c2d65322e5f5d2ff0a9074d903a1David A. Longenum probes_t32_action { 313e6cd394bb10c2d65322e5f5d2ff0a9074d903a1David A. Long PROBES_T32_EMULATE_NONE, 323e6cd394bb10c2d65322e5f5d2ff0a9074d903a1David A. Long PROBES_T32_SIMULATE_NOP, 333e6cd394bb10c2d65322e5f5d2ff0a9074d903a1David A. Long PROBES_T32_LDMSTM, 343e6cd394bb10c2d65322e5f5d2ff0a9074d903a1David A. Long PROBES_T32_LDRDSTRD, 353e6cd394bb10c2d65322e5f5d2ff0a9074d903a1David A. Long PROBES_T32_TABLE_BRANCH, 363e6cd394bb10c2d65322e5f5d2ff0a9074d903a1David A. Long PROBES_T32_TST, 373e6cd394bb10c2d65322e5f5d2ff0a9074d903a1David A. Long PROBES_T32_CMP, 383e6cd394bb10c2d65322e5f5d2ff0a9074d903a1David A. Long PROBES_T32_MOV, 393e6cd394bb10c2d65322e5f5d2ff0a9074d903a1David A. Long PROBES_T32_ADDSUB, 403e6cd394bb10c2d65322e5f5d2ff0a9074d903a1David A. Long PROBES_T32_LOGICAL, 413e6cd394bb10c2d65322e5f5d2ff0a9074d903a1David A. Long PROBES_T32_ADDWSUBW_PC, 423e6cd394bb10c2d65322e5f5d2ff0a9074d903a1David A. Long PROBES_T32_ADDWSUBW, 433e6cd394bb10c2d65322e5f5d2ff0a9074d903a1David A. Long PROBES_T32_MOVW, 443e6cd394bb10c2d65322e5f5d2ff0a9074d903a1David A. Long PROBES_T32_SAT, 453e6cd394bb10c2d65322e5f5d2ff0a9074d903a1David A. Long PROBES_T32_BITFIELD, 463e6cd394bb10c2d65322e5f5d2ff0a9074d903a1David A. Long PROBES_T32_SEV, 473e6cd394bb10c2d65322e5f5d2ff0a9074d903a1David A. Long PROBES_T32_WFE, 483e6cd394bb10c2d65322e5f5d2ff0a9074d903a1David A. Long PROBES_T32_MRS, 493e6cd394bb10c2d65322e5f5d2ff0a9074d903a1David A. Long PROBES_T32_BRANCH_COND, 503e6cd394bb10c2d65322e5f5d2ff0a9074d903a1David A. Long PROBES_T32_BRANCH, 513e6cd394bb10c2d65322e5f5d2ff0a9074d903a1David A. Long PROBES_T32_PLDI, 523e6cd394bb10c2d65322e5f5d2ff0a9074d903a1David A. Long PROBES_T32_LDR_LIT, 533e6cd394bb10c2d65322e5f5d2ff0a9074d903a1David A. Long PROBES_T32_LDRSTR, 543e6cd394bb10c2d65322e5f5d2ff0a9074d903a1David A. Long PROBES_T32_SIGN_EXTEND, 553e6cd394bb10c2d65322e5f5d2ff0a9074d903a1David A. Long PROBES_T32_MEDIA, 563e6cd394bb10c2d65322e5f5d2ff0a9074d903a1David A. Long PROBES_T32_REVERSE, 573e6cd394bb10c2d65322e5f5d2ff0a9074d903a1David A. Long PROBES_T32_MUL_ADD, 583e6cd394bb10c2d65322e5f5d2ff0a9074d903a1David A. Long PROBES_T32_MUL_ADD2, 593e6cd394bb10c2d65322e5f5d2ff0a9074d903a1David A. Long PROBES_T32_MUL_ADD_LONG, 603e6cd394bb10c2d65322e5f5d2ff0a9074d903a1David A. Long NUM_PROBES_T32_ACTIONS 613e6cd394bb10c2d65322e5f5d2ff0a9074d903a1David A. Long}; 6287abef63ead5ac9e2c67f0c07c461eda6be16aebDavid A. Long 633e6cd394bb10c2d65322e5f5d2ff0a9074d903a1David A. Longenum probes_t16_action { 643e6cd394bb10c2d65322e5f5d2ff0a9074d903a1David A. Long PROBES_T16_ADD_SP, 653e6cd394bb10c2d65322e5f5d2ff0a9074d903a1David A. Long PROBES_T16_CBZ, 663e6cd394bb10c2d65322e5f5d2ff0a9074d903a1David A. Long PROBES_T16_SIGN_EXTEND, 673e6cd394bb10c2d65322e5f5d2ff0a9074d903a1David A. Long PROBES_T16_PUSH, 683e6cd394bb10c2d65322e5f5d2ff0a9074d903a1David A. Long PROBES_T16_POP, 693e6cd394bb10c2d65322e5f5d2ff0a9074d903a1David A. Long PROBES_T16_SEV, 703e6cd394bb10c2d65322e5f5d2ff0a9074d903a1David A. Long PROBES_T16_WFE, 713e6cd394bb10c2d65322e5f5d2ff0a9074d903a1David A. Long PROBES_T16_IT, 723e6cd394bb10c2d65322e5f5d2ff0a9074d903a1David A. Long PROBES_T16_CMP, 733e6cd394bb10c2d65322e5f5d2ff0a9074d903a1David A. Long PROBES_T16_ADDSUB, 743e6cd394bb10c2d65322e5f5d2ff0a9074d903a1David A. Long PROBES_T16_LOGICAL, 753e6cd394bb10c2d65322e5f5d2ff0a9074d903a1David A. Long PROBES_T16_BLX, 763e6cd394bb10c2d65322e5f5d2ff0a9074d903a1David A. Long PROBES_T16_HIREGOPS, 773e6cd394bb10c2d65322e5f5d2ff0a9074d903a1David A. Long PROBES_T16_LDR_LIT, 783e6cd394bb10c2d65322e5f5d2ff0a9074d903a1David A. Long PROBES_T16_LDRHSTRH, 793e6cd394bb10c2d65322e5f5d2ff0a9074d903a1David A. Long PROBES_T16_LDRSTR, 803e6cd394bb10c2d65322e5f5d2ff0a9074d903a1David A. Long PROBES_T16_ADR, 813e6cd394bb10c2d65322e5f5d2ff0a9074d903a1David A. Long PROBES_T16_LDMSTM, 823e6cd394bb10c2d65322e5f5d2ff0a9074d903a1David A. Long PROBES_T16_BRANCH_COND, 833e6cd394bb10c2d65322e5f5d2ff0a9074d903a1David A. Long PROBES_T16_BRANCH, 843e6cd394bb10c2d65322e5f5d2ff0a9074d903a1David A. Long NUM_PROBES_T16_ACTIONS 853e6cd394bb10c2d65322e5f5d2ff0a9074d903a1David A. Long}; 8687abef63ead5ac9e2c67f0c07c461eda6be16aebDavid A. Long 8747e190fafde49ff8ca732fa137e39cb2b8baba8cDavid A. Longextern const union decode_item probes_decode_thumb32_table[]; 8847e190fafde49ff8ca732fa137e39cb2b8baba8cDavid A. Longextern const union decode_item probes_decode_thumb16_table[]; 8947e190fafde49ff8ca732fa137e39cb2b8baba8cDavid A. Long 9047e190fafde49ff8ca732fa137e39cb2b8baba8cDavid A. Longenum probes_insn __kprobes 91b4cd605ca92d9a8a2f71355cb45dd943ebcb0c97David A. Longthumb16_probes_decode_insn(probes_opcode_t insn, struct arch_probes_insn *asi, 92602cd2609eee92d338a83e400774e97c60535ba2David A. Long bool emulate, const union decode_action *actions); 9347e190fafde49ff8ca732fa137e39cb2b8baba8cDavid A. Longenum probes_insn __kprobes 94b4cd605ca92d9a8a2f71355cb45dd943ebcb0c97David A. Longthumb32_probes_decode_insn(probes_opcode_t insn, struct arch_probes_insn *asi, 95602cd2609eee92d338a83e400774e97c60535ba2David A. Long bool emulate, const union decode_action *actions); 9647e190fafde49ff8ca732fa137e39cb2b8baba8cDavid A. Long 9787abef63ead5ac9e2c67f0c07c461eda6be16aebDavid A. Long#endif 98