fix: kallsyms wrapper on CONFIG_PPC64_ELF_ABI_V1
authorMichael Jeanson <mjeanson@efficios.com>
Tue, 29 Nov 2022 17:10:17 +0000 (12:10 -0500)
committerMathieu Desnoyers <mathieu.desnoyers@efficios.com>
Tue, 28 Mar 2023 14:21:49 +0000 (10:21 -0400)
Change-Id: Ibdff5792a1511b678f7776f5d032758db739c5ad
Signed-off-by: Michael Jeanson <mjeanson@efficios.com>
Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
src/wrapper/kallsyms.c

index 061224dee26876ca88f2651298b6ce5ee0552f37..97897c425469ea5411a0feded86a0ad03f9b8942 100644 (file)
 # error "LTTng-modules requires CONFIG_KPROBES on kernels >= 5.7.0"
 #endif
 
+#ifdef LTTNG_CONFIG_PPC64_ELF_ABI_V1
+#if (LTTNG_LINUX_VERSION_CODE >= LTTNG_KERNEL_VERSION(5,18,0))
+#include <asm/elf.h>
+
+#define LTTNG_FUNC_DESC_TYPE struct func_desc
+#define LTTNG_FUNC_DESC_ADDR_NAME addr
+
+#else
+
+#include <asm/types.h>
+
+#define LTTNG_FUNC_DESC_TYPE func_descr_t
+#define LTTNG_FUNC_DESC_ADDR_NAME entry
+#endif
+
+static
+LTTNG_FUNC_DESC_TYPE kallsyms_lookup_name_func_desc;
+#endif
+
 static
 unsigned long (*kallsyms_lookup_name_sym)(const char *name);
 
@@ -56,6 +75,16 @@ unsigned long do_get_kallsyms(void)
 #ifdef LTTNG_CONFIG_PPC64_ELF_ABI_V2
        /* Substract 4 bytes to get what we originally want */
        addr = (unsigned long)(((char *)probe.addr) - 4);
+#elif defined(LTTNG_CONFIG_PPC64_ELF_ABI_V1)
+       /*
+        * Build a function descriptor from the address of
+        * 'kallsyms_lookup_name' returned by kprobe and the toc of
+        * 'sprint_symbol' which is in the same compile unit and exported. I
+        * hate this on so many levels but it works.
+        */
+       kallsyms_lookup_name_func_desc.LTTNG_FUNC_DESC_ADDR_NAME = (unsigned long) probe.addr;
+       kallsyms_lookup_name_func_desc.toc = ((LTTNG_FUNC_DESC_TYPE *) &sprint_symbol)->toc;
+       addr = (unsigned long) &kallsyms_lookup_name_func_desc;
 #else
        addr = (unsigned long)probe.addr;
 #endif
This page took 0.026071 seconds and 4 git commands to generate.