162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-only */
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci *  Kernel Probes (KProbes)
462306a36Sopenharmony_ci *  include/asm-mips/kprobes.h
562306a36Sopenharmony_ci *
662306a36Sopenharmony_ci *  Copyright 2006 Sony Corp.
762306a36Sopenharmony_ci *  Copyright 2010 Cavium Networks
862306a36Sopenharmony_ci */
962306a36Sopenharmony_ci
1062306a36Sopenharmony_ci#ifndef _ASM_KPROBES_H
1162306a36Sopenharmony_ci#define _ASM_KPROBES_H
1262306a36Sopenharmony_ci
1362306a36Sopenharmony_ci#include <asm-generic/kprobes.h>
1462306a36Sopenharmony_ci
1562306a36Sopenharmony_ci#ifdef CONFIG_KPROBES
1662306a36Sopenharmony_ci#include <linux/ptrace.h>
1762306a36Sopenharmony_ci#include <linux/types.h>
1862306a36Sopenharmony_ci
1962306a36Sopenharmony_ci#include <asm/cacheflush.h>
2062306a36Sopenharmony_ci#include <asm/kdebug.h>
2162306a36Sopenharmony_ci#include <asm/inst.h>
2262306a36Sopenharmony_ci
2362306a36Sopenharmony_ci#define	 __ARCH_WANT_KPROBES_INSN_SLOT
2462306a36Sopenharmony_ci
2562306a36Sopenharmony_cistruct kprobe;
2662306a36Sopenharmony_cistruct pt_regs;
2762306a36Sopenharmony_ci
2862306a36Sopenharmony_citypedef union mips_instruction kprobe_opcode_t;
2962306a36Sopenharmony_ci
3062306a36Sopenharmony_ci#define MAX_INSN_SIZE 2
3162306a36Sopenharmony_ci
3262306a36Sopenharmony_ci#define flush_insn_slot(p)						\
3362306a36Sopenharmony_cido {									\
3462306a36Sopenharmony_ci	if (p->addr)							\
3562306a36Sopenharmony_ci		flush_icache_range((unsigned long)p->addr,		\
3662306a36Sopenharmony_ci			   (unsigned long)p->addr +			\
3762306a36Sopenharmony_ci			   (MAX_INSN_SIZE * sizeof(kprobe_opcode_t)));	\
3862306a36Sopenharmony_ci} while (0)
3962306a36Sopenharmony_ci
4062306a36Sopenharmony_ci
4162306a36Sopenharmony_ci#define kretprobe_blacklist_size 0
4262306a36Sopenharmony_ci
4362306a36Sopenharmony_civoid arch_remove_kprobe(struct kprobe *p);
4462306a36Sopenharmony_ciint kprobe_fault_handler(struct pt_regs *regs, int trapnr);
4562306a36Sopenharmony_ci
4662306a36Sopenharmony_ci/* Architecture specific copy of original instruction*/
4762306a36Sopenharmony_cistruct arch_specific_insn {
4862306a36Sopenharmony_ci	/* copy of the original instruction */
4962306a36Sopenharmony_ci	kprobe_opcode_t *insn;
5062306a36Sopenharmony_ci};
5162306a36Sopenharmony_ci
5262306a36Sopenharmony_cistruct prev_kprobe {
5362306a36Sopenharmony_ci	struct kprobe *kp;
5462306a36Sopenharmony_ci	unsigned long status;
5562306a36Sopenharmony_ci	unsigned long old_SR;
5662306a36Sopenharmony_ci	unsigned long saved_SR;
5762306a36Sopenharmony_ci	unsigned long saved_epc;
5862306a36Sopenharmony_ci};
5962306a36Sopenharmony_ci
6062306a36Sopenharmony_ci#define SKIP_DELAYSLOT 0x0001
6162306a36Sopenharmony_ci
6262306a36Sopenharmony_ci/* per-cpu kprobe control block */
6362306a36Sopenharmony_cistruct kprobe_ctlblk {
6462306a36Sopenharmony_ci	unsigned long kprobe_status;
6562306a36Sopenharmony_ci	unsigned long kprobe_old_SR;
6662306a36Sopenharmony_ci	unsigned long kprobe_saved_SR;
6762306a36Sopenharmony_ci	unsigned long kprobe_saved_epc;
6862306a36Sopenharmony_ci	/* Per-thread fields, used while emulating branches */
6962306a36Sopenharmony_ci	unsigned long flags;
7062306a36Sopenharmony_ci	unsigned long target_epc;
7162306a36Sopenharmony_ci	struct prev_kprobe prev_kprobe;
7262306a36Sopenharmony_ci};
7362306a36Sopenharmony_ci
7462306a36Sopenharmony_ciextern int kprobe_exceptions_notify(struct notifier_block *self,
7562306a36Sopenharmony_ci				    unsigned long val, void *data);
7662306a36Sopenharmony_ci
7762306a36Sopenharmony_ci#endif /* CONFIG_KPROBES */
7862306a36Sopenharmony_ci#endif /* _ASM_KPROBES_H */
79