Skip to content

Commit d81b425

Browse files
mhiramathitachiIngo Molnar
authored andcommitted
kprobes: Fix "Failed to find blacklist" probing errors on ia64 and ppc64
On ia64 and ppc64, function pointers do not point to the entry address of the function, but to the address of a function descriptor (which contains the entry address and misc data). Since the kprobes code passes the function pointer stored by NOKPROBE_SYMBOL() to kallsyms_lookup_size_offset() for initalizing its blacklist, it fails and reports many errors, such as: Failed to find blacklist 0001013168300000 Failed to find blacklist 0001013000f0a000 [...] To fix this bug, use arch_deref_entry_point() to get the function entry address for kallsyms_lookup_size_offset() instead of the raw function pointer. Suzuki also pointed out that blacklist entries should also be updated as well. Reported-by: Tony Luck <tony.luck@gmail.com> Fixed-by: Suzuki K. Poulose <suzuki@in.ibm.com> Tested-by: Tony Luck <tony.luck@intel.com> Tested-by: Michael Ellerman <mpe@ellerman.id.au> Signed-off-by: Masami Hiramatsu <masami.hiramatsu.pt@hitachi.com> Acked-by: Michael Ellerman <mpe@ellerman.id.au> (for powerpc) Acked-by: Benjamin Herrenschmidt <benh@kernel.crashing.org> Cc: Jeremy Fitzhardinge <jeremy@goop.org> Cc: sparse@chrisli.org Cc: Paul Mackerras <paulus@samba.org> Cc: akataria@vmware.com Cc: anil.s.keshavamurthy@intel.com Cc: Fenghua Yu <fenghua.yu@intel.com> Cc: Arnd Bergmann <arnd@arndb.de> Cc: Rusty Russell <rusty@rustcorp.com.au> Cc: Chris Wright <chrisw@sous-sol.org> Cc: yrl.pp-manager.tt@hitachi.com Cc: Kevin Hao <haokexin@gmail.com> Cc: Ananth N Mavinakayanahalli <ananth@in.ibm.com> Cc: rdunlap@infradead.org Cc: dl9pf@gmx.de Cc: Linus Torvalds <torvalds@linux-foundation.org> Cc: David S. Miller <davem@davemloft.net> Cc: linux-ia64@vger.kernel.org Cc: linuxppc-dev@lists.ozlabs.org Link: http://lkml.kernel.org/r/20140717114411.13401.2632.stgit@kbuild-fedora.novalocal Signed-off-by: Ingo Molnar <mingo@kernel.org>
1 parent 0cdd192 commit d81b425

File tree

1 file changed

+9
-5
lines changed

1 file changed

+9
-5
lines changed

kernel/kprobes.c

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2037,19 +2037,23 @@ static int __init populate_kprobe_blacklist(unsigned long *start,
20372037
{
20382038
unsigned long *iter;
20392039
struct kprobe_blacklist_entry *ent;
2040-
unsigned long offset = 0, size = 0;
2040+
unsigned long entry, offset = 0, size = 0;
20412041

20422042
for (iter = start; iter < end; iter++) {
2043-
if (!kallsyms_lookup_size_offset(*iter, &size, &offset)) {
2044-
pr_err("Failed to find blacklist %p\n", (void *)*iter);
2043+
entry = arch_deref_entry_point((void *)*iter);
2044+
2045+
if (!kernel_text_address(entry) ||
2046+
!kallsyms_lookup_size_offset(entry, &size, &offset)) {
2047+
pr_err("Failed to find blacklist at %p\n",
2048+
(void *)entry);
20452049
continue;
20462050
}
20472051

20482052
ent = kmalloc(sizeof(*ent), GFP_KERNEL);
20492053
if (!ent)
20502054
return -ENOMEM;
2051-
ent->start_addr = *iter;
2052-
ent->end_addr = *iter + size;
2055+
ent->start_addr = entry;
2056+
ent->end_addr = entry + size;
20532057
INIT_LIST_HEAD(&ent->list);
20542058
list_add_tail(&ent->list, &kprobe_blacklist);
20552059
}

0 commit comments

Comments
 (0)