xref: /openbmc/linux/include/linux/fprobe.h (revision 334e5519)
1cad9931fSMasami Hiramatsu /* SPDX-License-Identifier: GPL-2.0 */
2cad9931fSMasami Hiramatsu /* Simple ftrace probe wrapper */
3cad9931fSMasami Hiramatsu #ifndef _LINUX_FPROBE_H
4cad9931fSMasami Hiramatsu #define _LINUX_FPROBE_H
5cad9931fSMasami Hiramatsu 
6cad9931fSMasami Hiramatsu #include <linux/compiler.h>
7cad9931fSMasami Hiramatsu #include <linux/ftrace.h>
85b0ab789SMasami Hiramatsu #include <linux/rethook.h>
9cad9931fSMasami Hiramatsu 
10cad9931fSMasami Hiramatsu /**
11cad9931fSMasami Hiramatsu  * struct fprobe - ftrace based probe.
12cad9931fSMasami Hiramatsu  * @ops: The ftrace_ops.
13cad9931fSMasami Hiramatsu  * @nmissed: The counter for missing events.
14cad9931fSMasami Hiramatsu  * @flags: The status flag.
155b0ab789SMasami Hiramatsu  * @rethook: The rethook data structure. (internal data)
1676d0de57SMasami Hiramatsu (Google)  * @entry_data_size: The private data storage size.
1759a7a298SMasami Hiramatsu (Google)  * @nr_maxactive: The max number of active functions.
18cad9931fSMasami Hiramatsu  * @entry_handler: The callback function for function entry.
195b0ab789SMasami Hiramatsu  * @exit_handler: The callback function for function exit.
20cad9931fSMasami Hiramatsu  */
21cad9931fSMasami Hiramatsu struct fprobe {
22cad9931fSMasami Hiramatsu #ifdef CONFIG_FUNCTION_TRACER
23cad9931fSMasami Hiramatsu 	/*
24cad9931fSMasami Hiramatsu 	 * If CONFIG_FUNCTION_TRACER is not set, CONFIG_FPROBE is disabled too.
25cad9931fSMasami Hiramatsu 	 * But user of fprobe may keep embedding the struct fprobe on their own
26cad9931fSMasami Hiramatsu 	 * code. To avoid build error, this will keep the fprobe data structure
27cad9931fSMasami Hiramatsu 	 * defined here, but remove ftrace_ops data structure.
28cad9931fSMasami Hiramatsu 	 */
29cad9931fSMasami Hiramatsu 	struct ftrace_ops	ops;
30cad9931fSMasami Hiramatsu #endif
31cad9931fSMasami Hiramatsu 	unsigned long		nmissed;
32cad9931fSMasami Hiramatsu 	unsigned int		flags;
335b0ab789SMasami Hiramatsu 	struct rethook		*rethook;
3476d0de57SMasami Hiramatsu (Google) 	size_t			entry_data_size;
3559a7a298SMasami Hiramatsu (Google) 	int			nr_maxactive;
365b0ab789SMasami Hiramatsu 
3739d95420SMasami Hiramatsu (Google) 	int (*entry_handler)(struct fprobe *fp, unsigned long entry_ip,
38cb16330dSMasami Hiramatsu (Google) 			     unsigned long ret_ip, struct pt_regs *regs,
39cb16330dSMasami Hiramatsu (Google) 			     void *entry_data);
4076d0de57SMasami Hiramatsu (Google) 	void (*exit_handler)(struct fprobe *fp, unsigned long entry_ip,
41cb16330dSMasami Hiramatsu (Google) 			     unsigned long ret_ip, struct pt_regs *regs,
42cb16330dSMasami Hiramatsu (Google) 			     void *entry_data);
43cad9931fSMasami Hiramatsu };
44cad9931fSMasami Hiramatsu 
45ab51e15dSMasami Hiramatsu /* This fprobe is soft-disabled. */
46cad9931fSMasami Hiramatsu #define FPROBE_FL_DISABLED	1
47cad9931fSMasami Hiramatsu 
48ab51e15dSMasami Hiramatsu /*
49ab51e15dSMasami Hiramatsu  * This fprobe handler will be shared with kprobes.
50ab51e15dSMasami Hiramatsu  * This flag must be set before registering.
51ab51e15dSMasami Hiramatsu  */
52ab51e15dSMasami Hiramatsu #define FPROBE_FL_KPROBE_SHARED	2
53ab51e15dSMasami Hiramatsu 
fprobe_disabled(struct fprobe * fp)54cad9931fSMasami Hiramatsu static inline bool fprobe_disabled(struct fprobe *fp)
55cad9931fSMasami Hiramatsu {
56cad9931fSMasami Hiramatsu 	return (fp) ? fp->flags & FPROBE_FL_DISABLED : false;
57cad9931fSMasami Hiramatsu }
58cad9931fSMasami Hiramatsu 
fprobe_shared_with_kprobes(struct fprobe * fp)59ab51e15dSMasami Hiramatsu static inline bool fprobe_shared_with_kprobes(struct fprobe *fp)
60ab51e15dSMasami Hiramatsu {
61ab51e15dSMasami Hiramatsu 	return (fp) ? fp->flags & FPROBE_FL_KPROBE_SHARED : false;
62ab51e15dSMasami Hiramatsu }
63ab51e15dSMasami Hiramatsu 
64cad9931fSMasami Hiramatsu #ifdef CONFIG_FPROBE
65cad9931fSMasami Hiramatsu int register_fprobe(struct fprobe *fp, const char *filter, const char *notfilter);
66cad9931fSMasami Hiramatsu int register_fprobe_ips(struct fprobe *fp, unsigned long *addrs, int num);
67cad9931fSMasami Hiramatsu int register_fprobe_syms(struct fprobe *fp, const char **syms, int num);
68cad9931fSMasami Hiramatsu int unregister_fprobe(struct fprobe *fp);
69*334e5519SMasami Hiramatsu (Google) bool fprobe_is_registered(struct fprobe *fp);
70cad9931fSMasami Hiramatsu #else
register_fprobe(struct fprobe * fp,const char * filter,const char * notfilter)71cad9931fSMasami Hiramatsu static inline int register_fprobe(struct fprobe *fp, const char *filter, const char *notfilter)
72cad9931fSMasami Hiramatsu {
73cad9931fSMasami Hiramatsu 	return -EOPNOTSUPP;
74cad9931fSMasami Hiramatsu }
register_fprobe_ips(struct fprobe * fp,unsigned long * addrs,int num)75cad9931fSMasami Hiramatsu static inline int register_fprobe_ips(struct fprobe *fp, unsigned long *addrs, int num)
76cad9931fSMasami Hiramatsu {
77cad9931fSMasami Hiramatsu 	return -EOPNOTSUPP;
78cad9931fSMasami Hiramatsu }
register_fprobe_syms(struct fprobe * fp,const char ** syms,int num)79cad9931fSMasami Hiramatsu static inline int register_fprobe_syms(struct fprobe *fp, const char **syms, int num)
80cad9931fSMasami Hiramatsu {
81cad9931fSMasami Hiramatsu 	return -EOPNOTSUPP;
82cad9931fSMasami Hiramatsu }
unregister_fprobe(struct fprobe * fp)83cad9931fSMasami Hiramatsu static inline int unregister_fprobe(struct fprobe *fp)
84cad9931fSMasami Hiramatsu {
85cad9931fSMasami Hiramatsu 	return -EOPNOTSUPP;
86cad9931fSMasami Hiramatsu }
fprobe_is_registered(struct fprobe * fp)87*334e5519SMasami Hiramatsu (Google) static inline bool fprobe_is_registered(struct fprobe *fp)
88*334e5519SMasami Hiramatsu (Google) {
89*334e5519SMasami Hiramatsu (Google) 	return false;
90*334e5519SMasami Hiramatsu (Google) }
91cad9931fSMasami Hiramatsu #endif
92cad9931fSMasami Hiramatsu 
93cad9931fSMasami Hiramatsu /**
94cad9931fSMasami Hiramatsu  * disable_fprobe() - Disable fprobe
95cad9931fSMasami Hiramatsu  * @fp: The fprobe to be disabled.
96cad9931fSMasami Hiramatsu  *
97cad9931fSMasami Hiramatsu  * This will soft-disable @fp. Note that this doesn't remove the ftrace
98cad9931fSMasami Hiramatsu  * hooks from the function entry.
99cad9931fSMasami Hiramatsu  */
disable_fprobe(struct fprobe * fp)100cad9931fSMasami Hiramatsu static inline void disable_fprobe(struct fprobe *fp)
101cad9931fSMasami Hiramatsu {
102cad9931fSMasami Hiramatsu 	if (fp)
103cad9931fSMasami Hiramatsu 		fp->flags |= FPROBE_FL_DISABLED;
104cad9931fSMasami Hiramatsu }
105cad9931fSMasami Hiramatsu 
106cad9931fSMasami Hiramatsu /**
107cad9931fSMasami Hiramatsu  * enable_fprobe() - Enable fprobe
108cad9931fSMasami Hiramatsu  * @fp: The fprobe to be enabled.
109cad9931fSMasami Hiramatsu  *
110cad9931fSMasami Hiramatsu  * This will soft-enable @fp.
111cad9931fSMasami Hiramatsu  */
enable_fprobe(struct fprobe * fp)112cad9931fSMasami Hiramatsu static inline void enable_fprobe(struct fprobe *fp)
113cad9931fSMasami Hiramatsu {
114cad9931fSMasami Hiramatsu 	if (fp)
115cad9931fSMasami Hiramatsu 		fp->flags &= ~FPROBE_FL_DISABLED;
116cad9931fSMasami Hiramatsu }
117cad9931fSMasami Hiramatsu 
118cad9931fSMasami Hiramatsu #endif
119