summaryrefslogtreecommitdiffstats
path: root/tapset-utrace.cxx
diff options
context:
space:
mode:
authorStan Cox <scox@redhat.com>2009-09-16 21:05:00 -0400
committerStan Cox <scox@redhat.com>2009-09-16 21:05:00 -0400
commit6846cfc8a5cdb24fccb19037b27a180d2300ee09 (patch)
tree9dbcddce5f4410d96b98ec5beb757e74c901e74c /tapset-utrace.cxx
parent9f7d5236c8fb1fd84636656416e1dad531e9586d (diff)
downloadsystemtap-steved-6846cfc8a5cdb24fccb19037b27a180d2300ee09.tar.gz
systemtap-steved-6846cfc8a5cdb24fccb19037b27a180d2300ee09.tar.xz
systemtap-steved-6846cfc8a5cdb24fccb19037b27a180d2300ee09.zip
* sdt.h (STAP_SEMAPHORE): New. Add guard to utrace probe points.
* itrace.h (__access_process_vm): Moved from here... * runtime/access_process_vm.h: New. ...to here. * translate.cxx (translate_pass): Include access_process_vm.h * session.h (sdt_semaphore_addr): New. * tapsets.cxx (sdt_query::record_semaphore): New. Record sdt_semaphore_addr. (uprobe_derived_probe_group::emit_module_decls): Allow for uprobe guard variable to be set and unset. (uprobe_derived_probe_group::emit_module_decls): Likewise. (uprobe_derived_probe_group::emit_module_exit): Likewise. * tapset-utrace.cxx (utrace_derived_probe_group::emit_probe_decl): Likewise. (utrace_derived_probe_group::emit_module_decls): Likewise. (utrace_derived_probe_group::emit_module_exit): Likewise.
Diffstat (limited to 'tapset-utrace.cxx')
-rw-r--r--tapset-utrace.cxx46
1 files changed, 46 insertions, 0 deletions
diff --git a/tapset-utrace.cxx b/tapset-utrace.cxx
index 22682776..639f0c20 100644
--- a/tapset-utrace.cxx
+++ b/tapset-utrace.cxx
@@ -716,6 +716,21 @@ utrace_derived_probe_group::emit_probe_decl (systemtap_session& s,
break;
}
s.op->line() << " .engine_attached=0,";
+ map<Dwarf_Addr, derived_probe*>::iterator its;
+ if (s.sdt_semaphore_addr.empty())
+ s.op->line() << " .sdt_sem_address=(unsigned long)0x0,";
+ else
+ for (its = s.sdt_semaphore_addr.begin();
+ its != s.sdt_semaphore_addr.end();
+ its++)
+ {
+ if (p == ((struct utrace_derived_probe*)(its->second)))
+ {
+ s.op->line() << " .sdt_sem_address=(unsigned long)0x" << hex << its->first << dec << "ULL,";
+ break;
+ }
+ }
+ s.op->line() << " .tsk=0,";
s.op->line() << " },";
}
@@ -750,6 +765,8 @@ utrace_derived_probe_group::emit_module_decls (systemtap_session& s)
s.op->newline() << "struct utrace_engine_ops ops;";
s.op->newline() << "unsigned long events;";
s.op->newline() << "int engine_attached;";
+ s.op->newline() << "struct task_struct *tsk;";
+ s.op->newline() << "unsigned long sdt_sem_address;";
s.op->newline(-1) << "};";
@@ -872,6 +889,15 @@ utrace_derived_probe_group::emit_module_decls (systemtap_session& s)
s.op->newline() << "break;";
s.op->indent(-1);
s.op->newline(-1) << "}";
+
+ s.op->newline() << "if (p->sdt_sem_address != 0) {";
+ s.op->newline(1) << "size_t sdt_semaphore;";
+ s.op->newline() << "p->tsk = tsk;";
+ s.op->newline() << "__access_process_vm (tsk, p->sdt_sem_address, &sdt_semaphore, sizeof (sdt_semaphore), 0);";
+ s.op->newline() << "sdt_semaphore += 1;";
+ s.op->newline() << "__access_process_vm (tsk, p->sdt_sem_address, &sdt_semaphore, sizeof (sdt_semaphore), 1);";
+ s.op->newline(-1) << "}";
+
s.op->newline(-1) << "}";
// Since this engine could be attached to multiple threads, don't
@@ -1017,6 +1043,26 @@ utrace_derived_probe_group::emit_module_exit (systemtap_session& s)
s.op->newline() << "stap_utrace_detach_ops(&p->ops);";
s.op->newline(-1) << "}";
s.op->newline(-1) << "}";
+
+ int sem_idx = 0;
+ if (! s.sdt_semaphore_addr.empty())
+ for (p_b_path_iterator it = probes_by_path.begin();
+ it != probes_by_path.end(); it++)
+ {
+ s.op->newline() << "{";
+ s.op->indent(1);
+ s.op->newline() << "size_t sdt_semaphore;";
+ s.op->newline() << "for (i=0; i<ARRAY_SIZE(stap_utrace_probes); i++) {";
+ s.op->newline(1) << "struct stap_utrace_probe *p = &stap_utrace_probes[i];";
+
+ s.op->newline() << "__access_process_vm (p->tsk, p->sdt_sem_address, &sdt_semaphore, sizeof (sdt_semaphore), 0);";
+ s.op->newline() << "sdt_semaphore -= 1;";
+ s.op->newline() << "__access_process_vm (p->tsk, p->sdt_sem_address, &sdt_semaphore, sizeof (sdt_semaphore), 1);";
+
+ s.op->newline(-1) << "}";
+ s.op->newline(-1) << "}";
+ sem_idx += it->second.size() - 1;
+ }
}