xref: /openbmc/linux/arch/loongarch/include/asm/uprobes.h (revision 2612e3bbc0386368a850140a6c9b990cd496a5ec)
1*19bc6cb6STiezhu Yang /* SPDX-License-Identifier: GPL-2.0-only */
2*19bc6cb6STiezhu Yang #ifndef __ASM_LOONGARCH_UPROBES_H
3*19bc6cb6STiezhu Yang #define __ASM_LOONGARCH_UPROBES_H
4*19bc6cb6STiezhu Yang 
5*19bc6cb6STiezhu Yang #include <asm/inst.h>
6*19bc6cb6STiezhu Yang 
7*19bc6cb6STiezhu Yang typedef u32 uprobe_opcode_t;
8*19bc6cb6STiezhu Yang 
9*19bc6cb6STiezhu Yang #define MAX_UINSN_BYTES		8
10*19bc6cb6STiezhu Yang #define UPROBE_XOL_SLOT_BYTES	MAX_UINSN_BYTES
11*19bc6cb6STiezhu Yang 
12*19bc6cb6STiezhu Yang #define UPROBE_SWBP_INSN	larch_insn_gen_break(BRK_UPROBE_BP)
13*19bc6cb6STiezhu Yang #define UPROBE_SWBP_INSN_SIZE	LOONGARCH_INSN_SIZE
14*19bc6cb6STiezhu Yang 
15*19bc6cb6STiezhu Yang #define UPROBE_XOLBP_INSN	larch_insn_gen_break(BRK_UPROBE_XOLBP)
16*19bc6cb6STiezhu Yang 
17*19bc6cb6STiezhu Yang struct arch_uprobe {
18*19bc6cb6STiezhu Yang 	unsigned long	resume_era;
19*19bc6cb6STiezhu Yang 	u32	insn[2];
20*19bc6cb6STiezhu Yang 	u32	ixol[2];
21*19bc6cb6STiezhu Yang 	bool	simulate;
22*19bc6cb6STiezhu Yang };
23*19bc6cb6STiezhu Yang 
24*19bc6cb6STiezhu Yang struct arch_uprobe_task {
25*19bc6cb6STiezhu Yang 	unsigned long saved_trap_nr;
26*19bc6cb6STiezhu Yang };
27*19bc6cb6STiezhu Yang 
28*19bc6cb6STiezhu Yang #ifdef CONFIG_UPROBES
29*19bc6cb6STiezhu Yang bool uprobe_breakpoint_handler(struct pt_regs *regs);
30*19bc6cb6STiezhu Yang bool uprobe_singlestep_handler(struct pt_regs *regs);
31*19bc6cb6STiezhu Yang #else /* !CONFIG_UPROBES */
uprobe_breakpoint_handler(struct pt_regs * regs)32*19bc6cb6STiezhu Yang static inline bool uprobe_breakpoint_handler(struct pt_regs *regs) { return false; }
uprobe_singlestep_handler(struct pt_regs * regs)33*19bc6cb6STiezhu Yang static inline bool uprobe_singlestep_handler(struct pt_regs *regs) { return false; }
34*19bc6cb6STiezhu Yang #endif /* CONFIG_UPROBES */
35*19bc6cb6STiezhu Yang 
36*19bc6cb6STiezhu Yang #endif /* __ASM_LOONGARCH_UPROBES_H */
37