diff options
Diffstat (limited to 'kernel/kprobes.c')
-rw-r--r-- | kernel/kprobes.c | 61 |
1 files changed, 53 insertions, 8 deletions
diff --git a/kernel/kprobes.c b/kernel/kprobes.c index a21b4e67fd97..3214289df5a7 100644 --- a/kernel/kprobes.c +++ b/kernel/kprobes.c | |||
@@ -2249,6 +2249,46 @@ static const struct file_operations debugfs_kprobes_operations = { | |||
2249 | .release = seq_release, | 2249 | .release = seq_release, |
2250 | }; | 2250 | }; |
2251 | 2251 | ||
2252 | /* kprobes/blacklist -- shows which functions can not be probed */ | ||
2253 | static void *kprobe_blacklist_seq_start(struct seq_file *m, loff_t *pos) | ||
2254 | { | ||
2255 | return seq_list_start(&kprobe_blacklist, *pos); | ||
2256 | } | ||
2257 | |||
2258 | static void *kprobe_blacklist_seq_next(struct seq_file *m, void *v, loff_t *pos) | ||
2259 | { | ||
2260 | return seq_list_next(v, &kprobe_blacklist, pos); | ||
2261 | } | ||
2262 | |||
2263 | static int kprobe_blacklist_seq_show(struct seq_file *m, void *v) | ||
2264 | { | ||
2265 | struct kprobe_blacklist_entry *ent = | ||
2266 | list_entry(v, struct kprobe_blacklist_entry, list); | ||
2267 | |||
2268 | seq_printf(m, "0x%p-0x%p\t%ps\n", (void *)ent->start_addr, | ||
2269 | (void *)ent->end_addr, (void *)ent->start_addr); | ||
2270 | return 0; | ||
2271 | } | ||
2272 | |||
2273 | static const struct seq_operations kprobe_blacklist_seq_ops = { | ||
2274 | .start = kprobe_blacklist_seq_start, | ||
2275 | .next = kprobe_blacklist_seq_next, | ||
2276 | .stop = kprobe_seq_stop, /* Reuse void function */ | ||
2277 | .show = kprobe_blacklist_seq_show, | ||
2278 | }; | ||
2279 | |||
2280 | static int kprobe_blacklist_open(struct inode *inode, struct file *filp) | ||
2281 | { | ||
2282 | return seq_open(filp, &kprobe_blacklist_seq_ops); | ||
2283 | } | ||
2284 | |||
2285 | static const struct file_operations debugfs_kprobe_blacklist_ops = { | ||
2286 | .open = kprobe_blacklist_open, | ||
2287 | .read = seq_read, | ||
2288 | .llseek = seq_lseek, | ||
2289 | .release = seq_release, | ||
2290 | }; | ||
2291 | |||
2252 | static void arm_all_kprobes(void) | 2292 | static void arm_all_kprobes(void) |
2253 | { | 2293 | { |
2254 | struct hlist_head *head; | 2294 | struct hlist_head *head; |
@@ -2372,19 +2412,24 @@ static int __init debugfs_kprobe_init(void) | |||
2372 | 2412 | ||
2373 | file = debugfs_create_file("list", 0444, dir, NULL, | 2413 | file = debugfs_create_file("list", 0444, dir, NULL, |
2374 | &debugfs_kprobes_operations); | 2414 | &debugfs_kprobes_operations); |
2375 | if (!file) { | 2415 | if (!file) |
2376 | debugfs_remove(dir); | 2416 | goto error; |
2377 | return -ENOMEM; | ||
2378 | } | ||
2379 | 2417 | ||
2380 | file = debugfs_create_file("enabled", 0600, dir, | 2418 | file = debugfs_create_file("enabled", 0600, dir, |
2381 | &value, &fops_kp); | 2419 | &value, &fops_kp); |
2382 | if (!file) { | 2420 | if (!file) |
2383 | debugfs_remove(dir); | 2421 | goto error; |
2384 | return -ENOMEM; | 2422 | |
2385 | } | 2423 | file = debugfs_create_file("blacklist", 0444, dir, NULL, |
2424 | &debugfs_kprobe_blacklist_ops); | ||
2425 | if (!file) | ||
2426 | goto error; | ||
2386 | 2427 | ||
2387 | return 0; | 2428 | return 0; |
2429 | |||
2430 | error: | ||
2431 | debugfs_remove(dir); | ||
2432 | return -ENOMEM; | ||
2388 | } | 2433 | } |
2389 | 2434 | ||
2390 | late_initcall(debugfs_kprobe_init); | 2435 | late_initcall(debugfs_kprobe_init); |