#include <linux/module.h>
#include <wrapper/kallsyms.h>
-#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5,7,0))
+#if (LTTNG_LINUX_VERSION_CODE >= LTTNG_KERNEL_VERSION(5,7,0))
#ifndef CONFIG_KPROBES
# error "LTTng-modules requires CONFIG_KPROBES on kernels >= 5.7.0"
memset(&probe, 0, sizeof(probe));
probe.pre_handler = dummy_kprobe_handler;
probe.symbol_name = "kallsyms_lookup_name";
+#ifdef LTTNG_CONFIG_PPC64_ELF_ABI_V2
+ /*
+ * With powerpc64 ABIv2, we need the global entry point of
+ * kallsyms_lookup_name to call it later, while kprobe_register would
+ * automatically adjust the global entry point to the local entry point,
+ * when a kprobe was registered at a function entry. So we add 4 bytes
+ * which is the length of one instruction to kallsyms_lookup_name to
+ * avoid the adjustment.
+ */
+ probe.offset = 4;
+#endif
ret = register_kprobe(&probe);
if (ret)
return 0;
+#ifdef LTTNG_CONFIG_PPC64_ELF_ABI_V2
+ /* Substract 4 bytes to get what we originally want */
+ addr = (unsigned long)(((char *)probe.addr) - 4);
+#else
addr = (unsigned long)probe.addr;
+#endif
#ifdef CONFIG_ARM
#ifdef CONFIG_THUMB2_KERNEL
if (addr)