diff options
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)) {"; |