X-Git-Url: http://git.lttng.org./?a=blobdiff_plain;f=src%2Fwrapper%2Fkallsyms.c;h=061224dee26876ca88f2651298b6ce5ee0552f37;hb=d1fea60895526d461646b2918eb53bed2f40b6eb;hp=6af77f538950d7b3718bd33fffb749053ae03333;hpb=cfa6cc1d0f01c2cfcc1a679abf3a6572d411c309;p=lttng-modules.git diff --git a/src/wrapper/kallsyms.c b/src/wrapper/kallsyms.c index 6af77f53..061224de 100644 --- a/src/wrapper/kallsyms.c +++ b/src/wrapper/kallsyms.c @@ -14,7 +14,7 @@ #include #include -#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" @@ -39,10 +39,26 @@ 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); +#else addr = (unsigned long)probe.addr; +#endif #ifdef CONFIG_ARM #ifdef CONFIG_THUMB2_KERNEL if (addr) @@ -61,7 +77,7 @@ unsigned long wrapper_kallsyms_lookup_name(const char *name) if (kallsyms_lookup_name_sym) return kallsyms_lookup_name_sym(name); else { - printk_once(KERN_WARNING "LTTng requires kallsyms_lookup_name\n"); + printk_once(KERN_WARNING "LTTng: requires kallsyms_lookup_name\n"); return 0; } }