162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-only */
262306a36Sopenharmony_ci#ifndef __ASM_LOONGARCH_KPROBES_H
362306a36Sopenharmony_ci#define __ASM_LOONGARCH_KPROBES_H
462306a36Sopenharmony_ci
562306a36Sopenharmony_ci#include <asm-generic/kprobes.h>
662306a36Sopenharmony_ci
762306a36Sopenharmony_ci#ifdef CONFIG_KPROBES
862306a36Sopenharmony_ci
962306a36Sopenharmony_ci#include <asm/inst.h>
1062306a36Sopenharmony_ci#include <asm/cacheflush.h>
1162306a36Sopenharmony_ci
1262306a36Sopenharmony_ci#define __ARCH_WANT_KPROBES_INSN_SLOT
1362306a36Sopenharmony_ci#define MAX_INSN_SIZE			2
1462306a36Sopenharmony_ci
1562306a36Sopenharmony_ci#define flush_insn_slot(p)						\
1662306a36Sopenharmony_cido {									\
1762306a36Sopenharmony_ci	if (p->addr)							\
1862306a36Sopenharmony_ci		flush_icache_range((unsigned long)p->addr,		\
1962306a36Sopenharmony_ci			   (unsigned long)p->addr +			\
2062306a36Sopenharmony_ci			   (MAX_INSN_SIZE * sizeof(kprobe_opcode_t)));	\
2162306a36Sopenharmony_ci} while (0)
2262306a36Sopenharmony_ci
2362306a36Sopenharmony_ci#define kretprobe_blacklist_size	0
2462306a36Sopenharmony_ci
2562306a36Sopenharmony_citypedef u32 kprobe_opcode_t;
2662306a36Sopenharmony_ci
2762306a36Sopenharmony_ci/* Architecture specific copy of original instruction */
2862306a36Sopenharmony_cistruct arch_specific_insn {
2962306a36Sopenharmony_ci	/* copy of the original instruction */
3062306a36Sopenharmony_ci	kprobe_opcode_t *insn;
3162306a36Sopenharmony_ci	/* restore address after simulation */
3262306a36Sopenharmony_ci	unsigned long restore;
3362306a36Sopenharmony_ci};
3462306a36Sopenharmony_ci
3562306a36Sopenharmony_cistruct prev_kprobe {
3662306a36Sopenharmony_ci	struct kprobe *kp;
3762306a36Sopenharmony_ci	unsigned int status;
3862306a36Sopenharmony_ci};
3962306a36Sopenharmony_ci
4062306a36Sopenharmony_ci/* per-cpu kprobe control block */
4162306a36Sopenharmony_cistruct kprobe_ctlblk {
4262306a36Sopenharmony_ci	unsigned int kprobe_status;
4362306a36Sopenharmony_ci	unsigned long saved_status;
4462306a36Sopenharmony_ci	struct prev_kprobe prev_kprobe;
4562306a36Sopenharmony_ci};
4662306a36Sopenharmony_ci
4762306a36Sopenharmony_civoid arch_remove_kprobe(struct kprobe *p);
4862306a36Sopenharmony_cibool kprobe_fault_handler(struct pt_regs *regs, int trapnr);
4962306a36Sopenharmony_cibool kprobe_breakpoint_handler(struct pt_regs *regs);
5062306a36Sopenharmony_cibool kprobe_singlestep_handler(struct pt_regs *regs);
5162306a36Sopenharmony_ci
5262306a36Sopenharmony_ci#else /* !CONFIG_KPROBES */
5362306a36Sopenharmony_ci
5462306a36Sopenharmony_cistatic inline bool kprobe_breakpoint_handler(struct pt_regs *regs) { return false; }
5562306a36Sopenharmony_cistatic inline bool kprobe_singlestep_handler(struct pt_regs *regs) { return false; }
5662306a36Sopenharmony_ci
5762306a36Sopenharmony_ci#endif /* CONFIG_KPROBES */
5862306a36Sopenharmony_ci#endif /* __ASM_LOONGARCH_KPROBES_H */
59