X-Git-Url: http://git.liburcu.org/?a=blobdiff_plain;f=src%2Fwrapper%2Fkallsyms.c;h=e5b5e3101f42313b60fc2fd83bf507d6aaf44724;hb=95b4bc7dcb6ff39b590260eb80d5e4db5888f083;hp=93017adc87a6ab40cec47989df3659e56a92b2f1;hpb=67c5ffca487ea357b2e59841f51293ec25d85983;p=lttng-modules.git diff --git a/src/wrapper/kallsyms.c b/src/wrapper/kallsyms.c index 93017adc..e5b5e310 100644 --- a/src/wrapper/kallsyms.c +++ b/src/wrapper/kallsyms.c @@ -20,6 +20,25 @@ # 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 + +#define LTTNG_FUNC_DESC_TYPE struct func_desc +#define LTTNG_FUNC_DESC_ADDR_NAME addr + +#else + +#include + +#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,7 +58,7 @@ unsigned long do_get_kallsyms(void) memset(&probe, 0, sizeof(probe)); probe.pre_handler = dummy_kprobe_handler; probe.symbol_name = "kallsyms_lookup_name"; -#ifdef PPC64_ELF_ABI_v2 +#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 @@ -53,9 +72,19 @@ unsigned long do_get_kallsyms(void) ret = register_kprobe(&probe); if (ret) return 0; -#ifdef PPC64_ELF_ABI_v2 +#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 @@ -84,3 +113,7 @@ unsigned long wrapper_kallsyms_lookup_name(const char *name) EXPORT_SYMBOL_GPL(wrapper_kallsyms_lookup_name); #endif + +#if (LTTNG_LINUX_VERSION_CODE >= LTTNG_KERNEL_VERSION(5,4,0) && defined(CONFIG_ANDROID)) +MODULE_IMPORT_NS(VFS_internal_I_am_really_a_filesystem_and_am_NOT_a_driver); +#endif