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