Namespace kernel version macros
[lttng-modules.git] / include / wrapper / uprobes.h
CommitLineData
b7cdc182 1/* SPDX-License-Identifier: (GPL-2.0-only or LGPL-2.1-only)
8134eb60 2 *
149b9a9d
YB
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 *
149b9a9d
YB
12 */
13
8134eb60
MJ
14#ifndef _LTTNG_WRAPPER_UPROBES_H
15#define _LTTNG_WRAPPER_UPROBES_H
16
5f4c791e 17#include <lttng/kernel-version.h>
149b9a9d 18
5f4c791e 19#if (LTTNG_LINUX_VERSION_CODE >= LTTNG_KERNEL_VERSION(3,5,0))
149b9a9d
YB
20#include <linux/uprobes.h>
21
22/* Use kallsym lookup for version before 3.9. */
5f4c791e 23#if (LTTNG_LINUX_VERSION_CODE >= LTTNG_KERNEL_VERSION(3,9,0))
149b9a9d
YB
24
25static inline
26int wrapper_uprobe_register(struct inode *inode, loff_t offset, struct uprobe_consumer *uc)
27{
28 return uprobe_register(inode, offset, uc);
29}
30
31static inline
32void 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
40static inline
41int 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
3dfec228
MJ
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 */
62static inline
63int __canary__uprobe_register(struct inode *inode, loff_t offset, struct uprobe_consumer *uc)
64{
65 return uprobe_register(inode, offset, uc);
66}
67
149b9a9d
YB
68static inline
69void 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}
3dfec228
MJ
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 */
90static inline
213231d6 91void __canary__uprobe_unregister(struct inode *inode, loff_t offset, struct uprobe_consumer *uc)
3dfec228 92{
213231d6 93 uprobe_unregister(inode, offset, uc);
3dfec228
MJ
94}
95
149b9a9d
YB
96#endif
97#else
98/* Version < 3.5, before uprobe was added. */
99struct uprobe_consumer {};
100
101#endif
102#endif
This page took 0.036201 seconds and 4 git commands to generate.