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