133e53ae1SGuo Ren /* SPDX-License-Identifier: GPL-2.0+ */ 233e53ae1SGuo Ren 333e53ae1SGuo Ren #ifndef __CSKY_KERNEL_PROBES_SIMULATE_INSN_H 433e53ae1SGuo Ren #define __CSKY_KERNEL_PROBES_SIMULATE_INSN_H 533e53ae1SGuo Ren 633e53ae1SGuo Ren #define __CSKY_INSN_FUNCS(name, mask, val) \ 733e53ae1SGuo Ren static __always_inline bool csky_insn_is_##name(probe_opcode_t code) \ 833e53ae1SGuo Ren { \ 933e53ae1SGuo Ren BUILD_BUG_ON(~(mask) & (val)); \ 1033e53ae1SGuo Ren return (code & (mask)) == (val); \ 1133e53ae1SGuo Ren } \ 1233e53ae1SGuo Ren void simulate_##name(u32 opcode, long addr, struct pt_regs *regs); 1333e53ae1SGuo Ren 1433e53ae1SGuo Ren #define CSKY_INSN_SET_SIMULATE(name, code) \ 1533e53ae1SGuo Ren do { \ 1633e53ae1SGuo Ren if (csky_insn_is_##name(code)) { \ 1733e53ae1SGuo Ren api->handler = simulate_##name; \ 1833e53ae1SGuo Ren return INSN_GOOD_NO_SLOT; \ 1933e53ae1SGuo Ren } \ 2033e53ae1SGuo Ren } while (0) 2133e53ae1SGuo Ren 2233e53ae1SGuo Ren __CSKY_INSN_FUNCS(br16, 0xfc00, 0x0400) 2333e53ae1SGuo Ren __CSKY_INSN_FUNCS(bt16, 0xfc00, 0x0800) 2433e53ae1SGuo Ren __CSKY_INSN_FUNCS(bf16, 0xfc00, 0x0c00) 2533e53ae1SGuo Ren __CSKY_INSN_FUNCS(jmp16, 0xffc3, 0x7800) 2633e53ae1SGuo Ren __CSKY_INSN_FUNCS(jsr16, 0xffc3, 0x7801) 2733e53ae1SGuo Ren __CSKY_INSN_FUNCS(lrw16, 0xfc00, 0x1000) 2833e53ae1SGuo Ren __CSKY_INSN_FUNCS(pop16, 0xffe0, 0x1480) 2933e53ae1SGuo Ren 3033e53ae1SGuo Ren __CSKY_INSN_FUNCS(br32, 0x0000ffff, 0x0000e800) 3133e53ae1SGuo Ren __CSKY_INSN_FUNCS(bt32, 0x0000ffff, 0x0000e860) 3233e53ae1SGuo Ren __CSKY_INSN_FUNCS(bf32, 0x0000ffff, 0x0000e840) 3333e53ae1SGuo Ren __CSKY_INSN_FUNCS(jmp32, 0xffffffe0, 0x0000e8c0) 3433e53ae1SGuo Ren __CSKY_INSN_FUNCS(jsr32, 0xffffffe0, 0x0000e8e0) 3533e53ae1SGuo Ren __CSKY_INSN_FUNCS(lrw32, 0x0000ffe0, 0x0000ea80) 3633e53ae1SGuo Ren __CSKY_INSN_FUNCS(pop32, 0xfe00ffff, 0x0000ebc0) 3733e53ae1SGuo Ren 3833e53ae1SGuo Ren __CSKY_INSN_FUNCS(bez32, 0x0000ffe0, 0x0000e900) 3933e53ae1SGuo Ren __CSKY_INSN_FUNCS(bnez32, 0x0000ffe0, 0x0000e920) 4033e53ae1SGuo Ren __CSKY_INSN_FUNCS(bnezad32, 0x0000ffe0, 0x0000e820) 4133e53ae1SGuo Ren __CSKY_INSN_FUNCS(bhsz32, 0x0000ffe0, 0x0000e9a0) 4233e53ae1SGuo Ren __CSKY_INSN_FUNCS(bhz32, 0x0000ffe0, 0x0000e940) 4333e53ae1SGuo Ren __CSKY_INSN_FUNCS(blsz32, 0x0000ffe0, 0x0000e960) 4433e53ae1SGuo Ren __CSKY_INSN_FUNCS(blz32, 0x0000ffe0, 0x0000e980) 4533e53ae1SGuo Ren __CSKY_INSN_FUNCS(bsr32, 0x0000fc00, 0x0000e000) 4633e53ae1SGuo Ren __CSKY_INSN_FUNCS(jmpi32, 0x0000ffff, 0x0000eac0) 4733e53ae1SGuo Ren __CSKY_INSN_FUNCS(jsri32, 0x0000ffff, 0x0000eae0) 4833e53ae1SGuo Ren 4933e53ae1SGuo Ren #endif /* __CSKY_KERNEL_PROBES_SIMULATE_INSN_H */ 50