Android: Import VFS namespace for android common kernel
[lttng-modules.git] / wrapper / kallsyms.c
index d892a2f4860a3b783296b3a0ad8f87011114fea9..77cdb76c3f150e4da4d02f27aff7819bc7bc3e92 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);
 
@@ -39,10 +58,36 @@ unsigned long do_get_kallsyms(void)
        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);
+#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
 #ifdef CONFIG_ARM
 #ifdef CONFIG_THUMB2_KERNEL
        if (addr)
@@ -68,3 +113,7 @@ unsigned long wrapper_kallsyms_lookup_name(const char *name)
 EXPORT_SYMBOL_GPL(wrapper_kallsyms_lookup_name);
 
 #endif
+
+#ifdef CONFIG_ANDROID
+MODULE_IMPORT_NS(VFS_internal_I_am_really_a_filesystem_and_am_NOT_a_driver);
+#endif
This page took 0.023839 seconds and 4 git commands to generate.