xref: /openbmc/linux/arch/arm/probes/decode-thumb.h (revision 83803d97)
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