Re: [RFT PATCH -next ] [BUGFIX] kprobes: Fix "Failed to find blacklist" error on ia64 and ppc64
(2014/05/26 20:25), Suzuki K. Poulose wrote: > On 05/07/2014 05:25 PM, Masami Hiramatsu wrote: >> On ia64 and ppc64, the function pointer does not point the >> entry address of the function, but the address of function >> discriptor (which contains the entry address and misc >> data.) Since the kprobes passes the function pointer stored >> by NOKPROBE_SYMBOL() to kallsyms_lookup_size_offset() for >> initalizing its blacklist, it fails and reports many errors >> as below. >> >> Failed to find blacklist 000101316830 >> Failed to find blacklist 0001013000f0a000 >> Failed to find blacklist 000101315f70a000 >> Failed to find blacklist 000101324c80a000 >> Failed to find blacklist 0001013063f0a000 >> Failed to find blacklist 000101327800a000 >> Failed to find blacklist 0001013277f0a000 >> Failed to find blacklist 000101315a70a000 >> Failed to find blacklist 0001013277e0a000 >> Failed to find blacklist 000101305a20a000 >> Failed to find blacklist 0001013277d0a000 >> Failed to find blacklist 00010130bdc0a000 >> Failed to find blacklist 00010130dc20a000 >> Failed to find blacklist 000101309a00a000 >> Failed to find blacklist 0001013277c0a000 >> Failed to find blacklist 0001013277b0a000 >> Failed to find blacklist 0001013277a0a000 >> Failed to find blacklist 000101327790a000 >> Failed to find blacklist 000101303140a000 >> Failed to find blacklist 0001013a3280a000 >> >> To fix this bug, this introduces function_entry() macro to >> retrieve the entry address from the given function pointer, >> and uses it in NOKPROBE_SYMBOL(). >> >> >> Signed-off-by: Masami Hiramatsu >> Reported-by: Tony Luck >> Cc: Tony Luck >> Cc: Fenghua Yu >> Cc: Benjamin Herrenschmidt >> Cc: Paul Mackerras >> Cc: Ananth N Mavinakayanahalli >> Cc: Kevin Hao >> Cc: linux-i...@vger.kernel.org >> Cc: linux-kernel@vger.kernel.org >> Cc: linuxppc-...@lists.ozlabs.org >> --- >> arch/ia64/include/asm/types.h|2 ++ >> arch/powerpc/include/asm/types.h | 11 +++ >> include/linux/kprobes.h |3 ++- >> include/linux/types.h|4 >> 4 files changed, 19 insertions(+), 1 deletion(-) >> >> diff --git a/arch/ia64/include/asm/types.h b/arch/ia64/include/asm/types.h >> index 4c351b1..6ab7b6c 100644 >> --- a/arch/ia64/include/asm/types.h >> +++ b/arch/ia64/include/asm/types.h >> @@ -27,5 +27,7 @@ struct fnptr { >> unsigned long gp; >> }; >> >> +#define constant_function_entry(fn) (((struct fnptr *)(fn))->ip) >> + >> #endif /* !__ASSEMBLY__ */ >> #endif /* _ASM_IA64_TYPES_H */ >> diff --git a/arch/powerpc/include/asm/types.h >> b/arch/powerpc/include/asm/types.h >> index bfb6ded..fd297b8 100644 >> --- a/arch/powerpc/include/asm/types.h >> +++ b/arch/powerpc/include/asm/types.h >> @@ -25,6 +25,17 @@ typedef struct { >> unsigned long env; >> } func_descr_t; >> >> +#if defined(CONFIG_PPC64) && (!defined(_CALL_ELF) || _CALL_ELF == 1) >> +/* >> + * On PPC64 ABIv1 the function pointer actually points to the >> + * function's descriptor. The first entry in the descriptor is the >> + * address of the function text. >> + */ >> +#define constant_function_entry(fn) (((func_descr_t *)(fn))->entry) >> +#else >> +#define constant_function_entry(fn) ((unsigned long)(fn)) >> +#endif >> + >> #endif /* __ASSEMBLY__ */ >> >> #endif /* _ASM_POWERPC_TYPES_H */ >> diff --git a/include/linux/kprobes.h b/include/linux/kprobes.h >> index e059507..637eafe 100644 >> --- a/include/linux/kprobes.h >> +++ b/include/linux/kprobes.h >> @@ -40,6 +40,7 @@ >> #include >> #include >> #include >> +#include >> >> #ifdef CONFIG_KPROBES >> #include >> @@ -485,7 +486,7 @@ static inline int enable_jprobe(struct jprobe *jp) >> #define __NOKPROBE_SYMBOL(fname)\ >> static unsigned long __used \ >> __attribute__((section("_kprobe_blacklist"))) \ >> -_kbl_addr_##fname = (unsigned long)fname; >> +_kbl_addr_##fname = constant_function_entry(fname); >> #define NOKPROBE_SYMBOL(fname) __NOKPROBE_SYMBOL(fname) > > > Throws up build errors for me : > > CC kernel/notifier.o > kernel/notifier.c:105:1: error: initializer element is not constant > NOKPROBE_SYMBOL(notifier_call_chain); > ^ > kernel/notifier.c:188:1: error: initializer element is not constant > NOKPROBE_SYMBOL(__atomic_notifier_call_chain); > ^ > kernel/notifier.c:196:1: error: initializer element is not constant > NOKPROBE_SYMBOL(atomic_notifier_call_chain); > ^ > kernel/notifier.c:546:1: error: initializer element is not constant > NOKPROBE_SYMBOL(notify_die); > ^ > make[1]: *** [kernel/notifier.o] Error 1 > make: *** [kernel] Error 2 Thanks for the test! >> +#define constant_function_entry(fn) (((func_descr_t *)(fn))->entry) Ah! right, This is not allowed for initialization... I'll update it to deref pointer when it is used. Thank you again! > > Thanks > Suzuki > > -- Masami HIRAMATSU Software Platform Research Dept. Linux Techn
Re: [RFT PATCH -next ] [BUGFIX] kprobes: Fix "Failed to find blacklist" error on ia64 and ppc64
On 05/07/2014 05:25 PM, Masami Hiramatsu wrote: > On ia64 and ppc64, the function pointer does not point the > entry address of the function, but the address of function > discriptor (which contains the entry address and misc > data.) Since the kprobes passes the function pointer stored > by NOKPROBE_SYMBOL() to kallsyms_lookup_size_offset() for > initalizing its blacklist, it fails and reports many errors > as below. > > Failed to find blacklist 000101316830 > Failed to find blacklist 0001013000f0a000 > Failed to find blacklist 000101315f70a000 > Failed to find blacklist 000101324c80a000 > Failed to find blacklist 0001013063f0a000 > Failed to find blacklist 000101327800a000 > Failed to find blacklist 0001013277f0a000 > Failed to find blacklist 000101315a70a000 > Failed to find blacklist 0001013277e0a000 > Failed to find blacklist 000101305a20a000 > Failed to find blacklist 0001013277d0a000 > Failed to find blacklist 00010130bdc0a000 > Failed to find blacklist 00010130dc20a000 > Failed to find blacklist 000101309a00a000 > Failed to find blacklist 0001013277c0a000 > Failed to find blacklist 0001013277b0a000 > Failed to find blacklist 0001013277a0a000 > Failed to find blacklist 000101327790a000 > Failed to find blacklist 000101303140a000 > Failed to find blacklist 0001013a3280a000 > > To fix this bug, this introduces function_entry() macro to > retrieve the entry address from the given function pointer, > and uses it in NOKPROBE_SYMBOL(). > > > Signed-off-by: Masami Hiramatsu > Reported-by: Tony Luck > Cc: Tony Luck > Cc: Fenghua Yu > Cc: Benjamin Herrenschmidt > Cc: Paul Mackerras > Cc: Ananth N Mavinakayanahalli > Cc: Kevin Hao > Cc: linux-i...@vger.kernel.org > Cc: linux-kernel@vger.kernel.org > Cc: linuxppc-...@lists.ozlabs.org > --- > arch/ia64/include/asm/types.h|2 ++ > arch/powerpc/include/asm/types.h | 11 +++ > include/linux/kprobes.h |3 ++- > include/linux/types.h|4 > 4 files changed, 19 insertions(+), 1 deletion(-) > > diff --git a/arch/ia64/include/asm/types.h b/arch/ia64/include/asm/types.h > index 4c351b1..6ab7b6c 100644 > --- a/arch/ia64/include/asm/types.h > +++ b/arch/ia64/include/asm/types.h > @@ -27,5 +27,7 @@ struct fnptr { > unsigned long gp; > }; > > +#define constant_function_entry(fn) (((struct fnptr *)(fn))->ip) > + > #endif /* !__ASSEMBLY__ */ > #endif /* _ASM_IA64_TYPES_H */ > diff --git a/arch/powerpc/include/asm/types.h > b/arch/powerpc/include/asm/types.h > index bfb6ded..fd297b8 100644 > --- a/arch/powerpc/include/asm/types.h > +++ b/arch/powerpc/include/asm/types.h > @@ -25,6 +25,17 @@ typedef struct { > unsigned long env; > } func_descr_t; > > +#if defined(CONFIG_PPC64) && (!defined(_CALL_ELF) || _CALL_ELF == 1) > +/* > + * On PPC64 ABIv1 the function pointer actually points to the > + * function's descriptor. The first entry in the descriptor is the > + * address of the function text. > + */ > +#define constant_function_entry(fn) (((func_descr_t *)(fn))->entry) > +#else > +#define constant_function_entry(fn) ((unsigned long)(fn)) > +#endif > + > #endif /* __ASSEMBLY__ */ > > #endif /* _ASM_POWERPC_TYPES_H */ > diff --git a/include/linux/kprobes.h b/include/linux/kprobes.h > index e059507..637eafe 100644 > --- a/include/linux/kprobes.h > +++ b/include/linux/kprobes.h > @@ -40,6 +40,7 @@ > #include > #include > #include > +#include > > #ifdef CONFIG_KPROBES > #include > @@ -485,7 +486,7 @@ static inline int enable_jprobe(struct jprobe *jp) > #define __NOKPROBE_SYMBOL(fname) \ > static unsigned long __used \ > __attribute__((section("_kprobe_blacklist"))) \ > - _kbl_addr_##fname = (unsigned long)fname; > + _kbl_addr_##fname = constant_function_entry(fname); > #define NOKPROBE_SYMBOL(fname) __NOKPROBE_SYMBOL(fname) Throws up build errors for me : CC kernel/notifier.o kernel/notifier.c:105:1: error: initializer element is not constant NOKPROBE_SYMBOL(notifier_call_chain); ^ kernel/notifier.c:188:1: error: initializer element is not constant NOKPROBE_SYMBOL(__atomic_notifier_call_chain); ^ kernel/notifier.c:196:1: error: initializer element is not constant NOKPROBE_SYMBOL(atomic_notifier_call_chain); ^ kernel/notifier.c:546:1: error: initializer element is not constant NOKPROBE_SYMBOL(notify_die); ^ make[1]: *** [kernel/notifier.o] Error 1 make: *** [kernel] Error 2 Thanks Suzuki -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
Re: Re: [RFT PATCH -next ] [BUGFIX] kprobes: Fix "Failed to find blacklist" error on ia64 and ppc64
(2014/05/07 20:59), Masami Hiramatsu wrote: > Hi Tony, Benjamin and Paul, > > I've tried to fix this bug, but since I don't have either ppc64 nor ia64, > this patch is not tested on those archs. Please review and test it on > those machines. Ping? I need your help since I don't have test environment. Thank you, > > Thank you, > > (2014/05/07 20:55), Masami Hiramatsu wrote: >> On ia64 and ppc64, the function pointer does not point the >> entry address of the function, but the address of function >> discriptor (which contains the entry address and misc >> data.) Since the kprobes passes the function pointer stored >> by NOKPROBE_SYMBOL() to kallsyms_lookup_size_offset() for >> initalizing its blacklist, it fails and reports many errors >> as below. >> >> Failed to find blacklist 000101316830 >> Failed to find blacklist 0001013000f0a000 >> Failed to find blacklist 000101315f70a000 >> Failed to find blacklist 000101324c80a000 >> Failed to find blacklist 0001013063f0a000 >> Failed to find blacklist 000101327800a000 >> Failed to find blacklist 0001013277f0a000 >> Failed to find blacklist 000101315a70a000 >> Failed to find blacklist 0001013277e0a000 >> Failed to find blacklist 000101305a20a000 >> Failed to find blacklist 0001013277d0a000 >> Failed to find blacklist 00010130bdc0a000 >> Failed to find blacklist 00010130dc20a000 >> Failed to find blacklist 000101309a00a000 >> Failed to find blacklist 0001013277c0a000 >> Failed to find blacklist 0001013277b0a000 >> Failed to find blacklist 0001013277a0a000 >> Failed to find blacklist 000101327790a000 >> Failed to find blacklist 000101303140a000 >> Failed to find blacklist 0001013a3280a000 >> >> To fix this bug, this introduces function_entry() macro to >> retrieve the entry address from the given function pointer, >> and uses it in NOKPROBE_SYMBOL(). >> >> >> Signed-off-by: Masami Hiramatsu >> Reported-by: Tony Luck >> Cc: Tony Luck >> Cc: Fenghua Yu >> Cc: Benjamin Herrenschmidt >> Cc: Paul Mackerras >> Cc: Ananth N Mavinakayanahalli >> Cc: Kevin Hao >> Cc: linux-i...@vger.kernel.org >> Cc: linux-kernel@vger.kernel.org >> Cc: linuxppc-...@lists.ozlabs.org >> --- >> arch/ia64/include/asm/types.h|2 ++ >> arch/powerpc/include/asm/types.h | 11 +++ >> include/linux/kprobes.h |3 ++- >> include/linux/types.h|4 >> 4 files changed, 19 insertions(+), 1 deletion(-) >> >> diff --git a/arch/ia64/include/asm/types.h b/arch/ia64/include/asm/types.h >> index 4c351b1..6ab7b6c 100644 >> --- a/arch/ia64/include/asm/types.h >> +++ b/arch/ia64/include/asm/types.h >> @@ -27,5 +27,7 @@ struct fnptr { >> unsigned long gp; >> }; >> >> +#define constant_function_entry(fn) (((struct fnptr *)(fn))->ip) >> + >> #endif /* !__ASSEMBLY__ */ >> #endif /* _ASM_IA64_TYPES_H */ >> diff --git a/arch/powerpc/include/asm/types.h >> b/arch/powerpc/include/asm/types.h >> index bfb6ded..fd297b8 100644 >> --- a/arch/powerpc/include/asm/types.h >> +++ b/arch/powerpc/include/asm/types.h >> @@ -25,6 +25,17 @@ typedef struct { >> unsigned long env; >> } func_descr_t; >> >> +#if defined(CONFIG_PPC64) && (!defined(_CALL_ELF) || _CALL_ELF == 1) >> +/* >> + * On PPC64 ABIv1 the function pointer actually points to the >> + * function's descriptor. The first entry in the descriptor is the >> + * address of the function text. >> + */ >> +#define constant_function_entry(fn) (((func_descr_t *)(fn))->entry) >> +#else >> +#define constant_function_entry(fn) ((unsigned long)(fn)) >> +#endif >> + >> #endif /* __ASSEMBLY__ */ >> >> #endif /* _ASM_POWERPC_TYPES_H */ >> diff --git a/include/linux/kprobes.h b/include/linux/kprobes.h >> index e059507..637eafe 100644 >> --- a/include/linux/kprobes.h >> +++ b/include/linux/kprobes.h >> @@ -40,6 +40,7 @@ >> #include >> #include >> #include >> +#include >> >> #ifdef CONFIG_KPROBES >> #include >> @@ -485,7 +486,7 @@ static inline int enable_jprobe(struct jprobe *jp) >> #define __NOKPROBE_SYMBOL(fname)\ >> static unsigned long __used \ >> __attribute__((section("_kprobe_blacklist"))) \ >> -_kbl_addr_##fname = (unsigned long)fname; >> +_kbl_addr_##fname = constant_function_entry(fname); >> #define NOKPROBE_SYMBOL(fname) __NOKPROBE_SYMBOL(fname) >> #else >> #define NOKPROBE_SYMBOL(fname) >> diff --git a/include/linux/types.h b/include/linux/types.h >> index 4d118ba..78e2d7d 100644 >> --- a/include/linux/types.h >> +++ b/include/linux/types.h >> @@ -212,5 +212,9 @@ struct callback_head { >> }; >> #define rcu_head callback_head >> >> +#ifndef constant_function_entry >> +#define constant_function_entry(fn) ((unsigned long)(fn)) >> +#endif >> + >> #endif /* __ASSEMBLY__ */ >> #endif /* _LINUX_TYPES_H */ >> >> >> > > -- Masami HIRAMATSU Software Platform Research Dept. Linux Technology Research Center Hitachi, Ltd., Yokohama Research Laboratory E-mail: masami.hiram
Re: [RFT PATCH -next ] [BUGFIX] kprobes: Fix "Failed to find blacklist" error on ia64 and ppc64
(2014/05/08 15:16), Ananth N Mavinakayanahalli wrote: > On Thu, May 08, 2014 at 02:40:00PM +0900, Masami Hiramatsu wrote: >> (2014/05/08 13:47), Ananth N Mavinakayanahalli wrote: >>> On Wed, May 07, 2014 at 08:55:51PM +0900, Masami Hiramatsu wrote: >>> >>> ... >>> +#if defined(CONFIG_PPC64) && (!defined(_CALL_ELF) || _CALL_ELF == 1) +/* + * On PPC64 ABIv1 the function pointer actually points to the + * function's descriptor. The first entry in the descriptor is the + * address of the function text. + */ +#define constant_function_entry(fn) (((func_descr_t *)(fn))->entry) +#else +#define constant_function_entry(fn) ((unsigned long)(fn)) +#endif + #endif /* __ASSEMBLY__ */ >>> >>> Hi Masami, >>> >>> You could just use ppc_function_entry() instead. >> >> No, I think ppc_function_entry() has two problems (on the latest -next >> kernel) >> >> At first, that is an inlined functions which is not applied in build time. >> Since the NOKPROBE_SYMBOL() is used outside of any functions as like as >> EXPORT_SYMBOL(), we can only use preprocessed macros. >> Next, on PPC64 ABI*v2*, ppc_function_entry() returns local function entry, >> which seems global function entry + 2 insns. I'm not sure about >> implementation >> of the kallsyms on PPC64 ABIv2, but I guess we need global function entry >> for kallsyms. > > ABIv2 does away with function descriptors and Anton fixed up that > routine to handle the change (the +2 is an artefact of that). Hmm, do you mean that the address +2 is the actual entry point? I'd like to know which address is same as the address shown in /proc/kallsyms. >> BTW, could you test this patch on the latest -next tree on PPC64 if possible? > > I'll test it, but it may take a bit. Thanks for your help! > > Ananth > > -- Masami HIRAMATSU Software Platform Research Dept. Linux Technology Research Center Hitachi, Ltd., Yokohama Research Laboratory E-mail: masami.hiramatsu...@hitachi.com -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
Re: [RFT PATCH -next ] [BUGFIX] kprobes: Fix "Failed to find blacklist" error on ia64 and ppc64
On Thu, May 08, 2014 at 02:40:00PM +0900, Masami Hiramatsu wrote: > (2014/05/08 13:47), Ananth N Mavinakayanahalli wrote: > > On Wed, May 07, 2014 at 08:55:51PM +0900, Masami Hiramatsu wrote: > > > > ... > > > >> +#if defined(CONFIG_PPC64) && (!defined(_CALL_ELF) || _CALL_ELF == 1) > >> +/* > >> + * On PPC64 ABIv1 the function pointer actually points to the > >> + * function's descriptor. The first entry in the descriptor is the > >> + * address of the function text. > >> + */ > >> +#define constant_function_entry(fn) (((func_descr_t *)(fn))->entry) > >> +#else > >> +#define constant_function_entry(fn) ((unsigned long)(fn)) > >> +#endif > >> + > >> #endif /* __ASSEMBLY__ */ > > > > Hi Masami, > > > > You could just use ppc_function_entry() instead. > > No, I think ppc_function_entry() has two problems (on the latest -next kernel) > > At first, that is an inlined functions which is not applied in build time. > Since the NOKPROBE_SYMBOL() is used outside of any functions as like as > EXPORT_SYMBOL(), we can only use preprocessed macros. > Next, on PPC64 ABI*v2*, ppc_function_entry() returns local function entry, > which seems global function entry + 2 insns. I'm not sure about implementation > of the kallsyms on PPC64 ABIv2, but I guess we need global function entry > for kallsyms. ABIv2 does away with function descriptors and Anton fixed up that routine to handle the change (the +2 is an artefact of that). > BTW, could you test this patch on the latest -next tree on PPC64 if possible? I'll test it, but it may take a bit. Ananth -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
Re: [RFT PATCH -next ] [BUGFIX] kprobes: Fix "Failed to find blacklist" error on ia64 and ppc64
(2014/05/08 13:47), Ananth N Mavinakayanahalli wrote: > On Wed, May 07, 2014 at 08:55:51PM +0900, Masami Hiramatsu wrote: > > ... > >> +#if defined(CONFIG_PPC64) && (!defined(_CALL_ELF) || _CALL_ELF == 1) >> +/* >> + * On PPC64 ABIv1 the function pointer actually points to the >> + * function's descriptor. The first entry in the descriptor is the >> + * address of the function text. >> + */ >> +#define constant_function_entry(fn) (((func_descr_t *)(fn))->entry) >> +#else >> +#define constant_function_entry(fn) ((unsigned long)(fn)) >> +#endif >> + >> #endif /* __ASSEMBLY__ */ > > Hi Masami, > > You could just use ppc_function_entry() instead. No, I think ppc_function_entry() has two problems (on the latest -next kernel) At first, that is an inlined functions which is not applied in build time. Since the NOKPROBE_SYMBOL() is used outside of any functions as like as EXPORT_SYMBOL(), we can only use preprocessed macros. Next, on PPC64 ABI*v2*, ppc_function_entry() returns local function entry, which seems global function entry + 2 insns. I'm not sure about implementation of the kallsyms on PPC64 ABIv2, but I guess we need global function entry for kallsyms. BTW, could you test this patch on the latest -next tree on PPC64 if possible? Thank you, -- Masami HIRAMATSU Software Platform Research Dept. Linux Technology Research Center Hitachi, Ltd., Yokohama Research Laboratory E-mail: masami.hiramatsu...@hitachi.com -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
Re: [RFT PATCH -next ] [BUGFIX] kprobes: Fix "Failed to find blacklist" error on ia64 and ppc64
On Wed, May 07, 2014 at 08:55:51PM +0900, Masami Hiramatsu wrote: ... > +#if defined(CONFIG_PPC64) && (!defined(_CALL_ELF) || _CALL_ELF == 1) > +/* > + * On PPC64 ABIv1 the function pointer actually points to the > + * function's descriptor. The first entry in the descriptor is the > + * address of the function text. > + */ > +#define constant_function_entry(fn) (((func_descr_t *)(fn))->entry) > +#else > +#define constant_function_entry(fn) ((unsigned long)(fn)) > +#endif > + > #endif /* __ASSEMBLY__ */ Hi Masami, You could just use ppc_function_entry() instead. Ananth -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
Re: [RFT PATCH -next ] [BUGFIX] kprobes: Fix "Failed to find blacklist" error on ia64 and ppc64
Hi Tony, Benjamin and Paul, I've tried to fix this bug, but since I don't have either ppc64 nor ia64, this patch is not tested on those archs. Please review and test it on those machines. Thank you, (2014/05/07 20:55), Masami Hiramatsu wrote: > On ia64 and ppc64, the function pointer does not point the > entry address of the function, but the address of function > discriptor (which contains the entry address and misc > data.) Since the kprobes passes the function pointer stored > by NOKPROBE_SYMBOL() to kallsyms_lookup_size_offset() for > initalizing its blacklist, it fails and reports many errors > as below. > > Failed to find blacklist 000101316830 > Failed to find blacklist 0001013000f0a000 > Failed to find blacklist 000101315f70a000 > Failed to find blacklist 000101324c80a000 > Failed to find blacklist 0001013063f0a000 > Failed to find blacklist 000101327800a000 > Failed to find blacklist 0001013277f0a000 > Failed to find blacklist 000101315a70a000 > Failed to find blacklist 0001013277e0a000 > Failed to find blacklist 000101305a20a000 > Failed to find blacklist 0001013277d0a000 > Failed to find blacklist 00010130bdc0a000 > Failed to find blacklist 00010130dc20a000 > Failed to find blacklist 000101309a00a000 > Failed to find blacklist 0001013277c0a000 > Failed to find blacklist 0001013277b0a000 > Failed to find blacklist 0001013277a0a000 > Failed to find blacklist 000101327790a000 > Failed to find blacklist 000101303140a000 > Failed to find blacklist 0001013a3280a000 > > To fix this bug, this introduces function_entry() macro to > retrieve the entry address from the given function pointer, > and uses it in NOKPROBE_SYMBOL(). > > > Signed-off-by: Masami Hiramatsu > Reported-by: Tony Luck > Cc: Tony Luck > Cc: Fenghua Yu > Cc: Benjamin Herrenschmidt > Cc: Paul Mackerras > Cc: Ananth N Mavinakayanahalli > Cc: Kevin Hao > Cc: linux-i...@vger.kernel.org > Cc: linux-kernel@vger.kernel.org > Cc: linuxppc-...@lists.ozlabs.org > --- > arch/ia64/include/asm/types.h|2 ++ > arch/powerpc/include/asm/types.h | 11 +++ > include/linux/kprobes.h |3 ++- > include/linux/types.h|4 > 4 files changed, 19 insertions(+), 1 deletion(-) > > diff --git a/arch/ia64/include/asm/types.h b/arch/ia64/include/asm/types.h > index 4c351b1..6ab7b6c 100644 > --- a/arch/ia64/include/asm/types.h > +++ b/arch/ia64/include/asm/types.h > @@ -27,5 +27,7 @@ struct fnptr { > unsigned long gp; > }; > > +#define constant_function_entry(fn) (((struct fnptr *)(fn))->ip) > + > #endif /* !__ASSEMBLY__ */ > #endif /* _ASM_IA64_TYPES_H */ > diff --git a/arch/powerpc/include/asm/types.h > b/arch/powerpc/include/asm/types.h > index bfb6ded..fd297b8 100644 > --- a/arch/powerpc/include/asm/types.h > +++ b/arch/powerpc/include/asm/types.h > @@ -25,6 +25,17 @@ typedef struct { > unsigned long env; > } func_descr_t; > > +#if defined(CONFIG_PPC64) && (!defined(_CALL_ELF) || _CALL_ELF == 1) > +/* > + * On PPC64 ABIv1 the function pointer actually points to the > + * function's descriptor. The first entry in the descriptor is the > + * address of the function text. > + */ > +#define constant_function_entry(fn) (((func_descr_t *)(fn))->entry) > +#else > +#define constant_function_entry(fn) ((unsigned long)(fn)) > +#endif > + > #endif /* __ASSEMBLY__ */ > > #endif /* _ASM_POWERPC_TYPES_H */ > diff --git a/include/linux/kprobes.h b/include/linux/kprobes.h > index e059507..637eafe 100644 > --- a/include/linux/kprobes.h > +++ b/include/linux/kprobes.h > @@ -40,6 +40,7 @@ > #include > #include > #include > +#include > > #ifdef CONFIG_KPROBES > #include > @@ -485,7 +486,7 @@ static inline int enable_jprobe(struct jprobe *jp) > #define __NOKPROBE_SYMBOL(fname) \ > static unsigned long __used \ > __attribute__((section("_kprobe_blacklist"))) \ > - _kbl_addr_##fname = (unsigned long)fname; > + _kbl_addr_##fname = constant_function_entry(fname); > #define NOKPROBE_SYMBOL(fname) __NOKPROBE_SYMBOL(fname) > #else > #define NOKPROBE_SYMBOL(fname) > diff --git a/include/linux/types.h b/include/linux/types.h > index 4d118ba..78e2d7d 100644 > --- a/include/linux/types.h > +++ b/include/linux/types.h > @@ -212,5 +212,9 @@ struct callback_head { > }; > #define rcu_head callback_head > > +#ifndef constant_function_entry > +#define constant_function_entry(fn) ((unsigned long)(fn)) > +#endif > + > #endif /* __ASSEMBLY__ */ > #endif /* _LINUX_TYPES_H */ > > > -- Masami HIRAMATSU Software Platform Research Dept. Linux Technology Research Center Hitachi, Ltd., Yokohama Research Laboratory E-mail: masami.hiramatsu...@hitachi.com -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://
[RFT PATCH -next ] [BUGFIX] kprobes: Fix "Failed to find blacklist" error on ia64 and ppc64
On ia64 and ppc64, the function pointer does not point the entry address of the function, but the address of function discriptor (which contains the entry address and misc data.) Since the kprobes passes the function pointer stored by NOKPROBE_SYMBOL() to kallsyms_lookup_size_offset() for initalizing its blacklist, it fails and reports many errors as below. Failed to find blacklist 000101316830 Failed to find blacklist 0001013000f0a000 Failed to find blacklist 000101315f70a000 Failed to find blacklist 000101324c80a000 Failed to find blacklist 0001013063f0a000 Failed to find blacklist 000101327800a000 Failed to find blacklist 0001013277f0a000 Failed to find blacklist 000101315a70a000 Failed to find blacklist 0001013277e0a000 Failed to find blacklist 000101305a20a000 Failed to find blacklist 0001013277d0a000 Failed to find blacklist 00010130bdc0a000 Failed to find blacklist 00010130dc20a000 Failed to find blacklist 000101309a00a000 Failed to find blacklist 0001013277c0a000 Failed to find blacklist 0001013277b0a000 Failed to find blacklist 0001013277a0a000 Failed to find blacklist 000101327790a000 Failed to find blacklist 000101303140a000 Failed to find blacklist 0001013a3280a000 To fix this bug, this introduces function_entry() macro to retrieve the entry address from the given function pointer, and uses it in NOKPROBE_SYMBOL(). Signed-off-by: Masami Hiramatsu Reported-by: Tony Luck Cc: Tony Luck Cc: Fenghua Yu Cc: Benjamin Herrenschmidt Cc: Paul Mackerras Cc: Ananth N Mavinakayanahalli Cc: Kevin Hao Cc: linux-i...@vger.kernel.org Cc: linux-kernel@vger.kernel.org Cc: linuxppc-...@lists.ozlabs.org --- arch/ia64/include/asm/types.h|2 ++ arch/powerpc/include/asm/types.h | 11 +++ include/linux/kprobes.h |3 ++- include/linux/types.h|4 4 files changed, 19 insertions(+), 1 deletion(-) diff --git a/arch/ia64/include/asm/types.h b/arch/ia64/include/asm/types.h index 4c351b1..6ab7b6c 100644 --- a/arch/ia64/include/asm/types.h +++ b/arch/ia64/include/asm/types.h @@ -27,5 +27,7 @@ struct fnptr { unsigned long gp; }; +#define constant_function_entry(fn) (((struct fnptr *)(fn))->ip) + #endif /* !__ASSEMBLY__ */ #endif /* _ASM_IA64_TYPES_H */ diff --git a/arch/powerpc/include/asm/types.h b/arch/powerpc/include/asm/types.h index bfb6ded..fd297b8 100644 --- a/arch/powerpc/include/asm/types.h +++ b/arch/powerpc/include/asm/types.h @@ -25,6 +25,17 @@ typedef struct { unsigned long env; } func_descr_t; +#if defined(CONFIG_PPC64) && (!defined(_CALL_ELF) || _CALL_ELF == 1) +/* + * On PPC64 ABIv1 the function pointer actually points to the + * function's descriptor. The first entry in the descriptor is the + * address of the function text. + */ +#define constant_function_entry(fn)(((func_descr_t *)(fn))->entry) +#else +#define constant_function_entry(fn)((unsigned long)(fn)) +#endif + #endif /* __ASSEMBLY__ */ #endif /* _ASM_POWERPC_TYPES_H */ diff --git a/include/linux/kprobes.h b/include/linux/kprobes.h index e059507..637eafe 100644 --- a/include/linux/kprobes.h +++ b/include/linux/kprobes.h @@ -40,6 +40,7 @@ #include #include #include +#include #ifdef CONFIG_KPROBES #include @@ -485,7 +486,7 @@ static inline int enable_jprobe(struct jprobe *jp) #define __NOKPROBE_SYMBOL(fname) \ static unsigned long __used\ __attribute__((section("_kprobe_blacklist"))) \ - _kbl_addr_##fname = (unsigned long)fname; + _kbl_addr_##fname = constant_function_entry(fname); #define NOKPROBE_SYMBOL(fname) __NOKPROBE_SYMBOL(fname) #else #define NOKPROBE_SYMBOL(fname) diff --git a/include/linux/types.h b/include/linux/types.h index 4d118ba..78e2d7d 100644 --- a/include/linux/types.h +++ b/include/linux/types.h @@ -212,5 +212,9 @@ struct callback_head { }; #define rcu_head callback_head +#ifndef constant_function_entry +#define constant_function_entry(fn)((unsigned long)(fn)) +#endif + #endif /* __ASSEMBLY__ */ #endif /* _LINUX_TYPES_H */ -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/