Skip to content

Commit

Permalink
kprobes: Fix "Failed to find blacklist" probing errors on ia64 and ppc64
Browse files Browse the repository at this point in the history
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 <[email protected]>
Fixed-by: Suzuki K. Poulose <[email protected]>
Tested-by: Tony Luck <[email protected]>
Tested-by: Michael Ellerman <[email protected]>
Signed-off-by: Masami Hiramatsu <[email protected]>
Acked-by: Michael Ellerman <[email protected]> (for powerpc)
Acked-by: Benjamin Herrenschmidt <[email protected]>
Cc: Jeremy Fitzhardinge <[email protected]>
Cc: [email protected]
Cc: Paul Mackerras <[email protected]>
Cc: [email protected]
Cc: [email protected]
Cc: Fenghua Yu <[email protected]>
Cc: Arnd Bergmann <[email protected]>
Cc: Rusty Russell <[email protected]>
Cc: Chris Wright <[email protected]>
Cc: [email protected]
Cc: Kevin Hao <[email protected]>
Cc: Ananth N Mavinakayanahalli <[email protected]>
Cc: [email protected]
Cc: [email protected]
Cc: Linus Torvalds <[email protected]>
Cc: David S. Miller <[email protected]>
Cc: [email protected]
Cc: [email protected]
Link: http://lkml.kernel.org/r/[email protected]
Signed-off-by: Ingo Molnar <[email protected]>
  • Loading branch information
mhiramathitachi authored and Ingo Molnar committed Jul 18, 2014
1 parent 0cdd192 commit d81b425
Showing 1 changed file with 9 additions and 5 deletions.
14 changes: 9 additions & 5 deletions kernel/kprobes.c
Original file line number Diff line number Diff line change
Expand Up @@ -2037,19 +2037,23 @@ static int __init populate_kprobe_blacklist(unsigned long *start,
{
unsigned long *iter;
struct kprobe_blacklist_entry *ent;
unsigned long offset = 0, size = 0;
unsigned long entry, offset = 0, size = 0;

for (iter = start; iter < end; iter++) {
if (!kallsyms_lookup_size_offset(*iter, &size, &offset)) {
pr_err("Failed to find blacklist %p\n", (void *)*iter);
entry = arch_deref_entry_point((void *)*iter);

if (!kernel_text_address(entry) ||
!kallsyms_lookup_size_offset(entry, &size, &offset)) {
pr_err("Failed to find blacklist at %p\n",
(void *)entry);
continue;
}

ent = kmalloc(sizeof(*ent), GFP_KERNEL);
if (!ent)
return -ENOMEM;
ent->start_addr = *iter;
ent->end_addr = *iter + size;
ent->start_addr = entry;
ent->end_addr = entry + size;
INIT_LIST_HEAD(&ent->list);
list_add_tail(&ent->list, &kprobe_blacklist);
}
Expand Down

0 comments on commit d81b425

Please sign in to comment.