Skip to content

Commit

Permalink
kprobes: Show blacklist entries via debugfs
Browse files Browse the repository at this point in the history
Show blacklist entries (function names with the address
range) via /sys/kernel/debug/kprobes/blacklist.

Note that at this point the blacklist supports only
in vmlinux, not module. So the list is fixed and
not updated.

Signed-off-by: Masami Hiramatsu <masami.hiramatsu.pt@hitachi.com>
Cc: Ananth N Mavinakayanahalli <ananth@in.ibm.com>
Cc: Anil S Keshavamurthy <anil.s.keshavamurthy@intel.com>
Cc: David S. Miller <davem@davemloft.net>
Link: http://lkml.kernel.org/r/20140417081849.26341.11609.stgit@ltc230.yrl.intra.hitachi.co.jp
Signed-off-by: Ingo Molnar <mingo@kernel.org>
  • Loading branch information
mhiramathitachi authored and Ingo Molnar committed Apr 24, 2014
1 parent edafe3a commit 6372474
Showing 1 changed file with 53 additions and 8 deletions.
61 changes: 53 additions & 8 deletions kernel/kprobes.c
Original file line number Diff line number Diff line change
Expand Up @@ -2249,6 +2249,46 @@ static const struct file_operations debugfs_kprobes_operations = {
.release = seq_release,
};

/* kprobes/blacklist -- shows which functions can not be probed */
static void *kprobe_blacklist_seq_start(struct seq_file *m, loff_t *pos)
{
return seq_list_start(&kprobe_blacklist, *pos);
}

static void *kprobe_blacklist_seq_next(struct seq_file *m, void *v, loff_t *pos)
{
return seq_list_next(v, &kprobe_blacklist, pos);
}

static int kprobe_blacklist_seq_show(struct seq_file *m, void *v)
{
struct kprobe_blacklist_entry *ent =
list_entry(v, struct kprobe_blacklist_entry, list);

seq_printf(m, "0x%p-0x%p\t%ps\n", (void *)ent->start_addr,
(void *)ent->end_addr, (void *)ent->start_addr);
return 0;
}

static const struct seq_operations kprobe_blacklist_seq_ops = {
.start = kprobe_blacklist_seq_start,
.next = kprobe_blacklist_seq_next,
.stop = kprobe_seq_stop, /* Reuse void function */
.show = kprobe_blacklist_seq_show,
};

static int kprobe_blacklist_open(struct inode *inode, struct file *filp)
{
return seq_open(filp, &kprobe_blacklist_seq_ops);
}

static const struct file_operations debugfs_kprobe_blacklist_ops = {
.open = kprobe_blacklist_open,
.read = seq_read,
.llseek = seq_lseek,
.release = seq_release,
};

static void arm_all_kprobes(void)
{
struct hlist_head *head;
Expand Down Expand Up @@ -2372,19 +2412,24 @@ static int __init debugfs_kprobe_init(void)

file = debugfs_create_file("list", 0444, dir, NULL,
&debugfs_kprobes_operations);
if (!file) {
debugfs_remove(dir);
return -ENOMEM;
}
if (!file)
goto error;

file = debugfs_create_file("enabled", 0600, dir,
&value, &fops_kp);
if (!file) {
debugfs_remove(dir);
return -ENOMEM;
}
if (!file)
goto error;

file = debugfs_create_file("blacklist", 0444, dir, NULL,
&debugfs_kprobe_blacklist_ops);
if (!file)
goto error;

return 0;

error:
debugfs_remove(dir);
return -ENOMEM;
}

late_initcall(debugfs_kprobe_init);
Expand Down

0 comments on commit 6372474

Please sign in to comment.