diff options
author | Stan Cox <scox@redhat.com> | 2009-09-16 21:05:00 -0400 |
---|---|---|
committer | Stan Cox <scox@redhat.com> | 2009-09-16 21:05:00 -0400 |
commit | 6846cfc8a5cdb24fccb19037b27a180d2300ee09 (patch) | |
tree | 9dbcddce5f4410d96b98ec5beb757e74c901e74c /tapset-utrace.cxx | |
parent | 9f7d5236c8fb1fd84636656416e1dad531e9586d (diff) | |
download | systemtap-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.cxx | 46 |
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; + } } |