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