diff options
author | fche <fche> | 2005-11-04 21:46:14 +0000 |
---|---|---|
committer | fche <fche> | 2005-11-04 21:46:14 +0000 |
commit | 1472a4e17771f9076a7aa83c8cd2f4a1364a9a94 (patch) | |
tree | cc1617c76917678f7e1c622cb9894e84f490a9d5 /tapsets.cxx | |
parent | f7ad9b0424f404afa659108980065c24aaa5e3e4 (diff) | |
download | systemtap-steved-1472a4e17771f9076a7aa83c8cd2f4a1364a9a94.tar.gz systemtap-steved-1472a4e17771f9076a7aa83c8cd2f4a1364a9a94.tar.xz systemtap-steved-1472a4e17771f9076a7aa83c8cd2f4a1364a9a94.zip |
2005-11-04 Frank Ch. Eigler <fche@redhat.com>
* tapsets.cxx (dwarf_derived_probe::emit_registrations): Add
possible kprobe address prechecking logic. Set kretprobes
maxactive to zero.
* translate.cxx (emit_module_init): Set a more helpful default
probe_point value for use in registration errors. Exit properly
after registration failure of probe #0.
Diffstat (limited to 'tapsets.cxx')
-rw-r--r-- | tapsets.cxx | 17 |
1 files changed, 14 insertions, 3 deletions
diff --git a/tapsets.cxx b/tapsets.cxx index 8345c797..0e4357e7 100644 --- a/tapsets.cxx +++ b/tapsets.cxx @@ -2601,14 +2601,25 @@ dwarf_derived_probe::emit_registrations (translator_output* o, o->indent(1); string probe_name = struct_kprobe_array_name(probenum) + "[i]"; +#if 0 + // XXX: triggers false negatives on RHEL4U2 kernel + // emit address verification code + o->newline() << "void *addr = " << probe_name; + if (has_return) + o->line() << ".kp.addr;"; + else + o->line() << ".addr;"; + o->newline() << "rc = ! virt_addr_valid (addr);"; +#endif + if (has_return) { o->newline() << "#ifdef ARCH_SUPPORTS_KRETPROBES"; o->newline() << probe_name << ".handler = &" << func_name << ";"; - o->newline() << probe_name << ".maxactive = 1;"; + o->newline() << probe_name << ".maxactive = 0;"; // request default // XXX: pending PR 1289 // o->newline() << probe_name << ".kp_fault_handler = &stap_kprobe_fault_handler;"; - o->newline() << "rc = register_kretprobe (&(" << probe_name << "));"; + o->newline() << "rc = rc || register_kretprobe (&(" << probe_name << "));"; o->newline() << "#else"; o->newline() << "rc = 1;"; o->newline() << "#endif"; @@ -2618,7 +2629,7 @@ dwarf_derived_probe::emit_registrations (translator_output* o, o->newline() << probe_name << ".pre_handler = &" << func_name << ";"; // XXX: pending PR 1289 // o->newline() << probe_name << ".kp_fault_handler = &stap_kprobe_fault_handler;"; - o->newline() << "rc = register_kprobe (&(" << probe_name << "));"; + o->newline() << "rc = rc || register_kprobe (&(" << probe_name << "));"; } o->newline() << "if (unlikely (rc)) {"; |