Message ID | 0f8685ca8b0d0b467a0d5ae60e666558d85062ed.1491991939.git.naveen.n.rao@linux.vnet.ibm.com (mailing list archive) |
---|---|
State | Changes Requested |
Headers | show |
On Wed, 12 Apr 2017 16:28:26 +0530 "Naveen N. Rao" <naveen.n.rao@linux.vnet.ibm.com> wrote: > kprobe_lookup_name() is specific to the kprobe subsystem and may not > always return the function entry point (in a subsequent patch for > KPROBES_ON_FTRACE). If so, please move this patch into that series. It is hard to review patches which requires for other series. Thank you, > For looking up function entry points, introduce a > separate helper and use the same in optprobes.c > > Signed-off-by: Naveen N. Rao <naveen.n.rao@linux.vnet.ibm.com> > --- > arch/powerpc/include/asm/code-patching.h | 37 ++++++++++++++++++++++++++++++++ > arch/powerpc/kernel/optprobes.c | 6 +++--- > 2 files changed, 40 insertions(+), 3 deletions(-) > > diff --git a/arch/powerpc/include/asm/code-patching.h b/arch/powerpc/include/asm/code-patching.h > index 8ab937771068..3e994f404434 100644 > --- a/arch/powerpc/include/asm/code-patching.h > +++ b/arch/powerpc/include/asm/code-patching.h > @@ -12,6 +12,8 @@ > > #include <asm/types.h> > #include <asm/ppc-opcode.h> > +#include <linux/string.h> > +#include <linux/kallsyms.h> > > /* Flags for create_branch: > * "b" == create_branch(addr, target, 0); > @@ -99,6 +101,41 @@ static inline unsigned long ppc_global_function_entry(void *func) > #endif > } > > +/* > + * Wrapper around kallsyms_lookup() to return function entry address: > + * - For ABIv1, we lookup the dot variant. > + * - For ABIv2, we return the local entry point. > + */ > +static inline unsigned long ppc_kallsyms_lookup_name(const char *name) > +{ > + unsigned long addr; > +#ifdef PPC64_ELF_ABI_v1 > + /* check for dot variant */ > + char dot_name[1 + KSYM_NAME_LEN]; > + bool dot_appended = false; > + if (name[0] != '.') { > + dot_name[0] = '.'; > + dot_name[1] = '\0'; > + strncat(dot_name, name, KSYM_NAME_LEN - 2); > + dot_appended = true; > + } else { > + dot_name[0] = '\0'; > + strncat(dot_name, name, KSYM_NAME_LEN - 1); > + } > + addr = kallsyms_lookup_name(dot_name); > + if (!addr && dot_appended) > + /* Let's try the original non-dot symbol lookup */ > + addr = kallsyms_lookup_name(name); > +#elif defined(PPC64_ELF_ABI_v2) > + addr = kallsyms_lookup_name(name); > + if (addr) > + addr = ppc_function_entry((void *)addr); > +#else > + addr = kallsyms_lookup_name(name); > +#endif > + return addr; > +} > + > #ifdef CONFIG_PPC64 > /* > * Some instruction encodings commonly used in dynamic ftracing > diff --git a/arch/powerpc/kernel/optprobes.c b/arch/powerpc/kernel/optprobes.c > index ce81a322251c..ec60ed0d4aad 100644 > --- a/arch/powerpc/kernel/optprobes.c > +++ b/arch/powerpc/kernel/optprobes.c > @@ -243,10 +243,10 @@ int arch_prepare_optimized_kprobe(struct optimized_kprobe *op, struct kprobe *p) > /* > * 2. branch to optimized_callback() and emulate_step() > */ > - op_callback_addr = kprobe_lookup_name("optimized_callback", 0); > - emulate_step_addr = kprobe_lookup_name("emulate_step", 0); > + op_callback_addr = (kprobe_opcode_t *)ppc_kallsyms_lookup_name("optimized_callback"); > + emulate_step_addr = (kprobe_opcode_t *)ppc_kallsyms_lookup_name("emulate_step"); > if (!op_callback_addr || !emulate_step_addr) { > - WARN(1, "kprobe_lookup_name() failed\n"); > + WARN(1, "Unable to lookup optimized_callback()/emulate_step()\n"); > goto error; > } > > -- > 2.12.1 >
On 2017/04/13 01:32PM, Masami Hiramatsu wrote: > On Wed, 12 Apr 2017 16:28:26 +0530 > "Naveen N. Rao" <naveen.n.rao@linux.vnet.ibm.com> wrote: > > > kprobe_lookup_name() is specific to the kprobe subsystem and may not > > always return the function entry point (in a subsequent patch for > > KPROBES_ON_FTRACE). > > If so, please move this patch into that series. It is hard to review > patches which requires for other series. :-) This patch was originally the first in this series to try avoiding the need for converting kprobe_lookup_name() in optprobes.c. But, with the re-shuffle, this is more suitable in the other series. I will move it. Thanks, Naveen
diff --git a/arch/powerpc/include/asm/code-patching.h b/arch/powerpc/include/asm/code-patching.h index 8ab937771068..3e994f404434 100644 --- a/arch/powerpc/include/asm/code-patching.h +++ b/arch/powerpc/include/asm/code-patching.h @@ -12,6 +12,8 @@ #include <asm/types.h> #include <asm/ppc-opcode.h> +#include <linux/string.h> +#include <linux/kallsyms.h> /* Flags for create_branch: * "b" == create_branch(addr, target, 0); @@ -99,6 +101,41 @@ static inline unsigned long ppc_global_function_entry(void *func) #endif } +/* + * Wrapper around kallsyms_lookup() to return function entry address: + * - For ABIv1, we lookup the dot variant. + * - For ABIv2, we return the local entry point. + */ +static inline unsigned long ppc_kallsyms_lookup_name(const char *name) +{ + unsigned long addr; +#ifdef PPC64_ELF_ABI_v1 + /* check for dot variant */ + char dot_name[1 + KSYM_NAME_LEN]; + bool dot_appended = false; + if (name[0] != '.') { + dot_name[0] = '.'; + dot_name[1] = '\0'; + strncat(dot_name, name, KSYM_NAME_LEN - 2); + dot_appended = true; + } else { + dot_name[0] = '\0'; + strncat(dot_name, name, KSYM_NAME_LEN - 1); + } + addr = kallsyms_lookup_name(dot_name); + if (!addr && dot_appended) + /* Let's try the original non-dot symbol lookup */ + addr = kallsyms_lookup_name(name); +#elif defined(PPC64_ELF_ABI_v2) + addr = kallsyms_lookup_name(name); + if (addr) + addr = ppc_function_entry((void *)addr); +#else + addr = kallsyms_lookup_name(name); +#endif + return addr; +} + #ifdef CONFIG_PPC64 /* * Some instruction encodings commonly used in dynamic ftracing diff --git a/arch/powerpc/kernel/optprobes.c b/arch/powerpc/kernel/optprobes.c index ce81a322251c..ec60ed0d4aad 100644 --- a/arch/powerpc/kernel/optprobes.c +++ b/arch/powerpc/kernel/optprobes.c @@ -243,10 +243,10 @@ int arch_prepare_optimized_kprobe(struct optimized_kprobe *op, struct kprobe *p) /* * 2. branch to optimized_callback() and emulate_step() */ - op_callback_addr = kprobe_lookup_name("optimized_callback", 0); - emulate_step_addr = kprobe_lookup_name("emulate_step", 0); + op_callback_addr = (kprobe_opcode_t *)ppc_kallsyms_lookup_name("optimized_callback"); + emulate_step_addr = (kprobe_opcode_t *)ppc_kallsyms_lookup_name("emulate_step"); if (!op_callback_addr || !emulate_step_addr) { - WARN(1, "kprobe_lookup_name() failed\n"); + WARN(1, "Unable to lookup optimized_callback()/emulate_step()\n"); goto error; }
kprobe_lookup_name() is specific to the kprobe subsystem and may not always return the function entry point (in a subsequent patch for KPROBES_ON_FTRACE). For looking up function entry points, introduce a separate helper and use the same in optprobes.c Signed-off-by: Naveen N. Rao <naveen.n.rao@linux.vnet.ibm.com> --- arch/powerpc/include/asm/code-patching.h | 37 ++++++++++++++++++++++++++++++++ arch/powerpc/kernel/optprobes.c | 6 +++--- 2 files changed, 40 insertions(+), 3 deletions(-)