xref: /linux-6.15/include/linux/kprobes.h (revision cc00e9cf)
11da177e4SLinus Torvalds #ifndef _LINUX_KPROBES_H
21da177e4SLinus Torvalds #define _LINUX_KPROBES_H
31da177e4SLinus Torvalds /*
41da177e4SLinus Torvalds  *  Kernel Probes (KProbes)
51da177e4SLinus Torvalds  *  include/linux/kprobes.h
61da177e4SLinus Torvalds  *
71da177e4SLinus Torvalds  * This program is free software; you can redistribute it and/or modify
81da177e4SLinus Torvalds  * it under the terms of the GNU General Public License as published by
91da177e4SLinus Torvalds  * the Free Software Foundation; either version 2 of the License, or
101da177e4SLinus Torvalds  * (at your option) any later version.
111da177e4SLinus Torvalds  *
121da177e4SLinus Torvalds  * This program is distributed in the hope that it will be useful,
131da177e4SLinus Torvalds  * but WITHOUT ANY WARRANTY; without even the implied warranty of
141da177e4SLinus Torvalds  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
151da177e4SLinus Torvalds  * GNU General Public License for more details.
161da177e4SLinus Torvalds  *
171da177e4SLinus Torvalds  * You should have received a copy of the GNU General Public License
181da177e4SLinus Torvalds  * along with this program; if not, write to the Free Software
191da177e4SLinus Torvalds  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
201da177e4SLinus Torvalds  *
211da177e4SLinus Torvalds  * Copyright (C) IBM Corporation, 2002, 2004
221da177e4SLinus Torvalds  *
231da177e4SLinus Torvalds  * 2002-Oct	Created by Vamsi Krishna S <[email protected]> Kernel
241da177e4SLinus Torvalds  *		Probes initial implementation ( includes suggestions from
251da177e4SLinus Torvalds  *		Rusty Russell).
261da177e4SLinus Torvalds  * 2004-July	Suparna Bhattacharya <[email protected]> added jumper probes
271da177e4SLinus Torvalds  *		interface to access function arguments.
28b94cce92SHien Nguyen  * 2005-May	Hien Nguyen <[email protected]> and Jim Keniston
29b94cce92SHien Nguyen  *		<[email protected]>  and Prasanna S Panchamukhi
30b94cce92SHien Nguyen  *		<[email protected]> added function-return probes.
311da177e4SLinus Torvalds  */
3236dcd67aSIngo Molnar #include <linux/linkage.h>
331da177e4SLinus Torvalds #include <linux/list.h>
341da177e4SLinus Torvalds #include <linux/notifier.h>
351da177e4SLinus Torvalds #include <linux/smp.h>
36e6584523SAnanth N Mavinakayanahalli #include <linux/percpu.h>
373516a460SAnanth N Mavinakayanahalli #include <linux/spinlock.h>
383516a460SAnanth N Mavinakayanahalli #include <linux/rcupdate.h>
397a7d1cf9SIngo Molnar #include <linux/mutex.h>
40b94cce92SHien Nguyen 
4100d7c05aSKeshavamurthy Anil S #ifdef CONFIG_KPROBES
421da177e4SLinus Torvalds #include <asm/kprobes.h>
431da177e4SLinus Torvalds 
44ea32c65cSPrasanna S Panchamukhi /* kprobe_status settings */
45ea32c65cSPrasanna S Panchamukhi #define KPROBE_HIT_ACTIVE	0x00000001
46ea32c65cSPrasanna S Panchamukhi #define KPROBE_HIT_SS		0x00000002
47ea32c65cSPrasanna S Panchamukhi #define KPROBE_REENTER		0x00000004
48ea32c65cSPrasanna S Panchamukhi #define KPROBE_HIT_SSDONE	0x00000008
49ea32c65cSPrasanna S Panchamukhi 
50d0aaff97SPrasanna S Panchamukhi /* Attach to insert probes on any functions which should be ignored*/
5136dcd67aSIngo Molnar #define __kprobes	__attribute__((__section__(".kprobes.text"))) notrace
52dc19835dSMasami Hiramatsu #else /* CONFIG_KPROBES */
53dc19835dSMasami Hiramatsu typedef int kprobe_opcode_t;
54dc19835dSMasami Hiramatsu struct arch_specific_insn {
55dc19835dSMasami Hiramatsu 	int dummy;
56dc19835dSMasami Hiramatsu };
57dc19835dSMasami Hiramatsu #define __kprobes	notrace
58dc19835dSMasami Hiramatsu #endif /* CONFIG_KPROBES */
59d0aaff97SPrasanna S Panchamukhi 
601da177e4SLinus Torvalds struct kprobe;
611da177e4SLinus Torvalds struct pt_regs;
62b94cce92SHien Nguyen struct kretprobe;
63b94cce92SHien Nguyen struct kretprobe_instance;
641da177e4SLinus Torvalds typedef int (*kprobe_pre_handler_t) (struct kprobe *, struct pt_regs *);
651da177e4SLinus Torvalds typedef int (*kprobe_break_handler_t) (struct kprobe *, struct pt_regs *);
661da177e4SLinus Torvalds typedef void (*kprobe_post_handler_t) (struct kprobe *, struct pt_regs *,
671da177e4SLinus Torvalds 				       unsigned long flags);
681da177e4SLinus Torvalds typedef int (*kprobe_fault_handler_t) (struct kprobe *, struct pt_regs *,
691da177e4SLinus Torvalds 				       int trapnr);
70b94cce92SHien Nguyen typedef int (*kretprobe_handler_t) (struct kretprobe_instance *,
71b94cce92SHien Nguyen 				    struct pt_regs *);
72b94cce92SHien Nguyen 
731da177e4SLinus Torvalds struct kprobe {
741da177e4SLinus Torvalds 	struct hlist_node hlist;
751da177e4SLinus Torvalds 
7664f562c6SAnanth N Mavinakayanahalli 	/* list of kprobes for multi-handler support */
7764f562c6SAnanth N Mavinakayanahalli 	struct list_head list;
7864f562c6SAnanth N Mavinakayanahalli 
79ea32c65cSPrasanna S Panchamukhi 	/*count the number of times this probe was temporarily disarmed */
80ea32c65cSPrasanna S Panchamukhi 	unsigned long nmissed;
81ea32c65cSPrasanna S Panchamukhi 
821da177e4SLinus Torvalds 	/* location of the probe point */
831da177e4SLinus Torvalds 	kprobe_opcode_t *addr;
841da177e4SLinus Torvalds 
853a872d89SAnanth N Mavinakayanahalli 	/* Allow user to indicate symbol name of the probe point */
869b3af29bSAnanth N Mavinakayanahalli 	const char *symbol_name;
873a872d89SAnanth N Mavinakayanahalli 
883a872d89SAnanth N Mavinakayanahalli 	/* Offset into the symbol */
893a872d89SAnanth N Mavinakayanahalli 	unsigned int offset;
903a872d89SAnanth N Mavinakayanahalli 
911da177e4SLinus Torvalds 	/* Called before addr is executed. */
921da177e4SLinus Torvalds 	kprobe_pre_handler_t pre_handler;
931da177e4SLinus Torvalds 
941da177e4SLinus Torvalds 	/* Called after addr is executed, unless... */
951da177e4SLinus Torvalds 	kprobe_post_handler_t post_handler;
961da177e4SLinus Torvalds 
97*cc00e9cfSMasami Hiramatsu 	/*
98*cc00e9cfSMasami Hiramatsu 	 * ... called if executing addr causes a fault (eg. page fault).
99*cc00e9cfSMasami Hiramatsu 	 * Return 1 if it handled fault, otherwise kernel will see it.
100*cc00e9cfSMasami Hiramatsu 	 */
1011da177e4SLinus Torvalds 	kprobe_fault_handler_t fault_handler;
1021da177e4SLinus Torvalds 
103*cc00e9cfSMasami Hiramatsu 	/*
104*cc00e9cfSMasami Hiramatsu 	 * ... called if breakpoint trap occurs in probe handler.
105*cc00e9cfSMasami Hiramatsu 	 * Return 1 if it handled break, otherwise kernel will see it.
106*cc00e9cfSMasami Hiramatsu 	 */
1071da177e4SLinus Torvalds 	kprobe_break_handler_t break_handler;
1081da177e4SLinus Torvalds 
1091da177e4SLinus Torvalds 	/* Saved opcode (which has been replaced with breakpoint) */
1101da177e4SLinus Torvalds 	kprobe_opcode_t opcode;
1111da177e4SLinus Torvalds 
1121da177e4SLinus Torvalds 	/* copy of the original instruction */
1131da177e4SLinus Torvalds 	struct arch_specific_insn ainsn;
114e8386a0cSMasami Hiramatsu 
115e8386a0cSMasami Hiramatsu 	/* Indicates various status flags.  Protected by kprobe_mutex. */
116e8386a0cSMasami Hiramatsu 	u32 flags;
1171da177e4SLinus Torvalds };
1181da177e4SLinus Torvalds 
119e8386a0cSMasami Hiramatsu /* Kprobe status flags */
120e8386a0cSMasami Hiramatsu #define KPROBE_FLAG_GONE	1 /* breakpoint has already gone */
121e8386a0cSMasami Hiramatsu 
122e8386a0cSMasami Hiramatsu static inline int kprobe_gone(struct kprobe *p)
123e8386a0cSMasami Hiramatsu {
124e8386a0cSMasami Hiramatsu 	return p->flags & KPROBE_FLAG_GONE;
125e8386a0cSMasami Hiramatsu }
126e8386a0cSMasami Hiramatsu 
1271da177e4SLinus Torvalds /*
1281da177e4SLinus Torvalds  * Special probe type that uses setjmp-longjmp type tricks to resume
1291da177e4SLinus Torvalds  * execution at a specified entry with a matching prototype corresponding
1301da177e4SLinus Torvalds  * to the probed function - a trick to enable arguments to become
1311da177e4SLinus Torvalds  * accessible seamlessly by probe handling logic.
1321da177e4SLinus Torvalds  * Note:
1331da177e4SLinus Torvalds  * Because of the way compilers allocate stack space for local variables
1341da177e4SLinus Torvalds  * etc upfront, regardless of sub-scopes within a function, this mirroring
1351da177e4SLinus Torvalds  * principle currently works only for probes placed on function entry points.
1361da177e4SLinus Torvalds  */
1371da177e4SLinus Torvalds struct jprobe {
1381da177e4SLinus Torvalds 	struct kprobe kp;
13981eae375SMichael Ellerman 	void *entry;	/* probe handling code to jump to */
1401da177e4SLinus Torvalds };
1411da177e4SLinus Torvalds 
1429e367d85SMichael Ellerman /* For backward compatibility with old code using JPROBE_ENTRY() */
1439e367d85SMichael Ellerman #define JPROBE_ENTRY(handler)	(handler)
1449e367d85SMichael Ellerman 
145b94cce92SHien Nguyen /*
146b94cce92SHien Nguyen  * Function-return probe -
147b94cce92SHien Nguyen  * Note:
148b94cce92SHien Nguyen  * User needs to provide a handler function, and initialize maxactive.
149b94cce92SHien Nguyen  * maxactive - The maximum number of instances of the probed function that
150b94cce92SHien Nguyen  * can be active concurrently.
151b94cce92SHien Nguyen  * nmissed - tracks the number of times the probed function's return was
152b94cce92SHien Nguyen  * ignored, due to maxactive being too low.
153b94cce92SHien Nguyen  *
154b94cce92SHien Nguyen  */
155b94cce92SHien Nguyen struct kretprobe {
156b94cce92SHien Nguyen 	struct kprobe kp;
157b94cce92SHien Nguyen 	kretprobe_handler_t handler;
158f47cd9b5SAbhishek Sagar 	kretprobe_handler_t entry_handler;
159b94cce92SHien Nguyen 	int maxactive;
160b94cce92SHien Nguyen 	int nmissed;
161f47cd9b5SAbhishek Sagar 	size_t data_size;
162b94cce92SHien Nguyen 	struct hlist_head free_instances;
163ef53d9c5SSrinivasa D S 	spinlock_t lock;
164b94cce92SHien Nguyen };
165b94cce92SHien Nguyen 
166b94cce92SHien Nguyen struct kretprobe_instance {
167b94cce92SHien Nguyen 	struct hlist_node hlist;
168b94cce92SHien Nguyen 	struct kretprobe *rp;
169802eae7cSRusty Lynch 	kprobe_opcode_t *ret_addr;
170802eae7cSRusty Lynch 	struct task_struct *task;
171f47cd9b5SAbhishek Sagar 	char data[0];
172b94cce92SHien Nguyen };
173b94cce92SHien Nguyen 
174f438d914SMasami Hiramatsu struct kretprobe_blackpoint {
175f438d914SMasami Hiramatsu 	const char *name;
176f438d914SMasami Hiramatsu 	void *addr;
177f438d914SMasami Hiramatsu };
1783d8d996eSSrinivasa Ds 
1793d8d996eSSrinivasa Ds struct kprobe_blackpoint {
1803d8d996eSSrinivasa Ds 	const char *name;
1813d8d996eSSrinivasa Ds 	unsigned long start_addr;
1823d8d996eSSrinivasa Ds 	unsigned long range;
1833d8d996eSSrinivasa Ds };
1843d8d996eSSrinivasa Ds 
185dc19835dSMasami Hiramatsu #ifdef CONFIG_KPROBES
186dc19835dSMasami Hiramatsu DECLARE_PER_CPU(struct kprobe *, current_kprobe);
187dc19835dSMasami Hiramatsu DECLARE_PER_CPU(struct kprobe_ctlblk, kprobe_ctlblk);
188dc19835dSMasami Hiramatsu 
189b1801812SIngo Molnar /*
190b1801812SIngo Molnar  * For #ifdef avoidance:
191b1801812SIngo Molnar  */
192b1801812SIngo Molnar static inline int kprobes_built_in(void)
193b1801812SIngo Molnar {
194b1801812SIngo Molnar 	return 1;
195b1801812SIngo Molnar }
196b1801812SIngo Molnar 
197dc19835dSMasami Hiramatsu #ifdef CONFIG_KRETPROBES
198dc19835dSMasami Hiramatsu extern void arch_prepare_kretprobe(struct kretprobe_instance *ri,
199dc19835dSMasami Hiramatsu 				   struct pt_regs *regs);
200dc19835dSMasami Hiramatsu extern int arch_trampoline_kprobe(struct kprobe *p);
201dc19835dSMasami Hiramatsu #else /* CONFIG_KRETPROBES */
202dc19835dSMasami Hiramatsu static inline void arch_prepare_kretprobe(struct kretprobe *rp,
203dc19835dSMasami Hiramatsu 					struct pt_regs *regs)
204dc19835dSMasami Hiramatsu {
205dc19835dSMasami Hiramatsu }
206dc19835dSMasami Hiramatsu static inline int arch_trampoline_kprobe(struct kprobe *p)
207dc19835dSMasami Hiramatsu {
208dc19835dSMasami Hiramatsu 	return 0;
209dc19835dSMasami Hiramatsu }
210dc19835dSMasami Hiramatsu #endif /* CONFIG_KRETPROBES */
211dc19835dSMasami Hiramatsu 
212f438d914SMasami Hiramatsu extern struct kretprobe_blackpoint kretprobe_blacklist[];
213f438d914SMasami Hiramatsu 
2140f95b7fcSAnanth N Mavinakayanahalli static inline void kretprobe_assert(struct kretprobe_instance *ri,
2150f95b7fcSAnanth N Mavinakayanahalli 	unsigned long orig_ret_address, unsigned long trampoline_address)
2160f95b7fcSAnanth N Mavinakayanahalli {
2170f95b7fcSAnanth N Mavinakayanahalli 	if (!orig_ret_address || (orig_ret_address == trampoline_address)) {
2180f95b7fcSAnanth N Mavinakayanahalli 		printk("kretprobe BUG!: Processing kretprobe %p @ %p\n",
2190f95b7fcSAnanth N Mavinakayanahalli 				ri->rp, ri->rp->kp.addr);
2200f95b7fcSAnanth N Mavinakayanahalli 		BUG();
2210f95b7fcSAnanth N Mavinakayanahalli 	}
2220f95b7fcSAnanth N Mavinakayanahalli }
2230f95b7fcSAnanth N Mavinakayanahalli 
2248c1c9356SAnanth N Mavinakayanahalli #ifdef CONFIG_KPROBES_SANITY_TEST
2258c1c9356SAnanth N Mavinakayanahalli extern int init_test_probes(void);
2268c1c9356SAnanth N Mavinakayanahalli #else
2278c1c9356SAnanth N Mavinakayanahalli static inline int init_test_probes(void)
2288c1c9356SAnanth N Mavinakayanahalli {
2298c1c9356SAnanth N Mavinakayanahalli 	return 0;
2308c1c9356SAnanth N Mavinakayanahalli }
2318c1c9356SAnanth N Mavinakayanahalli #endif /* CONFIG_KPROBES_SANITY_TEST */
2328c1c9356SAnanth N Mavinakayanahalli 
2331da177e4SLinus Torvalds extern int arch_prepare_kprobe(struct kprobe *p);
2347e1048b1SRusty Lynch extern void arch_arm_kprobe(struct kprobe *p);
2357e1048b1SRusty Lynch extern void arch_disarm_kprobe(struct kprobe *p);
2366772926bSRusty Lynch extern int arch_init_kprobes(void);
2371da177e4SLinus Torvalds extern void show_registers(struct pt_regs *regs);
2389ec4b1f3SAnanth N Mavinakayanahalli extern kprobe_opcode_t *get_insn_slot(void);
239b4c6c34aSMasami Hiramatsu extern void free_insn_slot(kprobe_opcode_t *slot, int dirty);
240bf8d5c52SKeshavamurthy Anil S extern void kprobes_inc_nmissed_count(struct kprobe *p);
2411da177e4SLinus Torvalds 
242d217d545SAnanth N Mavinakayanahalli /* Get the kprobe at this addr (if any) - called with preemption disabled */
2431da177e4SLinus Torvalds struct kprobe *get_kprobe(void *addr);
244ef53d9c5SSrinivasa D S void kretprobe_hash_lock(struct task_struct *tsk,
245ef53d9c5SSrinivasa D S 			 struct hlist_head **head, unsigned long *flags);
246ef53d9c5SSrinivasa D S void kretprobe_hash_unlock(struct task_struct *tsk, unsigned long *flags);
247b94cce92SHien Nguyen struct hlist_head * kretprobe_inst_table_head(struct task_struct *tsk);
2481da177e4SLinus Torvalds 
249e6584523SAnanth N Mavinakayanahalli /* kprobe_running() will just return the current_kprobe on this CPU */
250e6584523SAnanth N Mavinakayanahalli static inline struct kprobe *kprobe_running(void)
251e6584523SAnanth N Mavinakayanahalli {
252e6584523SAnanth N Mavinakayanahalli 	return (__get_cpu_var(current_kprobe));
253e6584523SAnanth N Mavinakayanahalli }
254e6584523SAnanth N Mavinakayanahalli 
255e6584523SAnanth N Mavinakayanahalli static inline void reset_current_kprobe(void)
256e6584523SAnanth N Mavinakayanahalli {
257e6584523SAnanth N Mavinakayanahalli 	__get_cpu_var(current_kprobe) = NULL;
258e6584523SAnanth N Mavinakayanahalli }
259e6584523SAnanth N Mavinakayanahalli 
260e6584523SAnanth N Mavinakayanahalli static inline struct kprobe_ctlblk *get_kprobe_ctlblk(void)
261e6584523SAnanth N Mavinakayanahalli {
262e6584523SAnanth N Mavinakayanahalli 	return (&__get_cpu_var(kprobe_ctlblk));
263e6584523SAnanth N Mavinakayanahalli }
264e6584523SAnanth N Mavinakayanahalli 
2651da177e4SLinus Torvalds int register_kprobe(struct kprobe *p);
2661da177e4SLinus Torvalds void unregister_kprobe(struct kprobe *p);
2679861668fSMasami Hiramatsu int register_kprobes(struct kprobe **kps, int num);
2689861668fSMasami Hiramatsu void unregister_kprobes(struct kprobe **kps, int num);
2691da177e4SLinus Torvalds int setjmp_pre_handler(struct kprobe *, struct pt_regs *);
2701da177e4SLinus Torvalds int longjmp_break_handler(struct kprobe *, struct pt_regs *);
2711da177e4SLinus Torvalds int register_jprobe(struct jprobe *p);
2721da177e4SLinus Torvalds void unregister_jprobe(struct jprobe *p);
27326b31c19SMasami Hiramatsu int register_jprobes(struct jprobe **jps, int num);
27426b31c19SMasami Hiramatsu void unregister_jprobes(struct jprobe **jps, int num);
2751da177e4SLinus Torvalds void jprobe_return(void);
2763d7e3382SMichael Ellerman unsigned long arch_deref_entry_point(void *);
2771da177e4SLinus Torvalds 
278b94cce92SHien Nguyen int register_kretprobe(struct kretprobe *rp);
279b94cce92SHien Nguyen void unregister_kretprobe(struct kretprobe *rp);
2804a296e07SMasami Hiramatsu int register_kretprobes(struct kretprobe **rps, int num);
2814a296e07SMasami Hiramatsu void unregister_kretprobes(struct kretprobe **rps, int num);
282b94cce92SHien Nguyen 
283b94cce92SHien Nguyen void kprobe_flush_task(struct task_struct *tk);
28499219a3fSbibo,mao void recycle_rp_inst(struct kretprobe_instance *ri, struct hlist_head *head);
2858c1c9356SAnanth N Mavinakayanahalli 
286b1801812SIngo Molnar #else /* !CONFIG_KPROBES: */
28700d7c05aSKeshavamurthy Anil S 
288b1801812SIngo Molnar static inline int kprobes_built_in(void)
289b1801812SIngo Molnar {
290b1801812SIngo Molnar 	return 0;
291b1801812SIngo Molnar }
292b1801812SIngo Molnar static inline int kprobe_fault_handler(struct pt_regs *regs, int trapnr)
293b1801812SIngo Molnar {
294b1801812SIngo Molnar 	return 0;
295b1801812SIngo Molnar }
296785656a4SAbhishek Sagar static inline struct kprobe *get_kprobe(void *addr)
297785656a4SAbhishek Sagar {
298785656a4SAbhishek Sagar 	return NULL;
299785656a4SAbhishek Sagar }
300e6584523SAnanth N Mavinakayanahalli static inline struct kprobe *kprobe_running(void)
3011da177e4SLinus Torvalds {
302e6584523SAnanth N Mavinakayanahalli 	return NULL;
3031da177e4SLinus Torvalds }
3041da177e4SLinus Torvalds static inline int register_kprobe(struct kprobe *p)
3051da177e4SLinus Torvalds {
3061da177e4SLinus Torvalds 	return -ENOSYS;
3071da177e4SLinus Torvalds }
3089861668fSMasami Hiramatsu static inline int register_kprobes(struct kprobe **kps, int num)
3099861668fSMasami Hiramatsu {
3109861668fSMasami Hiramatsu 	return -ENOSYS;
3119861668fSMasami Hiramatsu }
3121da177e4SLinus Torvalds static inline void unregister_kprobe(struct kprobe *p)
3131da177e4SLinus Torvalds {
3141da177e4SLinus Torvalds }
3159861668fSMasami Hiramatsu static inline void unregister_kprobes(struct kprobe **kps, int num)
3169861668fSMasami Hiramatsu {
3179861668fSMasami Hiramatsu }
3181da177e4SLinus Torvalds static inline int register_jprobe(struct jprobe *p)
3191da177e4SLinus Torvalds {
3201da177e4SLinus Torvalds 	return -ENOSYS;
3211da177e4SLinus Torvalds }
32226b31c19SMasami Hiramatsu static inline int register_jprobes(struct jprobe **jps, int num)
32326b31c19SMasami Hiramatsu {
32426b31c19SMasami Hiramatsu 	return -ENOSYS;
32526b31c19SMasami Hiramatsu }
3261da177e4SLinus Torvalds static inline void unregister_jprobe(struct jprobe *p)
3271da177e4SLinus Torvalds {
3281da177e4SLinus Torvalds }
32926b31c19SMasami Hiramatsu static inline void unregister_jprobes(struct jprobe **jps, int num)
33026b31c19SMasami Hiramatsu {
33126b31c19SMasami Hiramatsu }
3321da177e4SLinus Torvalds static inline void jprobe_return(void)
3331da177e4SLinus Torvalds {
3341da177e4SLinus Torvalds }
335b94cce92SHien Nguyen static inline int register_kretprobe(struct kretprobe *rp)
336b94cce92SHien Nguyen {
337b94cce92SHien Nguyen 	return -ENOSYS;
338b94cce92SHien Nguyen }
3394a296e07SMasami Hiramatsu static inline int register_kretprobes(struct kretprobe **rps, int num)
3404a296e07SMasami Hiramatsu {
3414a296e07SMasami Hiramatsu 	return -ENOSYS;
3424a296e07SMasami Hiramatsu }
343b94cce92SHien Nguyen static inline void unregister_kretprobe(struct kretprobe *rp)
344b94cce92SHien Nguyen {
345b94cce92SHien Nguyen }
3464a296e07SMasami Hiramatsu static inline void unregister_kretprobes(struct kretprobe **rps, int num)
3474a296e07SMasami Hiramatsu {
3484a296e07SMasami Hiramatsu }
349b94cce92SHien Nguyen static inline void kprobe_flush_task(struct task_struct *tk)
350b94cce92SHien Nguyen {
351b94cce92SHien Nguyen }
352b94cce92SHien Nguyen #endif /* CONFIG_KPROBES */
3531da177e4SLinus Torvalds #endif /* _LINUX_KPROBES_H */
354