diff options
| author | Masami Hiramatsu <masami.hiramatsu.pt@hitachi.com> | 2014-04-17 04:18:49 -0400 |
|---|---|---|
| committer | Ingo Molnar <mingo@kernel.org> | 2014-04-24 04:26:41 -0400 |
| commit | 637247403abff8c963bc7be8002b3f49ea604563 (patch) | |
| tree | ed89c4757f70cb2bb8c5cdf8317ae2dae4b1a897 /kernel | |
| parent | edafe3a56dbd42c499245b222e9f7e80099356e5 (diff) | |
kprobes: Show blacklist entries via debugfs
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>
Diffstat (limited to 'kernel')
| -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); |
