xref: /linux/arch/csky/kernel/probes/simulate-insn.h (revision ead5d1f4d877e92c051e1a1ade623d0d30e71619)
1*33e53ae1SGuo Ren /* SPDX-License-Identifier: GPL-2.0+ */
2*33e53ae1SGuo Ren 
3*33e53ae1SGuo Ren #ifndef __CSKY_KERNEL_PROBES_SIMULATE_INSN_H
4*33e53ae1SGuo Ren #define __CSKY_KERNEL_PROBES_SIMULATE_INSN_H
5*33e53ae1SGuo Ren 
6*33e53ae1SGuo Ren #define __CSKY_INSN_FUNCS(name, mask, val)				\
7*33e53ae1SGuo Ren static __always_inline bool csky_insn_is_##name(probe_opcode_t code)	\
8*33e53ae1SGuo Ren {									\
9*33e53ae1SGuo Ren 	BUILD_BUG_ON(~(mask) & (val));					\
10*33e53ae1SGuo Ren 	return (code & (mask)) == (val);				\
11*33e53ae1SGuo Ren }									\
12*33e53ae1SGuo Ren void simulate_##name(u32 opcode, long addr, struct pt_regs *regs);
13*33e53ae1SGuo Ren 
14*33e53ae1SGuo Ren #define CSKY_INSN_SET_SIMULATE(name, code)				\
15*33e53ae1SGuo Ren 	do {								\
16*33e53ae1SGuo Ren 		if (csky_insn_is_##name(code)) {			\
17*33e53ae1SGuo Ren 			api->handler = simulate_##name;			\
18*33e53ae1SGuo Ren 			return INSN_GOOD_NO_SLOT;			\
19*33e53ae1SGuo Ren 		}							\
20*33e53ae1SGuo Ren 	} while (0)
21*33e53ae1SGuo Ren 
22*33e53ae1SGuo Ren __CSKY_INSN_FUNCS(br16,		0xfc00, 0x0400)
23*33e53ae1SGuo Ren __CSKY_INSN_FUNCS(bt16,		0xfc00, 0x0800)
24*33e53ae1SGuo Ren __CSKY_INSN_FUNCS(bf16,		0xfc00, 0x0c00)
25*33e53ae1SGuo Ren __CSKY_INSN_FUNCS(jmp16,	0xffc3, 0x7800)
26*33e53ae1SGuo Ren __CSKY_INSN_FUNCS(jsr16,	0xffc3, 0x7801)
27*33e53ae1SGuo Ren __CSKY_INSN_FUNCS(lrw16,	0xfc00, 0x1000)
28*33e53ae1SGuo Ren __CSKY_INSN_FUNCS(pop16,	0xffe0, 0x1480)
29*33e53ae1SGuo Ren 
30*33e53ae1SGuo Ren __CSKY_INSN_FUNCS(br32,		0x0000ffff, 0x0000e800)
31*33e53ae1SGuo Ren __CSKY_INSN_FUNCS(bt32,		0x0000ffff, 0x0000e860)
32*33e53ae1SGuo Ren __CSKY_INSN_FUNCS(bf32,		0x0000ffff, 0x0000e840)
33*33e53ae1SGuo Ren __CSKY_INSN_FUNCS(jmp32,	0xffffffe0, 0x0000e8c0)
34*33e53ae1SGuo Ren __CSKY_INSN_FUNCS(jsr32,	0xffffffe0, 0x0000e8e0)
35*33e53ae1SGuo Ren __CSKY_INSN_FUNCS(lrw32,	0x0000ffe0, 0x0000ea80)
36*33e53ae1SGuo Ren __CSKY_INSN_FUNCS(pop32,	0xfe00ffff, 0x0000ebc0)
37*33e53ae1SGuo Ren 
38*33e53ae1SGuo Ren __CSKY_INSN_FUNCS(bez32,	0x0000ffe0, 0x0000e900)
39*33e53ae1SGuo Ren __CSKY_INSN_FUNCS(bnez32,	0x0000ffe0, 0x0000e920)
40*33e53ae1SGuo Ren __CSKY_INSN_FUNCS(bnezad32,	0x0000ffe0, 0x0000e820)
41*33e53ae1SGuo Ren __CSKY_INSN_FUNCS(bhsz32,	0x0000ffe0, 0x0000e9a0)
42*33e53ae1SGuo Ren __CSKY_INSN_FUNCS(bhz32,	0x0000ffe0, 0x0000e940)
43*33e53ae1SGuo Ren __CSKY_INSN_FUNCS(blsz32,	0x0000ffe0, 0x0000e960)
44*33e53ae1SGuo Ren __CSKY_INSN_FUNCS(blz32,	0x0000ffe0, 0x0000e980)
45*33e53ae1SGuo Ren __CSKY_INSN_FUNCS(bsr32,	0x0000fc00, 0x0000e000)
46*33e53ae1SGuo Ren __CSKY_INSN_FUNCS(jmpi32,	0x0000ffff, 0x0000eac0)
47*33e53ae1SGuo Ren __CSKY_INSN_FUNCS(jsri32,	0x0000ffff, 0x0000eae0)
48*33e53ae1SGuo Ren 
49*33e53ae1SGuo Ren #endif /* __CSKY_KERNEL_PROBES_SIMULATE_INSN_H */
50