Namespace kernel version macros
[lttng-modules.git] / include / wrapper / uprobes.h
1 /* SPDX-License-Identifier: (GPL-2.0-only or LGPL-2.1-only)
2 *
3 * wrapper/uprobes.h
4 *
5 * wrapper around uprobes. Using KALLSYMS to get its address when
6 * available, else we need to have a kernel that exports this function to GPL
7 * modules.
8 *
9 * Copyright (C) 2013 Yannick Brosseau <yannick.brosseau@gmail.com>
10 * Copyright (C) 2017 Francis Deslauriers <francis.deslauriers@efficios.com>
11 *
12 */
13
14 #ifndef _LTTNG_WRAPPER_UPROBES_H
15 #define _LTTNG_WRAPPER_UPROBES_H
16
17 #include <lttng/kernel-version.h>
18
19 #if (LTTNG_LINUX_VERSION_CODE >= LTTNG_KERNEL_VERSION(3,5,0))
20 #include <linux/uprobes.h>
21
22 /* Use kallsym lookup for version before 3.9. */
23 #if (LTTNG_LINUX_VERSION_CODE >= LTTNG_KERNEL_VERSION(3,9,0))
24
25 static inline
26 int wrapper_uprobe_register(struct inode *inode, loff_t offset, struct uprobe_consumer *uc)
27 {
28 return uprobe_register(inode, offset, uc);
29 }
30
31 static inline
32 void wrapper_uprobe_unregister(struct inode *inode, loff_t offset, struct uprobe_consumer *uc)
33 {
34 uprobe_unregister(inode, offset, uc);
35 }
36
37 #else /* Version < 3.9, use kallsym lookup. */
38 #include "kallsyms.h"
39
40 static inline
41 int wrapper_uprobe_register(struct inode *inode, loff_t offset, struct uprobe_consumer *uc)
42 {
43 int (*uprobe_register_sym)(struct inode *inode, loff_t offset, struct uprobe_consumer *uc);
44
45 uprobe_register_sym = (void *) kallsyms_lookup_funcptr("uprobe_register");
46
47 if (uprobe_register_sym) {
48 return uprobe_register_sym(inode, offset, uc);
49 } else {
50 printk(KERN_WARNING "LTTng: uprobe_register symbol lookup failed.\n");
51 return -EINVAL;
52 }
53 }
54
55 /*
56 * Canary function to check for 'uprobe_register()' at compile time.
57 *
58 * From 'include/linux/uprobes.h':
59 *
60 * extern int uprobe_register(struct inode *inode, loff_t offset, struct uprobe_consumer *uc);
61 */
62 static inline
63 int __canary__uprobe_register(struct inode *inode, loff_t offset, struct uprobe_consumer *uc)
64 {
65 return uprobe_register(inode, offset, uc);
66 }
67
68 static inline
69 void wrapper_uprobe_unregister(struct inode *inode, loff_t offset, struct uprobe_consumer *uc)
70 {
71 int (*uprobe_unregister_sym)(struct inode *inode, loff_t offset, struct uprobe_consumer *uc);
72
73 uprobe_unregister_sym = (void *) kallsyms_lookup_funcptr("uprobe_unregister");
74
75 if (uprobe_unregister_sym) {
76 uprobe_unregister_sym(inode, offset, uc);
77 } else {
78 printk(KERN_WARNING "LTTng: uprobe_unregister symbol lookup failed.\n");
79 WARN_ON(1);
80 }
81 }
82
83 /*
84 * Canary function to check for 'uprobe_unregister()' at compile time.
85 *
86 * From 'include/linux/uprobes.h':
87 *
88 * extern void uprobe_unregister(struct inode *inode, loff_t offset, struct uprobe_consumer *uc);
89 */
90 static inline
91 void __canary__uprobe_unregister(struct inode *inode, loff_t offset, struct uprobe_consumer *uc)
92 {
93 uprobe_unregister(inode, offset, uc);
94 }
95
96 #endif
97 #else
98 /* Version < 3.5, before uprobe was added. */
99 struct uprobe_consumer {};
100
101 #endif
102 #endif
This page took 0.030243 seconds and 4 git commands to generate.