Unbreak LTTng for kernel 5.7
[lttng-modules.git] / wrapper / kallsyms.c
diff --git a/wrapper/kallsyms.c b/wrapper/kallsyms.c
new file mode 100644 (file)
index 0000000..6af77f5
--- /dev/null
@@ -0,0 +1,70 @@
+/* SPDX-License-Identifier: (GPL-2.0-only OR LGPL-2.1-only)
+ *
+ * wrapper/kallsyms.c
+ *
+ * Wrapper around kallsyms. Using kprobes to get its address when available.
+ *
+ * Can we mainline LTTng already so we don't have to waste our time doing this
+ * kind of hack ?
+ *
+ * Copyright (C) 2020 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
+ */
+
+#include <linux/kprobes.h>
+#include <linux/module.h>
+#include <wrapper/kallsyms.h>
+
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5,7,0))
+
+#ifndef CONFIG_KPROBES
+# error "LTTng-modules requires CONFIG_KPROBES on kernels >= 5.7.0"
+#endif
+
+static
+unsigned long (*kallsyms_lookup_name_sym)(const char *name);
+
+static
+int dummy_kprobe_handler(struct kprobe *p, struct pt_regs *regs)
+{
+       return 0;
+}
+
+static
+unsigned long do_get_kallsyms(void)
+{
+       struct kprobe probe;
+       int ret;
+       unsigned long addr;
+
+       memset(&probe, 0, sizeof(probe));
+       probe.pre_handler = dummy_kprobe_handler;
+       probe.symbol_name = "kallsyms_lookup_name";
+       ret = register_kprobe(&probe);
+       if (ret)
+               return 0;
+       addr = (unsigned long)probe.addr;
+#ifdef CONFIG_ARM
+#ifdef CONFIG_THUMB2_KERNEL
+       if (addr)
+               addr |= 1; /* set bit 0 in address for thumb mode */
+#endif
+#endif
+       unregister_kprobe(&probe);
+       return addr;
+}
+
+unsigned long wrapper_kallsyms_lookup_name(const char *name)
+{
+       if (!kallsyms_lookup_name_sym) {
+               kallsyms_lookup_name_sym = (void *)do_get_kallsyms();
+       }
+       if (kallsyms_lookup_name_sym)
+               return kallsyms_lookup_name_sym(name);
+       else {
+               printk_once(KERN_WARNING "LTTng requires kallsyms_lookup_name\n");
+               return 0;
+       }
+}
+EXPORT_SYMBOL_GPL(wrapper_kallsyms_lookup_name);
+
+#endif
This page took 0.025593 seconds and 4 git commands to generate.