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