diff options
author | jistone <jistone> | 2006-05-27 00:32:46 +0000 |
---|---|---|
committer | jistone <jistone> | 2006-05-27 00:32:46 +0000 |
commit | 0daad364983649e636e599e19004ba15641052c0 (patch) | |
tree | aaa5f80b7dbd28c600d514a9cb274eff3a4e0a6d /tapsets.cxx | |
parent | 66487a5bcf976363573ec2c5dd1dda66c353a1ae (diff) | |
download | systemtap-steved-0daad364983649e636e599e19004ba15641052c0.tar.gz systemtap-steved-0daad364983649e636e599e19004ba15641052c0.tar.xz systemtap-steved-0daad364983649e636e599e19004ba15641052c0.zip |
2006-05-26 Josh Stone <joshua.i.stone@intel.com>
* tapsets.cxx (build_blacklist): build the sets of blacklisted
functions and function returns. Manually added many __kprobes
functions that should not be probed.
(dwarf_query::dwarf_query): Call build_blacklist.
(dwarf_query::blacklisted_p): Use blacklist sets.
Diffstat (limited to 'tapsets.cxx')
-rw-r--r-- | tapsets.cxx | 63 |
1 files changed, 56 insertions, 7 deletions
diff --git a/tapsets.cxx b/tapsets.cxx index 3ca145eb..e87683f4 100644 --- a/tapsets.cxx +++ b/tapsets.cxx @@ -1623,6 +1623,10 @@ dwarf_query Dwarf_Die *scope_die, Dwarf_Addr addr); + set<string> blacklisted_probes; + set<string> blacklisted_return_probes; + void build_blacklist(); + bool blacklisted_p(string const & funcname, char const * filename, int line, @@ -1785,6 +1789,55 @@ dwarf_query::dwarf_query(systemtap_session & sess, spec_type = parse_function_spec(inline_str_val); else if (has_statement_str) spec_type = parse_function_spec(statement_str_val); + + build_blacklist(); +} + + +void +dwarf_query::build_blacklist() +{ + // FIXME: it would be nice if these blacklisted functions were pulled in + // dynamically, instead of being statically defined here. + + // Most of these are marked __kprobes in newer kernels. We list them here so + // the translator can block them on older kernels that don't have the + // __kprobes function decorator. + blacklisted_probes.insert("default_do_nmi"); + blacklisted_probes.insert("__die"); + blacklisted_probes.insert("die_nmi"); + blacklisted_probes.insert("do_debug"); + blacklisted_probes.insert("do_general_protection"); + blacklisted_probes.insert("do_int3"); + blacklisted_probes.insert("do_IRQ"); + blacklisted_probes.insert("do_page_fault"); + blacklisted_probes.insert("do_sparc64_fault"); + blacklisted_probes.insert("do_trap"); + blacklisted_probes.insert("dummy_nmi_callback"); + blacklisted_probes.insert("flush_icache_range"); + blacklisted_probes.insert("ia64_bad_break"); + blacklisted_probes.insert("ia64_do_page_fault"); + blacklisted_probes.insert("ia64_fault"); + blacklisted_probes.insert("io_check_error"); + blacklisted_probes.insert("mem_parity_error"); + blacklisted_probes.insert("nmi_watchdog_tick"); + blacklisted_probes.insert("notifier_call_chain"); + blacklisted_probes.insert("oops_begin"); + blacklisted_probes.insert("oops_end"); + blacklisted_probes.insert("program_check_exception"); + blacklisted_probes.insert("single_step_exception"); + blacklisted_probes.insert("sync_regs"); + blacklisted_probes.insert("unhandled_fault"); + blacklisted_probes.insert("unknown_nmi_error"); + + // __switch_to is only disallowed on x86_64 + if (sess.architecture == "x86_64") + blacklisted_probes.insert("__switch_to"); + + // These functions don't return, so return probes would never be recovered + blacklisted_return_probes.insert("do_exit"); + blacklisted_return_probes.insert("sys_exit"); + blacklisted_return_probes.insert("sys_exit_group"); } @@ -2002,14 +2055,10 @@ dwarf_query::blacklisted_p(string const & funcname, // the trick. if (filename == 0) filename = ""; // possibly 0 string filename_s = filename; // is passed as const char* - if (funcname == "do_IRQ" || - funcname == "notifier_call_chain" || - (funcname == "__switch_to" && sess.architecture == "x86_64") || + if (blacklisted_probes.count(funcname) > 0 || + (has_return && blacklisted_return_probes.count(funcname) > 0) || filename_s == "kernel/kprobes.c" || - 0 == fnmatch ("arch/*/kernel/kprobes.c", filename, 0) || - (has_return && (funcname == "do_exit" || - funcname == "sys_exit" || - funcname == "sys_exit_group"))) + 0 == fnmatch ("arch/*/kernel/kprobes.c", filename, 0)) { if (sess.verbose>1) clog << "skipping function '" << funcname << "' file '" |