|
@@ -2249,6 +2249,46 @@ static const struct file_operations debugfs_kprobes_operations = {
|
|
.release = seq_release,
|
|
.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)
|
|
static void arm_all_kprobes(void)
|
|
{
|
|
{
|
|
struct hlist_head *head;
|
|
struct hlist_head *head;
|
|
@@ -2372,19 +2412,24 @@ static int __init debugfs_kprobe_init(void)
|
|
|
|
|
|
file = debugfs_create_file("list", 0444, dir, NULL,
|
|
file = debugfs_create_file("list", 0444, dir, NULL,
|
|
&debugfs_kprobes_operations);
|
|
&debugfs_kprobes_operations);
|
|
- if (!file) {
|
|
|
|
- debugfs_remove(dir);
|
|
|
|
- return -ENOMEM;
|
|
|
|
- }
|
|
|
|
|
|
+ if (!file)
|
|
|
|
+ goto error;
|
|
|
|
|
|
file = debugfs_create_file("enabled", 0600, dir,
|
|
file = debugfs_create_file("enabled", 0600, dir,
|
|
&value, &fops_kp);
|
|
&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;
|
|
return 0;
|
|
|
|
+
|
|
|
|
+error:
|
|
|
|
+ debugfs_remove(dir);
|
|
|
|
+ return -ENOMEM;
|
|
}
|
|
}
|
|
|
|
|
|
late_initcall(debugfs_kprobe_init);
|
|
late_initcall(debugfs_kprobe_init);
|