1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0-only */ 2*4882a593Smuzhiyun /* 3*4882a593Smuzhiyun * Kernel Probes (KProbes) 4*4882a593Smuzhiyun * include/asm-mips/kprobes.h 5*4882a593Smuzhiyun * 6*4882a593Smuzhiyun * Copyright 2006 Sony Corp. 7*4882a593Smuzhiyun * Copyright 2010 Cavium Networks 8*4882a593Smuzhiyun */ 9*4882a593Smuzhiyun 10*4882a593Smuzhiyun #ifndef _ASM_KPROBES_H 11*4882a593Smuzhiyun #define _ASM_KPROBES_H 12*4882a593Smuzhiyun 13*4882a593Smuzhiyun #include <asm-generic/kprobes.h> 14*4882a593Smuzhiyun 15*4882a593Smuzhiyun #ifdef CONFIG_KPROBES 16*4882a593Smuzhiyun #include <linux/ptrace.h> 17*4882a593Smuzhiyun #include <linux/types.h> 18*4882a593Smuzhiyun 19*4882a593Smuzhiyun #include <asm/cacheflush.h> 20*4882a593Smuzhiyun #include <asm/kdebug.h> 21*4882a593Smuzhiyun #include <asm/inst.h> 22*4882a593Smuzhiyun 23*4882a593Smuzhiyun #define __ARCH_WANT_KPROBES_INSN_SLOT 24*4882a593Smuzhiyun 25*4882a593Smuzhiyun struct kprobe; 26*4882a593Smuzhiyun struct pt_regs; 27*4882a593Smuzhiyun 28*4882a593Smuzhiyun typedef union mips_instruction kprobe_opcode_t; 29*4882a593Smuzhiyun 30*4882a593Smuzhiyun #define MAX_INSN_SIZE 2 31*4882a593Smuzhiyun 32*4882a593Smuzhiyun #define flush_insn_slot(p) \ 33*4882a593Smuzhiyun do { \ 34*4882a593Smuzhiyun if (p->addr) \ 35*4882a593Smuzhiyun flush_icache_range((unsigned long)p->addr, \ 36*4882a593Smuzhiyun (unsigned long)p->addr + \ 37*4882a593Smuzhiyun (MAX_INSN_SIZE * sizeof(kprobe_opcode_t))); \ 38*4882a593Smuzhiyun } while (0) 39*4882a593Smuzhiyun 40*4882a593Smuzhiyun 41*4882a593Smuzhiyun #define kretprobe_blacklist_size 0 42*4882a593Smuzhiyun 43*4882a593Smuzhiyun void arch_remove_kprobe(struct kprobe *p); 44*4882a593Smuzhiyun int kprobe_fault_handler(struct pt_regs *regs, int trapnr); 45*4882a593Smuzhiyun 46*4882a593Smuzhiyun /* Architecture specific copy of original instruction*/ 47*4882a593Smuzhiyun struct arch_specific_insn { 48*4882a593Smuzhiyun /* copy of the original instruction */ 49*4882a593Smuzhiyun kprobe_opcode_t *insn; 50*4882a593Smuzhiyun }; 51*4882a593Smuzhiyun 52*4882a593Smuzhiyun struct prev_kprobe { 53*4882a593Smuzhiyun struct kprobe *kp; 54*4882a593Smuzhiyun unsigned long status; 55*4882a593Smuzhiyun unsigned long old_SR; 56*4882a593Smuzhiyun unsigned long saved_SR; 57*4882a593Smuzhiyun unsigned long saved_epc; 58*4882a593Smuzhiyun }; 59*4882a593Smuzhiyun 60*4882a593Smuzhiyun #define SKIP_DELAYSLOT 0x0001 61*4882a593Smuzhiyun 62*4882a593Smuzhiyun /* per-cpu kprobe control block */ 63*4882a593Smuzhiyun struct kprobe_ctlblk { 64*4882a593Smuzhiyun unsigned long kprobe_status; 65*4882a593Smuzhiyun unsigned long kprobe_old_SR; 66*4882a593Smuzhiyun unsigned long kprobe_saved_SR; 67*4882a593Smuzhiyun unsigned long kprobe_saved_epc; 68*4882a593Smuzhiyun /* Per-thread fields, used while emulating branches */ 69*4882a593Smuzhiyun unsigned long flags; 70*4882a593Smuzhiyun unsigned long target_epc; 71*4882a593Smuzhiyun struct prev_kprobe prev_kprobe; 72*4882a593Smuzhiyun }; 73*4882a593Smuzhiyun 74*4882a593Smuzhiyun extern int kprobe_exceptions_notify(struct notifier_block *self, 75*4882a593Smuzhiyun unsigned long val, void *data); 76*4882a593Smuzhiyun 77*4882a593Smuzhiyun #endif /* CONFIG_KPROBES */ 78*4882a593Smuzhiyun #endif /* _ASM_KPROBES_H */ 79