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