diff --git a/.devtoolset-6-systemtap.metadata b/.devtoolset-6-systemtap.metadata new file mode 100644 index 0000000..5b324b7 --- /dev/null +++ b/.devtoolset-6-systemtap.metadata @@ -0,0 +1 @@ +5ef3a2d9945b0f6bae0061e33811e25e5138f5b7 SOURCES/systemtap-3.0.tar.gz diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..e7ffaca --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +SOURCES/systemtap-3.0.tar.gz diff --git a/README.md b/README.md deleted file mode 100644 index 98f42b4..0000000 --- a/README.md +++ /dev/null @@ -1,4 +0,0 @@ -The master branch has no content - -Look at the c7 branch if you are working with CentOS-7, or the c4/c5/c6 branch for CentOS-4, 5 or 6 -If you find this file in a distro specific branch, it means that no content has been checked in yet diff --git a/SOURCES/rhbz1242368.patch b/SOURCES/rhbz1242368.patch new file mode 100644 index 0000000..2ec1be8 --- /dev/null +++ b/SOURCES/rhbz1242368.patch @@ -0,0 +1,338 @@ +commit 03b9fdf4ce26b4e39a3e755fc717fe4e5ab773dd +Author: David Smith +Date: Thu Apr 28 10:20:47 2016 -0500 + + Fix PR19954 by avoiding "suspicious RCU usage" message. + + * runtime/transport/symbols.c (_stp_module_update_self): Properly handle + RCU locking when retrieving the 'kallsyms' member of the module + structure. + +diff --git a/runtime/transport/symbols.c b/runtime/transport/symbols.c +index cb7964f..98b0239 100644 +--- a/runtime/transport/symbols.c ++++ b/runtime/transport/symbols.c +@@ -249,7 +249,12 @@ static int _stp_module_update_self (void) + } + else if (!strcmp(".symtab", attr->name)) { + #ifdef STAPCONF_MOD_KALLSYMS +- struct mod_kallsyms *kallsyms = rcu_dereference_sched(mod->kallsyms); ++ struct mod_kallsyms *kallsyms; ++ ++ rcu_read_lock_sched(); ++ kallsyms = rcu_dereference_sched(mod->kallsyms); ++ rcu_read_unlock_sched(); ++ + if (attr->address == (unsigned long) kallsyms->symtab) + _stp_module_self.sections[0].size = + kallsyms->num_symtab * sizeof(kallsyms->symtab[0]); +commit c8db32343c9b8012fa348cf4f8f104617960f793 +Author: David Smith +Date: Thu Apr 28 10:59:50 2016 -0500 + + Improved fake utrace locking. + + * runtime/stp_utrace.c: Fixed potential locking issues by changing the + 'task_work_added' and 'report_work_added' members of 'struct + utrace' to be atomic variables. In the process, I also renamed + 'task_work_added' to 'resume_work_added'. As atomice variables, they can + be modified without locking the utrace struct. Also renamed the 'work' + member of 'struct utrace' to 'resume_work' (to match up with + 'resume_work_added'). + +diff --git a/runtime/stp_utrace.c b/runtime/stp_utrace.c +index a8afc0d..bb2d663 100644 +--- a/runtime/stp_utrace.c ++++ b/runtime/stp_utrace.c +@@ -66,17 +66,23 @@ struct utrace { + unsigned int vfork_stop:1; /* need utrace_stop() before vfork wait */ + unsigned int death:1; /* in utrace_report_death() now */ + unsigned int reap:1; /* release_task() has run */ +- unsigned int pending_attach:1; /* need splice_attaching() */ +- unsigned int task_work_added:1; /* called task_work_add() on 'work' */ +- unsigned int report_work_added:1; /* called task_work_add() +- * on 'report_work' */ ++ unsigned int pending_attach:1; /* need splice_attaching() */ ++ ++ /* We need the '*_work_added' variables to be atomic so they ++ * can be modified without locking the utrace struct. This is ++ * typically done in atomic context where we can't grab the ++ * lock. */ ++ atomic_t resume_work_added; /* called task_work_add() on ++ * 'resume_work' */ ++ atomic_t report_work_added; /* called task_work_add() on ++ * 'report_work' */ + + unsigned long utrace_flags; + + struct hlist_node hlist; /* task_utrace_table linkage */ + struct task_struct *task; + +- struct task_work work; ++ struct task_work resume_work; + struct task_work report_work; + }; + +@@ -349,17 +355,20 @@ static int utrace_exit(void) + static void + stp_task_notify_resume(struct task_struct *target, struct utrace *utrace) + { +- if (! utrace->task_work_added) { +- int rc = stp_task_work_add(target, &utrace->work); +- if (rc == 0) { +- utrace->task_work_added = 1; +- } +- /* stp_task_work_add() returns -ESRCH if the task has +- * already passed exit_task_work(). Just ignore this +- * error. */ +- else if (rc != -ESRCH) { +- printk(KERN_ERR "%s:%d - task_work_add() returned %d\n", +- __FUNCTION__, __LINE__, rc); ++ if (atomic_add_unless(&utrace->resume_work_added, 1, 1)) { ++ int rc = stp_task_work_add(target, &utrace->resume_work); ++ if (rc != 0) { ++ atomic_set(&utrace->report_work_added, 0); ++ ++ /* stp_task_work_add() returns -ESRCH if the ++ * task has already passed ++ * exit_task_work(). Just ignore this ++ * error. */ ++ if (rc != -ESRCH) { ++ printk(KERN_ERR ++ "%s:%d - task_work_add() returned %d\n", ++ __FUNCTION__, __LINE__, rc); ++ } + } + } + } +@@ -394,8 +403,9 @@ static void utrace_cleanup(struct utrace *utrace) + list_del(&engine->entry); + kmem_cache_free(utrace_engine_cachep, engine); + } ++ stp_spin_unlock(&utrace->lock); + +- if (utrace->task_work_added) { ++ if (atomic_add_unless(&utrace->resume_work_added, -1, 0)) { + #ifdef STP_TF_DEBUG + if (stp_task_work_cancel(utrace->task, &utrace_resume) == NULL) + printk(KERN_ERR "%s:%d - task_work_cancel() failed? task %p, %d, %s\n", +@@ -406,9 +416,8 @@ static void utrace_cleanup(struct utrace *utrace) + #else + stp_task_work_cancel(utrace->task, &utrace_resume); + #endif +- utrace->task_work_added = 0; + } +- if (utrace->report_work_added) { ++ if (atomic_add_unless(&utrace->report_work_added, -1, 0)) { + #ifdef STP_TF_DEBUG + if (stp_task_work_cancel(utrace->task, &utrace_report_work) == NULL) + printk(KERN_ERR "%s:%d - task_work_cancel() failed? task %p, %d, %s\n", +@@ -419,9 +428,7 @@ static void utrace_cleanup(struct utrace *utrace) + #else + stp_task_work_cancel(utrace->task, &utrace_report_work); + #endif +- utrace->report_work_added = 0; + } +- stp_spin_unlock(&utrace->lock); + + /* Free the struct utrace itself. */ + kmem_cache_free(utrace_cachep, utrace); +@@ -522,8 +529,10 @@ static bool utrace_task_alloc(struct task_struct *task) + INIT_LIST_HEAD(&utrace->attaching); + utrace->resume = UTRACE_RESUME; + utrace->task = task; +- stp_init_task_work(&utrace->work, &utrace_resume); ++ stp_init_task_work(&utrace->resume_work, &utrace_resume); + stp_init_task_work(&utrace->report_work, &utrace_report_work); ++ atomic_set(&utrace->resume_work_added, 0); ++ atomic_set(&utrace->report_work_added, 0); + + stp_spin_lock(&task_utrace_lock); + u = __task_utrace_struct(task); +@@ -558,8 +567,8 @@ static void utrace_free(struct utrace *utrace) + stp_spin_unlock(&task_utrace_lock); + + /* Free the utrace struct. */ +- stp_spin_lock(&utrace->lock); + #ifdef STP_TF_DEBUG ++ stp_spin_lock(&utrace->lock); + if (unlikely(utrace->reporting) + || unlikely(!list_empty(&utrace->attached)) + || unlikely(!list_empty(&utrace->attaching))) +@@ -567,27 +576,31 @@ static void utrace_free(struct utrace *utrace) + __FUNCTION__, __LINE__, utrace->reporting, + list_empty(&utrace->attached), + list_empty(&utrace->attaching)); ++ stp_spin_unlock(&utrace->lock); + #endif + +- if (utrace->task_work_added) { +- if (stp_task_work_cancel(utrace->task, &utrace_resume) == NULL) +- printk(KERN_ERR "%s:%d - task_work_cancel() failed? task %p, %d, %s\n", ++ if (atomic_add_unless(&utrace->resume_work_added, -1, 0)) { ++ if ((stp_task_work_cancel(utrace->task, &utrace_resume) ++ == NULL) ++ && (utrace->task->flags & ~PF_EXITING) ++ && (utrace->task->exit_state == 0)) ++ printk(KERN_ERR "%s:%d * task_work_cancel() failed? task %p, %d, %s, 0x%lx 0x%x\n", + __FUNCTION__, __LINE__, utrace->task, + utrace->task->tgid, + (utrace->task->comm ? utrace->task->comm +- : "UNKNOWN")); +- utrace->task_work_added = 0; +- } +- if (utrace->report_work_added) { +- if (stp_task_work_cancel(utrace->task, &utrace_report_work) == NULL) +- printk(KERN_ERR "%s:%d - task_work_cancel() failed? task %p, %d, %s\n", ++ : "UNKNOWN"), utrace->task->state, utrace->task->exit_state); ++ } ++ if (atomic_add_unless(&utrace->report_work_added, -1, 0)) { ++ if ((stp_task_work_cancel(utrace->task, &utrace_report_work) ++ == NULL) ++ && (utrace->task->flags & ~PF_EXITING) ++ && (utrace->task->exit_state == 0)) ++ printk(KERN_ERR "%s:%d ** task_work_cancel() failed? task %p, %d, %s, 0x%lx, 0x%x\n", + __FUNCTION__, __LINE__, utrace->task, + utrace->task->tgid, + (utrace->task->comm ? utrace->task->comm +- : "UNKNOWN")); +- utrace->report_work_added = 0; ++ : "UNKNOWN"), utrace->task->state, utrace->task->exit_state); + } +- stp_spin_unlock(&utrace->lock); + + kmem_cache_free(utrace_cachep, utrace); + } +@@ -2257,7 +2270,7 @@ static void utrace_report_death(void *cb_data __attribute__ ((unused)), + * of detach bookkeeping. + */ + if (in_atomic() || irqs_disabled()) { +- if (! utrace->report_work_added) { ++ if (atomic_add_unless(&utrace->report_work_added, 1, 1)) { + int rc; + #ifdef STP_TF_DEBUG + printk(KERN_ERR "%s:%d - adding task_work\n", +@@ -2265,17 +2278,17 @@ static void utrace_report_death(void *cb_data __attribute__ ((unused)), + #endif + rc = stp_task_work_add(task, + &utrace->report_work); +- if (rc == 0) { +- utrace->report_work_added = 1; +- } +- /* stp_task_work_add() returns -ESRCH if the +- * task has already passed +- * exit_task_work(). Just ignore this +- * error. */ +- else if (rc != -ESRCH) { +- printk(KERN_ERR +- "%s:%d - task_work_add() returned %d\n", +- __FUNCTION__, __LINE__, rc); ++ if (rc != 0) { ++ atomic_set(&utrace->report_work_added, 0); ++ /* stp_task_work_add() returns -ESRCH ++ * if the task has already passed ++ * exit_task_work(). Just ignore this ++ * error. */ ++ if (rc != -ESRCH) { ++ printk(KERN_ERR ++ "%s:%d - task_work_add() returned %d\n", ++ __FUNCTION__, __LINE__, rc); ++ } + } + } + } +@@ -2337,13 +2350,13 @@ static void utrace_resume(struct task_work *work) + * instantaneous (where 'task_utrace_struct()' has to do a + * hash lookup). + */ +- struct utrace *utrace = container_of(work, struct utrace, work); ++ struct utrace *utrace = container_of(work, struct utrace, resume_work); + struct task_struct *task = current; + INIT_REPORT(report); + struct utrace_engine *engine; + + might_sleep(); +- utrace->task_work_added = 0; ++ atomic_set(&utrace->resume_work_added, 0); + + /* Make sure the task isn't exiting. */ + if (task->flags & PF_EXITING) { +@@ -2436,8 +2449,8 @@ static void utrace_report_work(struct task_work *work) + __FUNCTION__, __LINE__, in_atomic(), irqs_disabled()); + #endif + might_sleep(); +- utrace->report_work_added = 0; + ++ atomic_set(&utrace->report_work_added, 0); + stp_spin_lock(&utrace->lock); + BUG_ON(utrace->death); + utrace->death = 1; +commit 0859b50e3ac4782e53c4c10b82c6e24174378bd4 +Author: Mateusz Guzik +Date: Mon May 2 12:28:55 2016 -0500 + + Plug preempt leak in _stp_runtime_entryfn_put/get_context. + + If _stp_runtime_entryfn_get_context returns a context, preemption + counter is always incremented. On the other hand + _stp_runtime_entryfn_put_context only decrements the counter if the + passed context matches the one currently set on the cpu. + + The context can be set to NULL by _stp_runtime_contexts_free, making the + comparison false and in effect leading to a leak, e.g.: + timer: _stp_ctl_work_callback+0x0/0x1e0[stap_af8544c7eb51251ef8c + 377abff659b05_25070] preempt leak: 00000101 -> 00000102 + +diff --git a/runtime/linux/runtime_context.h b/runtime/linux/runtime_context.h +index c9ffe18..9d325da 100644 +--- a/runtime/linux/runtime_context.h ++++ b/runtime/linux/runtime_context.h +@@ -80,11 +80,12 @@ static struct context * _stp_runtime_entryfn_get_context(void) + + static inline void _stp_runtime_entryfn_put_context(struct context *c) + { +- if (c && c == _stp_runtime_get_context()) { +- atomic_dec(&c->busy); ++ if (c) { ++ if (c == _stp_runtime_get_context()) ++ atomic_dec(&c->busy); ++ /* else, warn about bad state? */ + preempt_enable_no_resched(); + } +- /* else, warn about bad state? */ + return; + } + +commit 0beafcec9a2971d466419d430d13fdb2c4f50d94 +Author: David Smith +Date: Tue May 3 13:23:58 2016 -0500 + + Fix PR20040 by keeping the task_exe_file function from sleeping. + + * tapset/linux/task.stp: No longer call get_task_mm()/mmput(), so that the + function won't sleep and cause kernel bugs. + +diff --git a/tapset/linux/task.stp b/tapset/linux/task.stp +index 9b204f5..774cf58 100644 +--- a/tapset/linux/task.stp ++++ b/tapset/linux/task.stp +@@ -795,13 +795,14 @@ function task_exe_file:long(task:long) + STAP_ERROR ("invalid task struct pointer"); + } + ++ // We'd like to call get_task_mm()/mmput() here, but they can ++ // sleep. So, let's hope incrementing the task's usage (by ++ // calling get_task_struct) is enough to keep the mm around. + get_task_struct(task); +- mm = get_task_mm(task); +- put_task_struct(task); +- if (mm) { ++ mm = task->mm; ++ if (mm) + exe_file = stap_find_exe_file(mm); +- mmput(mm); +- } ++ put_task_struct(task); + + if (exe_file) { + STAP_RETURN((unsigned long)exe_file); diff --git a/SOURCES/rhbz1269062.patch b/SOURCES/rhbz1269062.patch new file mode 100644 index 0000000..40fc02a --- /dev/null +++ b/SOURCES/rhbz1269062.patch @@ -0,0 +1,22 @@ +commit a32189c495cf4dbb71fa497adcaa2ab31aad7021 +Author: Martin Cermak +Date: Wed Jun 29 19:03:11 2016 +0200 + + Avoid null pointer exception in the ioscheduler.elv_add_request probe. + + This update makes the ioscheduler.elv_add_request probe gracefully handle + situation where $q->elevator is NULL (RHBZ1269062). + +diff --git a/tapset/linux/ioscheduler.stp b/tapset/linux/ioscheduler.stp +index 00d75a5..121fde8 100644 +--- a/tapset/linux/ioscheduler.stp ++++ b/tapset/linux/ioscheduler.stp +@@ -149,7 +149,7 @@ probe ioscheduler.elv_add_request.tp = kernel.trace("block_rq_insert") ? + { + name = "elv_add_request" + q = $q +- elevator_name = kernel_string( ++ elevator_name = ($q->elevator == 0) ? "" : kernel_string( + @choose_defined($q->elevator->type->elevator_name, + @choose_defined($q->elevator->elevator_type->elevator_name, + $q->elevator->elevator_name)), "") diff --git a/SOURCES/rhbz1312169.patch b/SOURCES/rhbz1312169.patch new file mode 100644 index 0000000..e758265 --- /dev/null +++ b/SOURCES/rhbz1312169.patch @@ -0,0 +1,33 @@ +commit 63a758b4890e729195fde868e34d0015cda8b065 +Author: Frank Ch. Eigler +Date: Thu Aug 11 13:40:55 2016 -0400 + + RHBZ1312169: make stap-prep fall back to debuginfo-install + + On some fedora / rhel boxes and their repo selections, + "debuginfo-install" can sometimes fetch the right files + even if "yum install" cannot. + +diff --git a/stap-prep b/stap-prep +index 5c233bf..ca9adff 100755 +--- a/stap-prep ++++ b/stap-prep +@@ -26,13 +26,17 @@ KERN_ARCH=`uname -m` + KERN_REV=`echo $UNAME | sed s/.$KERN_ARCH//` # strip arch from uname + CANDIDATES="$KERNEL-$KERN_REV.$KERN_ARCH \ + $KERNEL-devel-$KERN_REV.$KERN_ARCH \ ++ yum-utils \ + $KERNEL-debuginfo-$KERN_REV.$KERN_ARCH" + NEEDED=`rpm --qf "%{name}-%{version}-%{release}.%{arch}\n" \ + -q $CANDIDATES | grep "is not installed" | awk '{print $2}'` + if [ "$NEEDED" != "" ]; then + echo -e "Need to install the following packages:\n$NEEDED" + if [ `id -u` = "0" ]; then #attempt to install +- yum install -y --enablerepo=\* $NEEDED ++ yum install -y --enablerepo=\* $NEEDED || ++ (if expr "$NEEDED" : ".*debuginfo.*" >/dev/null; ++ then debuginfo-install -y $KERNEL-$KERN_REV.$KERN_ARCH; ++ fi) + rpm -q $NEEDED + check_error $? "problem installing rpm(s) $NEEDED" + fi diff --git a/SOURCES/rhbz1337416.patch b/SOURCES/rhbz1337416.patch new file mode 100644 index 0000000..f278c90 --- /dev/null +++ b/SOURCES/rhbz1337416.patch @@ -0,0 +1,578 @@ +commit 056cb27baac1ce3ab4d675dbbe4881afde801ca3 +Author: Frank Ch. Eigler +Date: Wed Jun 22 11:43:33 2016 -0400 + + PR18079: support nested autocast / @defined + + We now perform const-folding & dead-code-elision during the type + resolution loop, whenever an autocast expression gets evaluated. This + way, @defined(foo()->mm) type expressions can work as nature intended. + + This requires @defined() not to be short-circuit evaluated to 0 during + a random const_folding process, so a flag is introduced to control its + preservation or collapsing. For the last (assert_resolvability) pass + in the type resolution loop, this flag is set to true, so that + genuinely unresolvable @defined($expressions) do get mapped to 0 in + time for a last elision. + +diff --git a/elaborate.cxx b/elaborate.cxx +index 4a375d9..a1088a1 100644 +--- a/elaborate.cxx ++++ b/elaborate.cxx +@@ -3984,9 +3984,10 @@ struct const_folder: public update_visitor + { + systemtap_session& session; + bool& relaxed_p; +- +- const_folder(systemtap_session& s, bool& r): +- session(s), relaxed_p(r), last_number(0), last_string(0) {} ++ bool collapse_defines_p; ++ ++ const_folder(systemtap_session& s, bool& r, bool collapse_defines = false): ++ session(s), relaxed_p(r), collapse_defines_p(collapse_defines), last_number(0), last_string(0) {} + + literal_number* last_number; + literal_number* get_number(expression*& e); +@@ -4506,15 +4507,26 @@ const_folder::visit_ternary_expression (ternary_expression* e) + void + const_folder::visit_defined_op (defined_op* e) + { +- // If a @defined makes it this far, then it is, de facto, undefined. +- +- if (session.verbose>2) +- clog << _("Collapsing untouched @defined check ") << *e->tok << endl; +- relaxed_p = false; ++ // If a @defined makes it this far, then it was not resolved by ++ // previous efforts. We could assume that therefore it is a big fat ++ // zero, but for the @defined(autocast) case PR18079, this just ++ // means that we didn't know yet. + +- literal_number* n = new literal_number (0); +- n->tok = e->tok; +- n->visit (this); ++ if (collapse_defines_p) ++ { ++ if (session.verbose>2) ++ clog << _("Collapsing untouched @defined check ") << *e->tok << endl; ++ relaxed_p = false; ++ literal_number* n = new literal_number (0); ++ n->tok = e->tok; ++ n->visit (this); ++ } ++ else ++ { ++ if (session.verbose>2) ++ clog << _("Preserving unresolved @defined check ") << *e->tok << endl; ++ provide (e); ++ } + } + + void +@@ -5387,6 +5399,21 @@ semantic_pass_types (systemtap_session& s) + ti.current_probe = 0; + ti.current_function = fd; + ti.t = pe_unknown; ++ ++ if (ti.assert_resolvability) ++ { ++ // PR18079, rerun the const-folder / dead-block-remover ++ // one last time, in case an unresolvable ++ // @defined($foobar) still persists. This should map ++ // those to 0. ++ bool relaxed_p; ++ const_folder cf (s, relaxed_p, true); // NB: true ++ cf.replace (fd->body); ++ dead_control_remover dc (s, relaxed_p); ++ fd->body->visit (&dc); ++ (void) relaxed_p; // we judge success later by num_still_unresolved, not this flag ++ } ++ + fd->body->visit (& ti); + // NB: we don't have to assert a known type for + // functions here, to permit a "void" function. +@@ -5402,6 +5429,16 @@ semantic_pass_types (systemtap_session& s) + { + autocast_expanding_visitor aev (ti); + aev.replace (fd->body); ++ ++ // PR18079, rerun the const-folder / dead-block-remover ++ // in case autocast evaluation enabled a @defined() ++ bool relaxed_p; ++ const_folder cf (s, relaxed_p); ++ cf.replace (fd->body); ++ dead_control_remover dc (s, relaxed_p); ++ fd->body->visit (&dc); ++ (void) relaxed_p; // we judge success later by num_still_unresolved, not this flag ++ + ti.num_available_autocasts = 0; + } + } +@@ -5420,6 +5457,21 @@ semantic_pass_types (systemtap_session& s) + ti.current_function = 0; + ti.current_probe = pn; + ti.t = pe_unknown; ++ ++ if (ti.assert_resolvability) ++ { ++ // PR18079, rerun the const-folder / dead-block-remover ++ // one last time, in case an unresolvable ++ // @defined($foobar) still persists. This should map ++ // those to 0. ++ bool relaxed_p; ++ const_folder cf (s, relaxed_p, true); // NB: true ++ cf.replace (pn->body); ++ dead_control_remover dc (s, relaxed_p); ++ pn->body->visit (&dc); ++ (void) relaxed_p; // we judge success later by num_still_unresolved, not this flag ++ } ++ + pn->body->visit (& ti); + for (unsigned i=0; i < pn->locals.size(); ++i) + ti.check_local (pn->locals[i]); +@@ -5429,6 +5481,16 @@ semantic_pass_types (systemtap_session& s) + { + autocast_expanding_visitor aev (ti); + aev.replace (pn->body); ++ ++ // PR18079, rerun the const-folder / dead-block-remover ++ // in case autocast evaluation enabled a @defined() ++ bool relaxed_p; ++ const_folder cf (s, relaxed_p); ++ cf.replace (pn->body); ++ dead_control_remover dc (s, relaxed_p); ++ pn->body->visit (&dc); ++ (void) relaxed_p; // we judge success later by num_still_unresolved, not this flag ++ + ti.num_available_autocasts = 0; + } + +@@ -5907,7 +5969,15 @@ typeresolution_info::visit_target_symbol (target_symbol* e) + // later unused-expression-elimination pass didn't get rid of it + // either. So we have a target symbol that is believed to be of + // genuine use, yet unresolved by the provider. +- ++ // ++ // PR18079, or it can happen if a $target expression is nested within ++ // a @defined() test that has not yet been resolved (but can be soon). ++ if (! assert_resolvability) ++ { ++ num_still_unresolved ++; ++ return; ++ } ++ + if (session.verbose > 2) + { + clog << _("Resolution problem with "); +@@ -5974,7 +6044,15 @@ typeresolution_info::visit_atvar_op (atvar_op* e) + void + typeresolution_info::visit_defined_op (defined_op* e) + { +- throw SEMANTIC_ERROR(_("unexpected @defined"), e->tok); ++ // PR18079: if a @defined is still around, it may have a parameter that ++ // wasn't resolvable one way or another earlier. Maybe an autocast_op. ++ // Let's give it a visit just in case. ++ e->operand->visit(this); ++ ++ if (assert_resolvability) ++ throw SEMANTIC_ERROR(_("unexpected @defined"), e->tok); ++ else ++ num_still_unresolved ++; + } + + +diff --git a/testsuite/semok/autocast14.stp b/testsuite/semok/autocast14.stp +index 55c06c4..1b32d80 100755 +--- a/testsuite/semok/autocast14.stp ++++ b/testsuite/semok/autocast14.stp +@@ -1,7 +1,7 @@ + #! stap -p2 + +-probe oneshot +-{ ++ ++@define STUFF %( + // precheck, it should work with @cast + if (!@defined(@task(0)->mm)) { + println($cast_failed_mm) +@@ -17,4 +17,16 @@ probe oneshot + if (@defined(task_current()->systemtap)) { + println($autocast_succeeded_systemtap) + } ++%) ++ ++ ++probe oneshot ++{ ++ @STUFF ++ foo() // from a function too, to test PR18079 function processing + } ++ ++function foo () ++{ ++ @STUFF ++} +\ No newline at end of file + +commit 0eda9cd7c9fe3cf7622f6bcf5e9cfba9fdf537dd +Author: Josh Stone +Date: Wed Jun 22 12:09:05 2016 -0700 + + Increase the difficulty of semok/autocast14.stp + +diff --git a/testsuite/semok/autocast14.stp b/testsuite/semok/autocast14.stp +index 1b32d80..b9488d7 100755 +--- a/testsuite/semok/autocast14.stp ++++ b/testsuite/semok/autocast14.stp +@@ -17,6 +17,19 @@ + if (@defined(task_current()->systemtap)) { + println($autocast_succeeded_systemtap) + } ++ ++ // Test that autocast can resolve on the results of @defined ++ mm1 = @choose_defined($nonsense, task_current())->mm; ++ mm2 = @choose_defined(task_current(), $nonsense)->mm; ++ println(mm1 == mm2) ++ ++ // Test an even deeper level of @defined ++ if (!@defined(mm1->mmap) || !@defined(mm2->mmap)) { ++ println($autocast_failed_mm_mmap) ++ } ++ if (@defined(mm1->systemtap) || @defined(mm2->systemtap)) { ++ println($autocast_succeeded_mm_systemtap) ++ } + %) + + +@@ -29,4 +42,4 @@ probe oneshot + function foo () + { + @STUFF +-} +\ No newline at end of file ++} + +commit 048b546d5645abb6e6ef5148c4ddbd170600e1d3 +Author: Josh Stone +Date: Fri Jul 8 18:21:49 2016 -0700 + + Tweak autocast-defined interactions further + + - collapse basic @defined($foo) right away. + - last-ditch collapse other @defined(expr) to 1 or 0 depending on pe_unknown. + - run that last-ditch effort *before* turning on assert_resolvability. + - only run extra dead_control_remover for optimized runs + - in var_expanding_visitor, pass *any* unchanged expr through, so they + may be decided later. (e.g. for @choose_defined ternaries) + +diff --git a/elaborate.cxx b/elaborate.cxx +index a1088a1..fd6ccce 100644 +--- a/elaborate.cxx ++++ b/elaborate.cxx +@@ -3987,7 +3987,8 @@ struct const_folder: public update_visitor + bool collapse_defines_p; + + const_folder(systemtap_session& s, bool& r, bool collapse_defines = false): +- session(s), relaxed_p(r), collapse_defines_p(collapse_defines), last_number(0), last_string(0) {} ++ session(s), relaxed_p(r), collapse_defines_p(collapse_defines), ++ last_number(0), last_string(0), last_target_symbol(0) {} + + literal_number* last_number; + literal_number* get_number(expression*& e); +@@ -4011,6 +4012,9 @@ struct const_folder: public update_visitor + void visit_concatenation (concatenation* e); + void visit_ternary_expression (ternary_expression* e); + void visit_defined_op (defined_op* e); ++ ++ target_symbol* last_target_symbol; ++ target_symbol* get_target_symbol(expression*& e); + void visit_target_symbol (target_symbol* e); + }; + +@@ -4511,15 +4515,35 @@ const_folder::visit_defined_op (defined_op* e) + // previous efforts. We could assume that therefore it is a big fat + // zero, but for the @defined(autocast) case PR18079, this just + // means that we didn't know yet. ++ int64_t value = 0; ++ bool collapse_this = false; + +- if (collapse_defines_p) ++ // We do know that plain target_symbols aren't going anywhere though. ++ if (get_target_symbol (e->operand)) ++ { ++ if (session.verbose>2) ++ clog << _("Collapsing target_symbol @defined check ") << *e->tok << endl; ++ collapse_this = true; ++ } ++ else if (collapse_defines_p && relaxed_p) + { + if (session.verbose>2) + clog << _("Collapsing untouched @defined check ") << *e->tok << endl; +- relaxed_p = false; +- literal_number* n = new literal_number (0); +- n->tok = e->tok; +- n->visit (this); ++ ++ // If we got to an expression with a known type, call it defined. ++ if (e->operand->type != pe_unknown) ++ value = 1; ++ collapse_this = true; ++ } ++ ++ if (collapse_this) ++ { ++ // Don't be greedy... we'll only collapse one at a time so type ++ // resolution can have another go at it. ++ relaxed_p = false; ++ literal_number* n = new literal_number (value); ++ n->tok = e->tok; ++ n->visit (this); + } + else + { +@@ -4529,6 +4553,13 @@ const_folder::visit_defined_op (defined_op* e) + } + } + ++target_symbol* ++const_folder::get_target_symbol(expression*& e) ++{ ++ replace (e); ++ return (e == last_target_symbol) ? last_target_symbol : NULL; ++} ++ + void + const_folder::visit_target_symbol (target_symbol* e) + { +@@ -4545,7 +4576,10 @@ const_folder::visit_target_symbol (target_symbol* e) + relaxed_p = false; + } + else +- update_visitor::visit_target_symbol (e); ++ { ++ update_visitor::visit_target_symbol (e); ++ last_target_symbol = e; ++ } + } + + static int initial_typeres_pass(systemtap_session& s); +@@ -5400,20 +5434,6 @@ semantic_pass_types (systemtap_session& s) + ti.current_function = fd; + ti.t = pe_unknown; + +- if (ti.assert_resolvability) +- { +- // PR18079, rerun the const-folder / dead-block-remover +- // one last time, in case an unresolvable +- // @defined($foobar) still persists. This should map +- // those to 0. +- bool relaxed_p; +- const_folder cf (s, relaxed_p, true); // NB: true +- cf.replace (fd->body); +- dead_control_remover dc (s, relaxed_p); +- fd->body->visit (&dc); +- (void) relaxed_p; // we judge success later by num_still_unresolved, not this flag +- } +- + fd->body->visit (& ti); + // NB: we don't have to assert a known type for + // functions here, to permit a "void" function. +@@ -5431,13 +5451,19 @@ semantic_pass_types (systemtap_session& s) + aev.replace (fd->body); + + // PR18079, rerun the const-folder / dead-block-remover +- // in case autocast evaluation enabled a @defined() +- bool relaxed_p; +- const_folder cf (s, relaxed_p); +- cf.replace (fd->body); +- dead_control_remover dc (s, relaxed_p); +- fd->body->visit (&dc); +- (void) relaxed_p; // we judge success later by num_still_unresolved, not this flag ++ // if autocast evaluation enabled a @defined() ++ if (aev.count_replaced_defined_ops() > 0) ++ { ++ bool relaxed_p = true; ++ const_folder cf (s, relaxed_p); ++ cf.replace (fd->body); ++ if (! s.unoptimized) ++ { ++ dead_control_remover dc (s, relaxed_p); ++ fd->body->visit (&dc); ++ } ++ (void) relaxed_p; // we judge success later by num_still_unresolved, not this flag ++ } + + ti.num_available_autocasts = 0; + } +@@ -5458,20 +5484,6 @@ semantic_pass_types (systemtap_session& s) + ti.current_probe = pn; + ti.t = pe_unknown; + +- if (ti.assert_resolvability) +- { +- // PR18079, rerun the const-folder / dead-block-remover +- // one last time, in case an unresolvable +- // @defined($foobar) still persists. This should map +- // those to 0. +- bool relaxed_p; +- const_folder cf (s, relaxed_p, true); // NB: true +- cf.replace (pn->body); +- dead_control_remover dc (s, relaxed_p); +- pn->body->visit (&dc); +- (void) relaxed_p; // we judge success later by num_still_unresolved, not this flag +- } +- + pn->body->visit (& ti); + for (unsigned i=0; i < pn->locals.size(); ++i) + ti.check_local (pn->locals[i]); +@@ -5483,13 +5495,19 @@ semantic_pass_types (systemtap_session& s) + aev.replace (pn->body); + + // PR18079, rerun the const-folder / dead-block-remover +- // in case autocast evaluation enabled a @defined() +- bool relaxed_p; +- const_folder cf (s, relaxed_p); +- cf.replace (pn->body); +- dead_control_remover dc (s, relaxed_p); +- pn->body->visit (&dc); +- (void) relaxed_p; // we judge success later by num_still_unresolved, not this flag ++ // if autocast evaluation enabled a @defined() ++ if (aev.count_replaced_defined_ops() > 0) ++ { ++ bool relaxed_p = true; ++ const_folder cf (s, relaxed_p); ++ cf.replace (pn->body); ++ if (! s.unoptimized) ++ { ++ dead_control_remover dc (s, relaxed_p); ++ pn->body->visit (&dc); ++ } ++ (void) relaxed_p; // we judge success later by num_still_unresolved, not this flag ++ } + + ti.num_available_autocasts = 0; + } +@@ -5526,9 +5544,27 @@ semantic_pass_types (systemtap_session& s) + break; // successfully + else if (! ti.assert_resolvability) + { +- ti.assert_resolvability = true; // last pass, with error msgs +- if (s.verbose > 0) +- ti.mismatch_complexity = 0; // print every kind of mismatch ++ // PR18079, before we go asserting anything, try to nullify any ++ // still-unresolved @defined ops. ++ bool relaxed_p = true; ++ const_folder cf (s, relaxed_p, true); // NB: true ++ ++ for (auto it = s.probes.begin(); it != s.probes.end(); ++it) ++ cf.replace ((*it)->body); ++ for (auto it = s.functions.begin(); it != s.functions.end(); ++it) ++ cf.replace (it->second->body); ++ ++ if (! s.unoptimized) ++ semantic_pass_dead_control (s, relaxed_p); ++ ++ if (! relaxed_p) ++ ti.mismatch_complexity = 0; // reset for next pass ++ else ++ { ++ ti.assert_resolvability = true; // last pass, with error msgs ++ if (s.verbose > 0) ++ ti.mismatch_complexity = 0; // print every kind of mismatch ++ } + } + else + { // unsuccessful conclusion +diff --git a/tapsets.cxx b/tapsets.cxx +index 069966b..6d82069 100644 +--- a/tapsets.cxx ++++ b/tapsets.cxx +@@ -2835,7 +2835,8 @@ private: + unsigned var_expanding_visitor::tick = 0; + + +-var_expanding_visitor::var_expanding_visitor (): op() ++var_expanding_visitor::var_expanding_visitor (): ++ replaced_defined_ops(0), op() + { + // FIXME: for the time being, by default we only support plain '$foo + // = bar', not '+=' or any other op= variant. This is fixable, but a +@@ -2964,6 +2965,7 @@ var_expanding_visitor::visit_delete_statement (delete_statement* s) + void + var_expanding_visitor::visit_defined_op (defined_op* e) + { ++ expression * const old_operand = e->operand; + bool resolved = true; + + defined_ops.push (e); +@@ -2999,11 +3001,12 @@ var_expanding_visitor::visit_defined_op (defined_op* e) + target_symbol* tsym = dynamic_cast (e->operand); + if (tsym && tsym->saved_conversion_error) // failing + resolved = false; +- else if (tsym) // unresolved but not marked failing ++ else if (e->operand == old_operand) // unresolved but not marked failing + { + // There are some visitors that won't touch certain target_symbols, + // e.g. dwarf_var_expanding_visitor won't resolve @cast. We should + // leave it for now so some other visitor can have a chance. ++ defined_ops.pop (); + provide (e); + return; + } +@@ -3017,6 +3020,7 @@ var_expanding_visitor::visit_defined_op (defined_op* e) + literal_number* ln = new literal_number (resolved ? 1 : 0); + ln->tok = e->tok; + provide (ln); ++ ++replaced_defined_ops; + } + + +diff --git a/tapsets.h b/tapsets.h +index d630dbb..cb73a7e 100644 +--- a/tapsets.h ++++ b/tapsets.h +@@ -61,11 +61,6 @@ public: + + struct var_expanding_visitor: public update_visitor + { +- static unsigned tick; +- std::stack defined_ops; +- std::set valid_ops; +- interned_string* op; +- + var_expanding_visitor (); + void visit_assignment (assignment* e); + void visit_pre_crement (pre_crement* e); +@@ -73,6 +68,15 @@ struct var_expanding_visitor: public update_visitor + void visit_delete_statement (delete_statement* s); + void visit_defined_op (defined_op* e); + ++ unsigned count_replaced_defined_ops () { return replaced_defined_ops; } ++ ++protected: ++ static unsigned tick; ++ unsigned replaced_defined_ops; ++ std::stack defined_ops; ++ std::set valid_ops; ++ interned_string* op; ++ + void provide_lvalue_call(functioncall* fcall); + + private: +diff --git a/testsuite/semok/autocast14.stp b/testsuite/semok/autocast14.stp +index b9488d7..18028e8 100755 +--- a/testsuite/semok/autocast14.stp ++++ b/testsuite/semok/autocast14.stp +@@ -30,6 +30,13 @@ + if (@defined(mm1->systemtap) || @defined(mm2->systemtap)) { + println($autocast_succeeded_mm_systemtap) + } ++ ++ // Test that autocast can resolve through nested @defined ++ // (especially that the ternary isn't automatically "defined") ++ mm3 = @choose_defined(@choose_defined($nonsense, $wut), task_current())->mm; ++ mm4 = @choose_defined(@choose_defined($nonsense, task_current()), $wut)->mm; ++ mm5 = @choose_defined(@choose_defined(task_current(), $nonsense), $wut)->mm; ++ println(mm3 == mm4 && mm4 == mm5) + %) + + diff --git a/SOURCES/rhbz1346112.patch b/SOURCES/rhbz1346112.patch new file mode 100644 index 0000000..8a74218 --- /dev/null +++ b/SOURCES/rhbz1346112.patch @@ -0,0 +1,62 @@ +commit be665e77eb7cd88a3d15676945bec7def3eb73d5 +Author: Frank Ch. Eigler +Date: Wed Jun 15 10:58:01 2016 -0400 + + RHBZ1346112: let stap-server create ssl-cert on first run rather than install + + This way different container-images get different certs. + +diff --git a/stap-server b/stap-server +index 939c503..c39ae49 100644 +--- a/stap-server ++++ b/stap-server +@@ -500,6 +500,19 @@ prepare_stat_dir () { + return 0 + } + ++prepare_certs () { ++ if [ "$USER" != "`id -un`" ]; then ++ if ! runuser -s /bin/bash - $USER -c 'test -f $HOME/.systemtap/ssl/server/stap.cert'; then ++ runuser -s /bin/bash - $USER -c %{_libexecdir}/systemtap/stap-gen-cert >/dev/null ++ fi ++ else ++ if ! test -f $HOME/.systemtap/ssl/server/stap.cert; then ++ ${PKGLIBEXECDIR}stap-gen-cert ++ fi ++ fi ++} ++ ++ + prepare_log_dir () { + local log_path=`dirname "$1"` + if [ ! -d "$log_path" ]; then +@@ -859,6 +872,13 @@ start_server () { + fi + fi + ++ # Create certificates for this server ++ prepare_certs ++ if [ $? -ne 0 ]; then ++ echo $"Failed to make certificates ($USER .systemtap/ssl/server/stap.cert)" >&2 ++ exit 1 ++ fi ++ + # Create the log directory for this server + prepare_log_dir "$LOG" + if [ $? -ne 0 ]; then +diff --git a/systemtap.spec b/systemtap.spec +index 1630fba..84bf041 100644 +--- a/systemtap.spec ++++ b/systemtap.spec +@@ -658,11 +658,6 @@ test -e %{_localstatedir}/log/stap-server/log || { + chmod 644 %{_localstatedir}/log/stap-server/log + chown stap-server:stap-server %{_localstatedir}/log/stap-server/log + } +-# If it does not already exist, as stap-server, generate the certificate +-# used for signing and for ssl. +-if test ! -e ~stap-server/.systemtap/ssl/server/stap.cert; then +- runuser -s /bin/sh - stap-server -c %{_libexecdir}/systemtap/stap-gen-cert >/dev/null +-fi + # Prepare the service + %if %{with_systemd} + # Note, Fedora policy doesn't allow network services enabled by default diff --git a/SOURCES/rhbz1365550.patch b/SOURCES/rhbz1365550.patch new file mode 100644 index 0000000..15052ec --- /dev/null +++ b/SOURCES/rhbz1365550.patch @@ -0,0 +1,52 @@ +commit 10c48d46fa482b8cc762592aaee6c7cc178356e7 +Author: Frank Ch. Eigler +Date: Mon Mar 28 08:54:11 2016 -0400 + + PR19874: reset 60s alarm for "stap -c CMD" + + Brown paper bag bug. Test case included. + +diff --git a/staprun/mainloop.c b/staprun/mainloop.c +index 82c0c74..874fbd8 100644 +--- a/staprun/mainloop.c ++++ b/staprun/mainloop.c +@@ -281,6 +281,7 @@ void start_cmd(void) + raise (SIGCONT); /* Harmless; just passes control to parent. */ + #endif /* !WORKAROUND_BZ467568 */ + ++ alarm(0); /* clear alarms */ + dbug(1, "execing target_cmd %s\n", target_cmd); + + /* Note that execvp() is not a direct system call; it does a $PATH +diff --git a/testsuite/systemtap.base/staprunwait.exp b/testsuite/systemtap.base/staprunwait.exp +new file mode 100644 +index 0000000..fc71973 +--- /dev/null ++++ b/testsuite/systemtap.base/staprunwait.exp +@@ -0,0 +1,17 @@ ++set test staprunwait ++ ++if {! [installtest_p]} { untested $test; return } ++ ++foreach runtime [get_runtime_list] { ++ if {$runtime != ""} { ++ set ok [catch {exec stap $srcdir/$subdir/$test.stp --runtime=$runtime -c "sleep 120"} foo] ++ } else { ++ set ok [catch {exec stap $srcdir/$subdir/$test.stp -c "sleep 120"} foo] ++ } ++ verbose -log "$ok $foo" ++ if {$ok != 0} { ++ fail "$test $runtime" ++ } else { ++ pass "$test $runtime" ++ } ++} +diff --git a/testsuite/systemtap.base/staprunwait.stp b/testsuite/systemtap.base/staprunwait.stp +new file mode 100644 +index 0000000..91cbc92 +--- /dev/null ++++ b/testsuite/systemtap.base/staprunwait.stp +@@ -0,0 +1,3 @@ ++#! /usr/bin/env stap ++ ++probe timer.s(10) { println(ctime()) } diff --git a/SOURCES/rhbz1376515.patch b/SOURCES/rhbz1376515.patch new file mode 100644 index 0000000..bbe92e6 --- /dev/null +++ b/SOURCES/rhbz1376515.patch @@ -0,0 +1,281 @@ +From fced4ba337a4eddb4163994834a122e62c6efdfb Mon Sep 17 00:00:00 2001 +From: Ravi Bangoria +Date: Wed, 14 Sep 2016 13:32:51 +0530 +Subject: [PATCH 1/2] ppc64le: Store correct function entry address in + symbol_table + +PPC64 ELF ABI v2 has a Global Entry Point and a Local Entry Point for +the functions. Debuginfo of ELF contains GEP which is same as entrypc +while symbol table contains GEP and offset, from which we can calculate +LEP. LEP is used to call function within single CU, when TOC pointer +update is not required. Placing a probe on LEP catches call from both +the GEP and the LEP but, by default, systemtap probes on GEP. + +For ppc64le, Systemtap stores LEP in symbol table and prioritize symbol +table over debuginfo. But, storing LEP in symbol table has couple of +regression effect. As LEP is only required at a time of adding a probe, +don't store it in symbol table. + +No need to prioritize symbol table as well because debuginfo and symbol +table both will contain Global Entry Point. + +Revert commit b4c6a4b1cd00 ("Prioritize symbol table lookup for ppc64le") +partially. + +Signed-off-by: Ravi Bangoria +--- + tapsets.cxx | 62 +------------------------------------------------------------ + 1 file changed, 1 insertion(+), 61 deletions(-) + +diff --git a/tapsets.cxx b/tapsets.cxx +index 4167678..a887e1f 100644 +--- a/tapsets.cxx ++++ b/tapsets.cxx +@@ -2134,18 +2134,6 @@ query_dwarf_inline_instance (Dwarf_Die * die, dwarf_query * q) + } + } + +-static bool +-is_filtered_func_exists (func_info_map_t const& filtered, func_info *fi) +-{ +- for (unsigned i = 0; i < filtered.size(); i++) +- { +- if ((filtered[i].entrypc == fi->entrypc) && (filtered[i].name == fi->name)) +- return true; +- } +- +- return false; +-} +- + static int + query_dwarf_func (Dwarf_Die * func, dwarf_query * q) + { +@@ -2198,37 +2186,7 @@ query_dwarf_func (Dwarf_Die * func, dwarf_query * q) + q->dw.function_line (&func.decl_line); + + Dwarf_Addr entrypc; +- +- func.entrypc = 0; +- Dwarf_Addr bias; +- Dwfl_Module *mod = q->dw.module; +- Elf* elf = (dwarf_getelf (dwfl_module_getdwarf (mod, &bias)) +- ?: dwfl_module_getelf (mod, &bias)); +- +- GElf_Ehdr ehdr_mem; +- GElf_Ehdr* em = gelf_getehdr (elf, &ehdr_mem); +- if (em == NULL) throw SEMANTIC_ERROR (_("Couldn't get elf header")); +- +- /* Giving priority to sym_table for ppc64*/ +- if ((em->e_machine == EM_PPC64) && ((em->e_flags & EF_PPC64_ABI) == 2) +- && (q->dw.mod_info->sym_table)) +- { +- /* The linkage name is the best match for the symbol table. */ +- const string& linkage_name = dwarf_linkage_name(&func.die) +- ?: dwarf_diename(&func.die) ?: (string)func.name; +- +- set fis = q->dw.mod_info->sym_table->lookup_symbol(linkage_name); +- for (set::iterator it=fis.begin(); it!=fis.end() ; ++it) +- { +- func.entrypc = (*it)->entrypc; +- if (is_filtered_func_exists(q->filtered_functions, &func)) +- continue; +- q->filtered_functions.push_back(func); +- } +- } +- +- /* If not ppc64 or not found in sym_table, try it directly. */ +- if (!func.entrypc && q->dw.function_entrypc (&entrypc)) ++ if (q->dw.function_entrypc (&entrypc)) + { + func.entrypc = entrypc; + q->filtered_functions.push_back (func); +@@ -8448,13 +8406,6 @@ symbol_table::get_from_elf() + int syments = dwfl_module_getsymtab(mod); + assert(syments); + prepare_section_rejection(mod); +- Dwarf_Addr bias; +- Elf* elf = (dwarf_getelf (dwfl_module_getdwarf (mod, &bias)) +- ?: dwfl_module_getelf (mod, &bias)); +- +- GElf_Ehdr ehdr_mem; +- GElf_Ehdr* em = gelf_getehdr (elf, &ehdr_mem); +- if (em == NULL) throw SEMANTIC_ERROR (_("Couldn't get elf header")); + + for (int i = 1; i < syments; ++i) + { +@@ -8487,18 +8438,7 @@ symbol_table::get_from_elf() + continue; + interned_string name = n; + +- /* +- * For ELF ABI v2 on PPC64 LE, we need to adjust sym.st_value corresponding +- * to the bits of sym.st_other. These bits will tell us what's the offset +- * of the local entry point from the global entry point. +- * +- * st_other field is currently only used with ABIv2 on ppc64 +- */ + Dwarf_Addr entrypc = addr; +- if ((em->e_machine == EM_PPC64) && ((em->e_flags & EF_PPC64_ABI) == 2) +- && (GELF_ST_TYPE(sym.st_info) == STT_FUNC) && sym.st_other) +- entrypc += PPC64_LOCAL_ENTRY_OFFSET(sym.st_other); +- + if (GELF_ST_TYPE(sym.st_info) == STT_FUNC) + add_symbol(name, (GELF_ST_BIND(sym.st_info) == STB_WEAK), + reject, addr, entrypc); +-- +1.8.3.1 + +From 1b83a55a0272f2eb0bdcd5809fb630e1f369d400 Mon Sep 17 00:00:00 2001 +From: Ravi Bangoria +Date: Wed, 14 Sep 2016 13:36:00 +0530 +Subject: [PATCH 2/2] ppc64le: Fix LEP usage for probing + +PPC64 ELF ABI v2 has a Global Entry Point and a Local Entry Point for +the functions. Debuginfo of ELF contains GEP which is same as entrypc +while symbol table contains GEP and offset, from which we can calculate +LEP. LEP is used to call function within single CU, when TOC pointer +update is not required. Placing a probe on LEP catches call from both +the GEP and the LEP but, by default, systemtap probes on GEP. + +Commit b4c6a4b1cd00 ("Prioritize symbol table lookup for ppc64le") solve +this issue by storing LEP in symbol table and prioritizing symbol table +over debuginfo for ppc64le. + +But there are few regression effect of this patch. Couple of examples +are given below. + +1. If target program is compiled without optimization and user is +interested in function parameter, systemtap should probe after function +prologue. But above patch forces probe on LEP and which result in garbage +value of function parameter will get recorded. + + $ make verbose=1 installcheck RUNTESTFLAGS='at_var.exp -v --debug' + ... + # of expected passes 1 + # of unexpected failures 1 + +2. Probe on shared library function with parameter is failing at Pass 2. + + $ make verbose=1 installcheck RUNTESTFLAGS='exelib.exp -v --debug' + ... + # of expected passes 10 + # of unexpected failures 64 + +3. When symbol_name with offset is used to register kprobe, kernel itself +will find LEP and adds offset to it. Systemtap using LEP to find offset +is resulting in offset being added two times. + GEP + lep_offset (by systemtap) + lep_offset (by kernel) + +This can be solved by calculating LEP only at a time of adding a probe. +That will make effect of LEP local to that area and won't have any +regression effect. + +After applying patch: + + $ make verbose=1 installcheck RUNTESTFLAGS='at_var.exp -v --debug' + ... + # of expected passes 2 + + $ make verbose=1 installcheck RUNTESTFLAGS='exelib.exp -v --debug' + ... + # of expected passes 74 + +Signed-off-by: Ravi Bangoria +--- + tapsets.cxx | 60 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++- + 1 file changed, 59 insertions(+), 1 deletion(-) + +diff --git a/tapsets.cxx b/tapsets.cxx +index a887e1f..30aebb9 100644 +--- a/tapsets.cxx ++++ b/tapsets.cxx +@@ -1376,6 +1376,59 @@ string path_remove_sysroot(const systemtap_session& sess, const string& path) + return retval; + } + ++/* ++ * Convert 'Global Entry Point' to 'Local Entry Point'. ++ * ++ * if @gep contains next address after prologue, don't change it. ++ * ++ * For ELF ABI v2 on PPC64 LE, we need to adjust sym.st_value corresponding ++ * to the bits of sym.st_other. These bits will tell us what's the offset ++ * of the local entry point from the global entry point. ++ * ++ * st_other field is currently only used with ABIv2 on ppc64 ++ */ ++static Dwarf_Addr ++get_lep(dwarf_query *q, Dwarf_Addr gep) ++{ ++ Dwarf_Addr bias; ++ Dwfl_Module *mod = q->dw.module; ++ Elf* elf = (dwarf_getelf (dwfl_module_getdwarf (mod, &bias)) ++ ?: dwfl_module_getelf (mod, &bias)); ++ ++ GElf_Ehdr ehdr_mem; ++ GElf_Ehdr* em = gelf_getehdr (elf, &ehdr_mem); ++ if (em == NULL) ++ throw SEMANTIC_ERROR (_("Couldn't get elf header")); ++ ++ if (!(em->e_machine == EM_PPC64) || !((em->e_flags & EF_PPC64_ABI) == 2)) ++ return gep; ++ ++ int syments = dwfl_module_getsymtab(mod); ++ for (int i = 1; i < syments; ++i) ++ { ++ GElf_Sym sym; ++ GElf_Word section; ++ GElf_Addr addr; ++ ++#if _ELFUTILS_PREREQ (0, 158) ++ dwfl_module_getsym_info (mod, i, &sym, &addr, §ion, NULL, NULL); ++#else ++ dwfl_module_getsym (mod, i, &sym, §ion); ++ addr = sym.st_value; ++#endif ++ ++ /* ++ * Symbol table contains module_bias + offset. Substract module_bias ++ * to compare offset with gep. ++ */ ++ if ((addr - bias) == gep && (GELF_ST_TYPE(sym.st_info) == STT_FUNC) ++ && sym.st_other) ++ return gep + PPC64_LOCAL_ENTRY_OFFSET(sym.st_other); ++ } ++ ++ return gep; ++} ++ + void + dwarf_query::add_probe_point(interned_string dw_funcname, + interned_string filename, +@@ -1384,12 +1437,14 @@ dwarf_query::add_probe_point(interned_string dw_funcname, + Dwarf_Addr addr) + { + interned_string reloc_section; // base section for relocation purposes ++ Dwarf_Addr orig_addr = addr; + Dwarf_Addr reloc_addr; // relocated + interned_string module = dw.module_name; // "kernel" or other + interned_string funcname = dw_funcname; + + assert (! has_absolute); // already handled in dwarf_builder::build() + ++ addr = get_lep(this, addr); + reloc_addr = dw.relocate_address(addr, reloc_section); + + // If we originally used the linkage name, then let's call it that way +@@ -1455,7 +1510,10 @@ dwarf_query::add_probe_point(interned_string dw_funcname, + + symbol_table *sym_table = mi->sym_table; + func_info *symbol = sym_table->get_func_containing_address(addr); +- Dwarf_Addr offset = addr - symbol->addr; ++ ++ // Do not use LEP to find offset here. When 'symbol_name' ++ // is used to register probe, kernel itself will find LEP. ++ Dwarf_Addr offset = orig_addr - symbol->addr; + results.push_back (new dwarf_derived_probe(funcname, filename, + line, module, + reloc_section, addr, +-- +1.8.3.1 + diff --git a/SOURCES/rhbz1378462.patch b/SOURCES/rhbz1378462.patch new file mode 100644 index 0000000..79429d0 --- /dev/null +++ b/SOURCES/rhbz1378462.patch @@ -0,0 +1,19 @@ +commit 9df1b480eb008c63d6dab167fc992e172730ba77 +Author: Martin Cermak +Date: Thu Sep 22 15:10:29 2016 +0200 + + Fix rhbz1378462 by updating the path to stap-gen-cert in stap-server. + +diff --git a/stap-server b/stap-server +index c39ae49..7cb75d6 100644 +--- a/stap-server ++++ b/stap-server +@@ -503,7 +503,7 @@ prepare_stat_dir () { + prepare_certs () { + if [ "$USER" != "`id -un`" ]; then + if ! runuser -s /bin/bash - $USER -c 'test -f $HOME/.systemtap/ssl/server/stap.cert'; then +- runuser -s /bin/bash - $USER -c %{_libexecdir}/systemtap/stap-gen-cert >/dev/null ++ runuser -s /bin/bash - $USER -c ${PKGLIBEXECDIR}stap-gen-cert >/dev/null + fi + else + if ! test -f $HOME/.systemtap/ssl/server/stap.cert; then diff --git a/SPECS/systemtap.spec b/SPECS/systemtap.spec new file mode 100644 index 0000000..da34427 --- /dev/null +++ b/SPECS/systemtap.spec @@ -0,0 +1,1402 @@ +%{?scl:%scl_package systemtap} +%global sysconfdir %{?scl:%_root_sysconfdir}%{!?scl:%_sysconfdir} + +%{!?with_sqlite: %global with_sqlite 1} +%{!?with_docs: %global with_docs 0} +%{!?with_htmldocs: %global with_htmldocs 0} +%{!?with_monitor: %global with_monitor 1} +# crash is not available +%ifarch ppc ppc64 %{sparc} aarch64 ppc64le +%{!?with_crash: %global with_crash 0} +%else +%{!?with_crash: %global with_crash 1} +%endif +%{!?with_rpm: %global with_rpm 1} +%{!?with_bundled_elfutils: %global with_bundled_elfutils 0} +%{!?elfutils_version: %global elfutils_version 0.142} +%{!?pie_supported: %global pie_supported 1} +%{!?with_boost: %global with_boost 0} +%ifarch i686 ppc64 x86_64 +%{!?with_dyninst: %global with_dyninst 1} +%else +%{!?with_dyninst: %global with_dyninst 0} +%endif +%{!?with_systemd: %global with_systemd 0} # disable even on rhel7 +%{!?with_emacsvim: %global with_emacsvim 0} +%{!?with_java: %global with_java 0} +# don't want to build runtime-virthost for f18 or RHEL5/6 +%{!?with_virthost: %global with_virthost 0} +%{!?with_virtguest: %global with_virtguest 0} +%{!?with_dracut: %global with_dracut 0%{?fedora} >= 19 || 0%{?rhel} >= 7} +%ifarch x86_64 +%{!?with_mokutil: %global with_mokutil 0%{?fedora} >= 18 || 0%{?rhel} >= 7} +%{!?with_openssl: %global with_openssl 0%{?fedora} >= 18 || 0%{?rhel} >= 7} +%else +%{!?with_mokutil: %global with_mokutil 0} +%{!?with_openssl: %global with_openssl 0} +%endif +%{!?with_pyparsing: %global with_pyparsing 0%{?fedora} >= 18 || 0%{?rhel} >= 7} +%{!?with_python3: %global with_python3 0%{?fedora} >= 23} + +%ifarch ppc64le aarch64 +%global with_virthost 0 +%endif + +%if 0%{?fedora} >= 18 || 0%{?rhel} >= 6 + %define initdir %{sysconfdir}/rc.d/init.d +# not scl-wrapped %{_initdir} +%else # RHEL5 doesn't know _initddir + %define initdir %{_initrddir} +%endif + +# note not under /opt/rh... SCL special +%define dracutlibdir %{_root_prefix}/lib/dracut +%define dracutstap %{dracutlibdir}/modules.d/99%{scl_prefix}stap + +Name: %{?scl_prefix}systemtap +Version: 3.0 +Release: 8s%{?dist} +# for version, see also configure.ac + +# NB Patch1 is for elfutils, further below + +# Packaging abstract: +# +# systemtap empty req:-client req:-devel +# systemtap-server /usr/bin/stap-server*, req:-devel +# systemtap-devel /usr/bin/stap, runtime, tapset, req:kernel-devel +# systemtap-runtime /usr/bin/staprun, /usr/bin/stapsh, /usr/bin/stapdyn +# systemtap-client /usr/bin/stap, samples, docs, tapset(bonus), req:-runtime +# systemtap-initscript /etc/init.d/systemtap, dracut module, req:systemtap +# systemtap-sdt-devel /usr/include/sys/sdt.h /usr/bin/dtrace +# systemtap-testsuite /usr/share/systemtap/testsuite*, req:systemtap, req:sdt-devel +# systemtap-runtime-java libHelperSDT.so, HelperSDT.jar, stapbm, req:-runtime +# systemtap-runtime-virthost /usr/bin/stapvirt, req:libvirt req:libxml2 +# systemtap-runtime-virtguest udev rules, init scripts/systemd service, req:-runtime +# +# Typical scenarios: +# +# stap-client: systemtap-client +# stap-server: systemtap-server +# local user: systemtap +# +# Unusual scenarios: +# +# intermediary stap-client for --remote: systemtap-client (-runtime unused) +# intermediary stap-server for --use-server: systemtap-server (-devel unused) + +Summary: Programmable system-wide instrumentation system +Group: Development/System +License: GPLv2+ +URL: http://sourceware.org/systemtap/ +Source: ftp://sourceware.org/pub/systemtap/releases/systemtap-%{version}.tar.gz + +# Build* +BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n) +BuildRequires: gcc-c++ +BuildRequires: gettext-devel +BuildRequires: nss-devel avahi-devel pkgconfig +%if %{with_dyninst} +BuildRequires: %{?scl_prefix}dyninst-devel >= 8.0 +BuildRequires: libselinux-devel +%endif +%if %{with_sqlite} +BuildRequires: sqlite-devel +%endif +%if %{with_monitor} +BuildRequires: json-c-devel ncurses-devel +%endif +# Needed for libstd++ < 4.0, without +%if %{with_boost} +BuildRequires: boost-devel +%endif +%if %{with_crash} +BuildRequires: crash-devel zlib-devel +%endif +%if %{with_rpm} +BuildRequires: rpm-devel glibc-headers +%endif +%if %{with_bundled_elfutils} +Source1: elfutils-%{elfutils_version}.tar.gz +Patch1: elfutils-portability.patch +BuildRequires: m4 +%global setup_elfutils -a1 +%else +BuildRequires: %{?scl_prefix}elfutils-devel >= %{elfutils_version} +%endif +%if %{with_docs} +BuildRequires: /usr/bin/latex /usr/bin/dvips /usr/bin/ps2pdf latex2html +%if 0%{?fedora} >= 18 || 0%{?rhel} >= 7 +BuildRequires: tex(fullpage.sty) tex(fancybox.sty) tex(bchr7t.tfm) tex(graphicx.sty) +%endif +# For the html.sty mentioned in the .tex files, even though latex2html is +# not run during the build, only during manual scripts/update-docs runs: +BuildRequires: latex2html +%if %{with_htmldocs} +# On F10, xmlto's pdf support was broken off into a sub-package, +# called 'xmlto-tex'. To avoid a specific F10 BuildReq, we'll do a +# file-based buildreq on '/usr/share/xmlto/format/fo/pdf'. +BuildRequires: xmlto /usr/share/xmlto/format/fo/pdf +%endif +%endif +%{?scl:Requires:%scl_runtime} +%if %{with_emacsvim} +BuildRequires: emacs +%endif +%if %{with_java} +BuildRequires: jpackage-utils java-devel +%endif +%if %{with_virthost} +BuildRequires: libvirt-devel >= 1.0.2 +BuildRequires: libxml2-devel +%endif +BuildRequires: readline-devel +%if 0%{?rhel} <= 5 +BuildRequires: ncurses-devel +%endif + +Patch10: rhbz1242368.patch +Patch11: rhbz1346112.patch +Patch12: rhbz1269062.patch +Patch13: rhbz1337416.patch +Patch14: rhbz1365550.patch +Patch15: rhbz1312169.patch +Patch16: rhbz1376515.patch +Patch17: rhbz1378462.patch + +# Install requirements +Requires: %{?scl_prefix}systemtap-client = %{version}-%{release} +Requires: %{?scl_prefix}systemtap-devel = %{version}-%{release} + +%description +SystemTap is an instrumentation system for systems running Linux. +Developers can write instrumentation scripts to collect data on +the operation of the system. The base systemtap package contains/requires +the components needed to locally develop and execute systemtap scripts. + +# ------------------------------------------------------------------------ + +%package server +Summary: Instrumentation System Server +Group: Development/System +License: GPLv2+ +URL: http://sourceware.org/systemtap/ +Requires: %{?scl_prefix}systemtap-devel = %{version}-%{release} +# On RHEL[45], /bin/mktemp comes from the 'mktemp' package. On newer +# distributions, /bin/mktemp comes from the 'coreutils' package. To +# avoid a specific RHEL[45] Requires, we'll do a file-based require. +Requires: nss /bin/mktemp +Requires: zip unzip +Requires(pre): shadow-utils +Requires(post): chkconfig +Requires(preun): chkconfig +Requires(preun): initscripts +Requires(postun): initscripts +BuildRequires: nss-devel avahi-devel +%if %{with_openssl} +Requires: openssl +%endif + +%description server +This is the remote script compilation server component of systemtap. +It announces itself to nearby clients with avahi (if available), and +compiles systemtap scripts to kernel objects on their demand. + + +%package devel +Summary: Programmable system-wide instrumentation system - development headers, tools +Group: Development/System +License: GPLv2+ +URL: http://sourceware.org/systemtap/ +# Alternate kernel packages kernel-PAE-devel et al. have a virtual +# provide for kernel-devel, so this requirement does the right thing, +# at least past RHEL4. +Requires: kernel-devel +Requires: gcc make +# Suggest: kernel-debuginfo + +%description devel +This package contains the components needed to compile a systemtap +script from source form into executable (.ko) forms. It may be +installed on a self-contained developer workstation (along with the +systemtap-client and systemtap-runtime packages), or on a dedicated +remote server (alongside the systemtap-server package). It includes +a copy of the standard tapset library and the runtime library C files. + + +%package runtime +Summary: Programmable system-wide instrumentation system - runtime +Group: Development/System +License: GPLv2+ +URL: http://sourceware.org/systemtap/ +Requires(pre): shadow-utils + +%description runtime +SystemTap runtime contains the components needed to execute +a systemtap script that was already compiled into a module +using a local or remote systemtap-devel installation. + + +%package client +Summary: Programmable system-wide instrumentation system - client +Group: Development/System +License: GPLv2+ +URL: http://sourceware.org/systemtap/ +Requires: zip unzip +Requires: %{?scl_prefix}systemtap-runtime = %{version}-%{release} +Requires: coreutils grep sed unzip zip +Requires: openssh-clients +%if %{with_mokutil} +Requires: mokutil +%endif + +%description client +This package contains/requires the components needed to develop +systemtap scripts, and compile them using a local systemtap-devel +or a remote systemtap-server installation, then run them using a +local or remote systemtap-runtime. It includes script samples and +documentation, and a copy of the tapset library for reference. + + +%package initscript +Summary: Systemtap Initscripts +Group: Development/System +License: GPLv2+ +URL: http://sourceware.org/systemtap/ +Requires: %{?scl_prefix}systemtap = %{version}-%{release} +Requires(post): chkconfig +Requires(preun): chkconfig +Requires(preun): initscripts +Requires(postun): initscripts + +%description initscript +This package includes a SysVinit script to launch selected systemtap +scripts at system startup, along with a dracut module for early +boot-time probing if supported. + + +%package sdt-devel +Summary: Static probe support tools +Group: Development/System +License: GPLv2+ and Public Domain +URL: http://sourceware.org/systemtap/ +%if %{with_pyparsing} +%if %{with_python3} +Requires: python3-pyparsing +%else +Requires: pyparsing +%endif +%endif + +%description sdt-devel +This package includes the header file used for static +instrumentation compiled into userspace programs and libraries, along +with the optional dtrace-compatibility preprocessor to process related +.d files into tracing-macro-laden .h headers. + + +%package testsuite +Summary: Instrumentation System Testsuite +Group: Development/System +License: GPLv2+ +URL: http://sourceware.org/systemtap/ +Requires: %{?scl_prefix}systemtap = %{version}-%{release} +Requires: %{?scl_prefix}systemtap-sdt-devel = %{version}-%{release} +Requires: %{?scl_prefix}systemtap-server = %{version}-%{release} +Requires: %{?scl_prefix}elfutils +Requires: dejagnu which grep nc +Requires: gcc gcc-c++ make glibc-devel +# testsuite/systemtap.base/ptrace.exp needs strace +Requires: strace +# testsuite/systemtap.base/ipaddr.exp needs nc. Unfortunately, the rpm +# that provides nc has changed over time (from 'nc' to +# 'nmap-ncat'). So, we'll do a file-based require. +Requires: /usr/bin/nc +%ifnarch ia64 ppc64le aarch64 +%if 0%{?fedora} >= 21 || 0%{?rhel} >= 8 +# no prelink +%else +Requires: prelink +%endif +%endif +# testsuite/systemtap.server/client.exp needs avahi +Requires: avahi +%if %{with_crash} +# testsuite/systemtap.base/crash.exp needs crash +Requires: crash +%endif +%if %{with_java} +Requires: systemtap-runtime-java = %{version}-%{release} +%endif +%ifarch x86_64 +Requires: /usr/lib/libc.so +# ... and /usr/lib/libgcc_s.so.* +# ... and /usr/lib/libstdc++.so.* +%endif +%if 0%{?fedora} >= 18 +Requires: stress +%endif +# The following "meta" files for the systemtap examples run "perf": +# testsuite/systemtap.examples/hw_watch_addr.meta +# testsuite/systemtap.examples/memory/hw_watch_sym.meta +Requires: perf + +%description testsuite +This package includes the dejagnu-based systemtap stress self-testing +suite. This may be used by system administrators to thoroughly check +systemtap on the current system. + +%if %{with_java} +%package runtime-java +Summary: Systemtap Java Runtime Support +Group: Development/System +License: GPLv2+ +URL: http://sourceware.org/systemtap/ +Requires: systemtap-runtime = %{version}-%{release} +Requires: byteman > 2.0 +Requires: net-tools + +%description runtime-java +This package includes support files needed to run systemtap scripts +that probe Java processes running on the OpenJDK 1.6 and OpenJDK 1.7 +runtimes using Byteman. +%endif + +%if %{with_virthost} +%package runtime-virthost +Summary: Systemtap Cross-VM Instrumentation - host +Group: Development/System +License: GPLv2+ +URL: http://sourceware.org/systemtap/ +Requires: libvirt >= 1.0.2 +Requires: libxml2 + +%description runtime-virthost +This package includes the components required to run systemtap scripts +inside a libvirt-managed domain from the host without using a network +connection. +%endif + +%if %{with_virtguest} +%package runtime-virtguest +Summary: Systemtap Cross-VM Instrumentation - guest +Group: Development/System +License: GPLv2+ +URL: http://sourceware.org/systemtap/ +Requires: systemtap-runtime = %{version}-%{release} +%if %{with_systemd} +Requires(post): findutils coreutils +Requires(preun): grep coreutils +Requires(postun): grep coreutils +%else +Requires(post): chkconfig initscripts +Requires(preun): chkconfig initscripts +Requires(postun): initscripts +%endif + +%description runtime-virtguest +This package installs the services necessary on a virtual machine for a +systemtap-runtime-virthost machine to execute systemtap scripts. +%endif + +# ------------------------------------------------------------------------ + +%prep +%setup -q -n systemtap-%{version} %{?setup_elfutils} + +%if %{with_bundled_elfutils} +cd elfutils-%{elfutils_version} +%patch1 -p2 + +sleep 1 +find . \( -name Makefile.in -o -name aclocal.m4 \) -print | xargs touch +sleep 1 +find . \( -name configure -o -name config.h.in \) -print | xargs touch +cd .. +%endif + +%patch10 -p1 +%patch11 -p1 +%patch12 -p1 +%patch13 -p1 +%patch14 -p1 +%patch15 -p1 +%patch16 -p1 +%patch17 -p1 + +%build + +%if %{with_bundled_elfutils} +# Build our own copy of elfutils. +%global elfutils_config --with-elfutils=elfutils-%{elfutils_version} + +# We have to prevent the standard dependency generation from identifying +# our private elfutils libraries in our provides and requires. +%global _use_internal_dependency_generator 0 +%global filter_eulibs() /bin/sh -c "%{1} | sed '/libelf/d;/libdw/d;/libebl/d'" +%global __find_provides %{filter_eulibs /usr/lib/rpm/find-provides} +%global __find_requires %{filter_eulibs /usr/lib/rpm/find-requires} + +# This will be needed for running stap when not installed, for the test suite. +%global elfutils_mflags LD_LIBRARY_PATH=`pwd`/lib-elfutils +%endif + +# Enable/disable the dyninst pure-userspace backend +%if %{with_dyninst} +%global dyninst_config --with-dyninst +%else +%global dyninst_config --without-dyninst +%endif + +# Enable/disable the sqlite coverage testing support +%if %{with_sqlite} +%global sqlite_config --enable-sqlite +%else +%global sqlite_config --disable-sqlite +%endif + +# Enable/disable the crash extension +%if %{with_crash} +%global crash_config --enable-crash +%else +%global crash_config --disable-crash +%endif + +# Enable/disable the code to find and suggest needed rpms +%if %{with_rpm} +%global rpm_config --with-rpm +%else +%global rpm_config --without-rpm +%endif + +%if %{with_docs} +%if %{with_htmldocs} +%global docs_config --enable-docs --enable-htmldocs +%else +%global docs_config --enable-docs --disable-htmldocs +%endif +%else +%global docs_config --disable-docs +%endif + +# Enable pie as configure defaults to disabling it +%if %{pie_supported} +%global pie_config --enable-pie +%else +%global pie_config --disable-pie +%endif + + +%if %{with_java} +%global java_config --with-java=%{_jvmdir}/java +%else +%global java_config --without-java +%endif + +%if %{with_virthost} +%global virt_config --enable-virt +%else +%global virt_config --disable-virt +%endif + +#CPPFLAGS="-I%{_includedir}/dyninst %{optflags}" +CPPFLAGS="-I%{_includedir} -I%{_includedir}/dyninst %{optflags}" +export CPPFLAGS +CXXFLAGS="-std=c++11" +export CXXFLAGS +#LDFLAGS="-L%{_libdir}/dyninst" +LDFLAGS="-L%{_libdir} -L%{_libdir}/dyninst -L%{_libdir}/elfutils" +export LDFLAGS + +%if %{with_virthost} +%global virt_config --enable-virt +%else +%global virt_config --disable-virt +%endif + +%if %{with_dracut} +%global dracut_config --with-dracutstap=%{dracutstap} +%else +%global dracut_config +%endif + +%if %{with_python3} +%global python3_config --with-python3 +%else +%global python3_config --without-python3 +%endif +# We don't ship compileworthy python code, just oddball samples +%global py_auto_byte_compile 0 + +%configure %{?elfutils_config} %{dyninst_config} %{sqlite_config} %{crash_config} %{docs_config} %{pie_config} %{rpm_config} %{java_config} %{virt_config} %{dracut_config} %{python3_config} --disable-silent-rules --with-extra-version="rpm %{version}-%{release}" have_fop=no +make %{?_smp_mflags} + +%if %{with_emacsvim} +%{_emacs_bytecompile} emacs/systemtap-mode.el +%endif + +%install +rm -rf ${RPM_BUILD_ROOT} +make DESTDIR=$RPM_BUILD_ROOT install +%find_lang systemtap +for dir in $(ls -1d $RPM_BUILD_ROOT%{_mandir}/{??,??_??}) ; do + dir=$(echo $dir | sed -e "s|^$RPM_BUILD_ROOT||") + lang=$(basename $dir) + echo "%%lang($lang) $dir/man*/*" >> systemtap.lang +done + +# We want the examples in the special doc dir, not the build install dir. +# We build it in place and then move it away so it doesn't get installed +# twice. rpm can specify itself where the (versioned) docs go with the +# %doc directive. +mv $RPM_BUILD_ROOT%{_datadir}/doc/systemtap/examples examples + +# Fix paths in the example scripts. +find examples -type f -name '*.stp' -print0 | xargs -0 sed -i -r -e '1s@^#!.+stap@#!%{_bindir}/stap@' + +# To make rpmlint happy, remove any .gitignore files in the testsuite. +find testsuite -type f -name '.gitignore' -print0 | xargs -0 rm -f + +# Because "make install" may install staprun with whatever mode, the +# post-processing programs rpmbuild runs won't be able to read it. +# So, we change permissions so that they can read it. We'll set the +# permissions back to 04110 in the %files section below. +chmod 755 $RPM_BUILD_ROOT%{_bindir}/staprun + +#install the useful stap-prep script +install -c -m 755 stap-prep $RPM_BUILD_ROOT%{_bindir}/stap-prep + +# Copy over the testsuite +cp -rp testsuite $RPM_BUILD_ROOT%{_datadir}/systemtap + +%if %{with_docs} +# We want the manuals in the special doc dir, not the generic doc install dir. +# We build it in place and then move it away so it doesn't get installed +# twice. rpm can specify itself where the (versioned) docs go with the +# %doc directive. +mkdir docs.installed +mv $RPM_BUILD_ROOT%{_datadir}/doc/systemtap/*.pdf docs.installed/ +%if %{with_htmldocs} +mv $RPM_BUILD_ROOT%{_datadir}/doc/systemtap/tapsets docs.installed/ +mv $RPM_BUILD_ROOT%{_datadir}/doc/systemtap/SystemTap_Beginners_Guide docs.installed/ +%endif +%endif +mkdir -p $RPM_BUILD_ROOT%{_sysconfdir}/stap-server +mkdir -p $RPM_BUILD_ROOT%{_localstatedir}/lib/stap-server +mkdir -p $RPM_BUILD_ROOT%{_localstatedir}/lib/stap-server/.systemtap +mkdir -p $RPM_BUILD_ROOT%{_localstatedir}/log/stap-server +touch $RPM_BUILD_ROOT%{_localstatedir}/log/stap-server/log +mkdir -p $RPM_BUILD_ROOT%{_localstatedir}/cache/systemtap +mkdir -p $RPM_BUILD_ROOT%{_localstatedir}/run/systemtap +mkdir -p $RPM_BUILD_ROOT%{_sysconfdir}/logrotate.d +install -m 644 initscript/logrotate.stap-server $RPM_BUILD_ROOT%{_sysconfdir}/logrotate.d/stap-server +mkdir -p $RPM_BUILD_ROOT%{sysconfdir}/rc.d/init.d/ +install -m 755 initscript/systemtap $RPM_BUILD_ROOT%{sysconfdir}/rc.d/init.d/%{?scl_prefix}systemtap +install -m 755 initscript/stap-server $RPM_BUILD_ROOT%{sysconfdir}/rc.d/init.d/%{?scl_prefix}stap-server +mkdir -p $RPM_BUILD_ROOT%{_sysconfdir}/systemtap +mkdir -p $RPM_BUILD_ROOT%{_sysconfdir}/systemtap/conf.d +mkdir -p $RPM_BUILD_ROOT%{_sysconfdir}/systemtap/script.d +install -m 644 initscript/config.systemtap $RPM_BUILD_ROOT%{_sysconfdir}/systemtap/config + +%if %{with_systemd} +mkdir -p $RPM_BUILD_ROOT%{_unitdir} +touch $RPM_BUILD_ROOT%{_unitdir}/%{?scl_prefix}stap-server.service +install -m 644 stap-server.service $RPM_BUILD_ROOT%{_unitdir}/%{?scl_prefix}stap-server.service +mkdir -p $RPM_BUILD_ROOT%{_tmpfilesdir} +install -m 644 stap-server.conf $RPM_BUILD_ROOT%{_tmpfilesdir}/%{?scl_prefix}stap-server.conf +%else +install -m 755 initscript/stap-server $RPM_BUILD_ROOT%{initdir}/%{?scl_prefix}stap-server +mkdir -p $RPM_BUILD_ROOT%{_sysconfdir}/stap-server/conf.d +mkdir -p $RPM_BUILD_ROOT%{_sysconfdir}/sysconfig +install -m 644 initscript/config.stap-server $RPM_BUILD_ROOT%{_sysconfdir}/sysconfig/stap-server +%endif + +%if %{with_emacsvim} +mkdir -p $RPM_BUILD_ROOT%{_emacs_sitelispdir} +install -p -m 644 emacs/systemtap-mode.el* $RPM_BUILD_ROOT%{_emacs_sitelispdir} +mkdir -p $RPM_BUILD_ROOT%{_emacs_sitestartdir} +install -p -m 644 emacs/systemtap-init.el $RPM_BUILD_ROOT%{_emacs_sitestartdir}/systemtap-init.el +for subdir in ftdetect ftplugin indent syntax +do + mkdir -p $RPM_BUILD_ROOT%{_datadir}/vim/vimfiles/$subdir + install -p -m 644 vim/$subdir/*.vim $RPM_BUILD_ROOT%{_datadir}/vim/vimfiles/$subdir +done +%endif + +%if %{with_virtguest} + mkdir -p $RPM_BUILD_ROOT%{udevrulesdir} + %if %{with_systemd} + install -p -m 644 staprun/guest/99-stapsh.rules $RPM_BUILD_ROOT%{udevrulesdir} + mkdir -p $RPM_BUILD_ROOT%{_unitdir} + install -p -m 644 staprun/guest/stapsh@.service $RPM_BUILD_ROOT%{_unitdir} + %else + install -p -m 644 staprun/guest/99-stapsh-init.rules $RPM_BUILD_ROOT%{udevrulesdir} + install -p -m 755 staprun/guest/stapshd $RPM_BUILD_ROOT%{initdir} + mkdir -p $RPM_BUILD_ROOT%{_libexecdir}/systemtap + install -p -m 755 staprun/guest/stapsh-daemon $RPM_BUILD_ROOT%{_libexecdir}/systemtap + mkdir -p $RPM_BUILD_ROOT%{_sysconfdir}/sysconfig/modules + # Technically, this is only needed for RHEL5, in which the MODULE_ALIAS is missing, but + # it does no harm in RHEL6 as well + install -p -m 755 staprun/guest/virtio_console.modules $RPM_BUILD_ROOT%{_sysconfdir}/sysconfig/modules + %endif +%endif + +%if %{with_dracut} + mkdir -p $RPM_BUILD_ROOT%{dracutstap} + install -p -m 755 initscript/99stap/module-setup.sh $RPM_BUILD_ROOT%{dracutstap} + install -p -m 755 initscript/99stap/start-staprun.sh $RPM_BUILD_ROOT%{dracutstap} + touch $RPM_BUILD_ROOT%{dracutstap}/params.conf +%endif + +%clean +rm -rf ${RPM_BUILD_ROOT} + +%pre runtime +getent group stapusr >/dev/null || groupadd -g 156 -r stapusr 2>/dev/null || groupadd -r stapusr +getent group stapsys >/dev/null || groupadd -g 157 -r stapsys 2>/dev/null || groupadd -r stapsys +getent group stapdev >/dev/null || groupadd -g 158 -r stapdev 2>/dev/null || groupadd -r stapdev +exit 0 + +%pre server +getent group stap-server >/dev/null || groupadd -g 155 -r stap-server 2>/dev/null || groupadd -r stap-server +getent passwd stap-server >/dev/null || \ + useradd -c "Systemtap Compile Server" -u 155 -g stap-server -d %{_localstatedir}/lib/stap-server -r -s /sbin/nologin stap-server 2>/dev/null || \ + useradd -c "Systemtap Compile Server" -g stap-server -d %{_localstatedir}/lib/stap-server -r -s /sbin/nologin stap-server + +%post server + +# We have some duplication between the %files listings for the +# ~stap-server directories and the explicit mkdir/chown/chmod bits +# here. Part of the reason may be that a preexisting stap-server +# account may well be placed somewhere other than +# %{_localstatedir}/lib/stap-server, but we'd like their permissions +# set similarly. + +test -e ~stap-server && chmod 750 ~stap-server + +if [ ! -f ~stap-server/.systemtap/rc ]; then + mkdir -p ~stap-server/.systemtap + chown stap-server:stap-server ~stap-server/.systemtap + # PR16276: guess at a reasonable number for a default --rlimit-nproc + numcpu=`/usr/bin/getconf _NPROCESSORS_ONLN` + if [ -z "$numcpu" -o "$numcpu" -lt 1 ]; then numcpu=1; fi + nproc=`expr $numcpu \* 30` + echo "--rlimit-as=614400000 --rlimit-cpu=60 --rlimit-nproc=$nproc --rlimit-stack=1024000 --rlimit-fsize=51200000" > ~stap-server/.systemtap/rc + chown stap-server:stap-server ~stap-server/.systemtap/rc +fi + +test -e %{_localstatedir}/log/stap-server/log || { + touch %{_localstatedir}/log/stap-server/log + chmod 644 %{_localstatedir}/log/stap-server/log + chown stap-server:stap-server %{_localstatedir}/log/stap-server/log +} +# Prepare the service +%if %{with_systemd} + # Note, Fedora policy doesn't allow network services enabled by default + # /bin/systemctl enable stap-server.service >/dev/null 2>&1 || : + /bin/systemd-tmpfiles --create %{_tmpfilesdir}/stap-server.conf >/dev/null 2>&1 || : +%else + /sbin/chkconfig --add %{?scl_prefix}stap-server +%endif +exit 0 + +%triggerin client -- systemtap-server +if test -e ~stap-server/.systemtap/ssl/server/stap.cert; then + # echo Authorizing ssl-peer/trusted-signer certificate for local systemtap-server + %{_libexecdir}/systemtap/stap-authorize-cert ~stap-server/.systemtap/ssl/server/stap.cert %{_sysconfdir}/systemtap/ssl/client >/dev/null + %{_libexecdir}/systemtap/stap-authorize-cert ~stap-server/.systemtap/ssl/server/stap.cert %{_sysconfdir}/systemtap/staprun >/dev/null +fi +exit 0 +# XXX: corresponding %triggerun? + +%preun server +# Check that this is the actual deinstallation of the package, as opposed to +# just removing the old package on upgrade. +if [ $1 = 0 ] ; then + %if %{with_systemd} + /bin/systemctl --no-reload disable stap-server.service >/dev/null 2>&1 || : + /bin/systemctl stop stap-server.service >/dev/null 2>&1 || : + %else + /sbin/service %{?scl_prefix}stap-server stop >/dev/null 2>&1 + /sbin/chkconfig --del %{?scl_prefix}stap-server + %endif +fi +exit 0 + +%postun server +# Check whether this is an upgrade of the package. +# If so, restart the service if it's running +if [ "$1" -ge "1" ] ; then + %if %{with_systemd} + /bin/systemctl condrestart stap-server.service >/dev/null 2>&1 || : + %else + /sbin/service %{?scl_prefix}stap-server condrestart >/dev/null 2>&1 || : + %endif +fi +exit 0 + +%post initscript +%if %{with_systemd} + /bin/systemctl enable systemtap.service >/dev/null 2>&1 || : +%else + /sbin/chkconfig --add %{?scl_prefix}systemtap +%endif +exit 0 + +%preun initscript +# Check that this is the actual deinstallation of the package, as opposed to +# just removing the old package on upgrade. +if [ $1 = 0 ] ; then + %if %{with_systemd} + /bin/systemctl --no-reload disable systemtap.service >/dev/null 2>&1 || : + /bin/systemctl stop systemtap.service >/dev/null 2>&1 || : + %else + /sbin/service %{?scl_prefix}systemtap stop >/dev/null 2>&1 + /sbin/chkconfig --del %{?scl_prefix}systemtap + %endif +fi +exit 0 + +%postun initscript +# Check whether this is an upgrade of the package. +# If so, restart the service if it's running +if [ "$1" -ge "1" ] ; then + %if %{with_systemd} + /bin/systemctl condrestart systemtap.service >/dev/null 2>&1 || : + %else + /sbin/service %{?scl_prefix}systemtap condrestart >/dev/null 2>&1 || : + %endif +fi +exit 0 + +%if %{with_virtguest} +%post runtime-virtguest +%if %{with_systemd} + # Start services if there are ports present + if [ -d /dev/virtio-ports ]; then + (find /dev/virtio-ports -iname 'org.systemtap.stapsh.[0-9]*' -type l \ + | xargs -n 1 basename \ + | xargs -n 1 -I {} /bin/systemctl start stapsh@{}.service) >/dev/null 2>&1 || : + fi +%else + /sbin/chkconfig --add stapshd + /sbin/chkconfig stapshd on + /sbin/service stapshd start >/dev/null 2>&1 || : +%endif +exit 0 + +%preun runtime-virtguest +# Stop service if this is an uninstall rather than an upgrade +if [ $1 = 0 ]; then + %if %{with_systemd} + # We need to stop all stapsh services. Because they are instantiated from + # a template service file, we can't simply call disable. We need to find + # all the running ones and stop them all individually + for service in `/bin/systemctl --full | grep stapsh@ | cut -d ' ' -f 1`; do + /bin/systemctl stop $service >/dev/null 2>&1 || : + done + %else + /sbin/service stapshd stop >/dev/null 2>&1 + /sbin/chkconfig --del stapshd + %endif +fi +exit 0 + +%postun runtime-virtguest +# Restart service if this is an upgrade rather than an uninstall +if [ "$1" -ge "1" ]; then + %if %{with_systemd} + # We need to restart all stapsh services. Because they are instantiated from + # a template service file, we can't simply call restart. We need to find + # all the running ones and restart them all individually + for service in `/bin/systemctl --full | grep stapsh@ | cut -d ' ' -f 1`; do + /bin/systemctl condrestart $service >/dev/null 2>&1 || : + done + %else + /sbin/service stapshd condrestart >/dev/null 2>&1 + %endif +fi +exit 0 +%endif + +%post +# Remove any previously-built uprobes.ko materials +(make -C %{_datadir}/systemtap/runtime/uprobes clean) >/dev/null 2>&1 || true +(/sbin/rmmod uprobes) >/dev/null 2>&1 || true + +%preun +# Ditto +(make -C %{_datadir}/systemtap/runtime/uprobes clean) >/dev/null 2>&1 || true +(/sbin/rmmod uprobes) >/dev/null 2>&1 || true + +# ------------------------------------------------------------------------ + +%if %{with_java} + +%triggerin runtime-java -- java-1.8.0-openjdk, java-1.7.0-openjdk, java-1.6.0-openjdk +for f in %{_libexecdir}/systemtap/libHelperSDT_*.so; do + %ifarch %{ix86} + arch=i386 + %else + arch=`basename $f | cut -f2 -d_ | cut -f1 -d.` + %endif + for archdir in %{_jvmdir}/*openjdk*/jre/lib/${arch}; do + if [ -d ${archdir} ]; then + ln -sf %{_libexecdir}/systemtap/libHelperSDT_${arch}.so ${archdir}/libHelperSDT_${arch}.so + ln -sf %{_libexecdir}/systemtap/HelperSDT.jar ${archdir}/../ext/HelperSDT.jar + fi + done +done + +%triggerun runtime-java -- java-1.8.0-openjdk, java-1.7.0-openjdk, java-1.6.0-openjdk +for f in %{_libexecdir}/systemtap/libHelperSDT_*.so; do + %ifarch %{ix86} + arch=i386 + %else + arch=`basename $f | cut -f2 -d_ | cut -f1 -d.` + %endif + for archdir in %{_jvmdir}/*openjdk*/jre/lib/${arch}; do + rm -f ${archdir}/libHelperSDT_${arch}.so + rm -f ${archdir}/../ext/HelperSDT.jar + done +done + +%triggerpostun runtime-java -- java-1.8.0-openjdk, java-1.7.0-openjdk, java-1.6.0-openjdk +# Restore links for any JDKs remaining after a package removal: +for f in %{_libexecdir}/systemtap/libHelperSDT_*.so; do + %ifarch %{ix86} + arch=i386 + %else + arch=`basename $f | cut -f2 -d_ | cut -f1 -d.` + %endif + for archdir in %{_jvmdir}/*openjdk*/jre/lib/${arch}; do + if [ -d ${archdir} ]; then + ln -sf %{_libexecdir}/systemtap/libHelperSDT_${arch}.so ${archdir}/libHelperSDT_${arch}.so + ln -sf %{_libexecdir}/systemtap/HelperSDT.jar ${archdir}/../ext/HelperSDT.jar + fi + done +done + +# XXX: analogous support for other types of JRE/JDK?? + +%endif + +# ------------------------------------------------------------------------ + +%files -f systemtap.lang +# The master "systemtap" rpm doesn't include any files. + +%files server -f systemtap.lang +%defattr(-,root,root) +%{_bindir}/stap-server +%dir %{_libexecdir}/systemtap +%{_libexecdir}/systemtap/stap-serverd +%{_libexecdir}/systemtap/stap-start-server +%{_libexecdir}/systemtap/stap-stop-server +%{_libexecdir}/systemtap/stap-gen-cert +%{_libexecdir}/systemtap/stap-sign-module +%{_libexecdir}/systemtap/stap-authorize-cert +%{_libexecdir}/systemtap/stap-env +%{_mandir}/man7/error* +%{_mandir}/man7/stappaths.7* +%{_mandir}/man7/warning* +%{_mandir}/man8/stap-server.8* +%if %{with_systemd} +%{_unitdir}/stap-server.service +%{_tmpfilesdir}/stap-server.conf +%else +%{initdir}/%{?scl_prefix}stap-server +%dir %{_sysconfdir}/stap-server/conf.d +%config(noreplace) %{_sysconfdir}/sysconfig/stap-server +%endif +%config(noreplace) %{_sysconfdir}/logrotate.d/stap-server +%dir %{_sysconfdir}/stap-server +%dir %attr(0750,stap-server,stap-server) %{_localstatedir}/lib/stap-server +%dir %attr(0700,stap-server,stap-server) %{_localstatedir}/lib/stap-server/.systemtap +%dir %attr(0755,stap-server,stap-server) %{_localstatedir}/log/stap-server +%ghost %config(noreplace) %attr(0644,stap-server,stap-server) %{_localstatedir}/log/stap-server/log +%ghost %attr(0755,stap-server,stap-server) %{_localstatedir}/run/stap-server +%doc README README.unprivileged AUTHORS NEWS +%{!?_licensedir:%global license %%doc} +%license COPYING + + +%files devel -f systemtap.lang +%{_bindir}/stap +%{_bindir}/stap-prep +%{_bindir}/stap-report +%dir %{_datadir}/systemtap +%{_datadir}/systemtap/runtime +%{_datadir}/systemtap/tapset +%{_mandir}/man1/stap.1* +%{_mandir}/man1/stap-prep.1* +%{_mandir}/man1/stap-report.1* +%{_mandir}/man7/error* +%{_mandir}/man7/stappaths.7* +%{_mandir}/man7/warning* +%doc README README.unprivileged AUTHORS NEWS +%{!?_licensedir:%global license %%doc} +%license COPYING +%if %{with_java} +%dir %{_libexecdir}/systemtap +%{_libexecdir}/systemtap/libHelperSDT_*.so +%endif +%if %{with_bundled_elfutils} +%dir %{_libdir}/systemtap +%{_libdir}/systemtap/lib*.so* +%endif +%if %{with_emacsvim} +%{_emacs_sitelispdir}/*.el* +%{_emacs_sitestartdir}/systemtap-init.el +%{_datadir}/vim/vimfiles/*/*.vim +%endif + + +%files runtime -f systemtap.lang +%defattr(-,root,root) +%attr(4110,root,stapusr) %{_bindir}/staprun +%{_bindir}/stapsh +%{_bindir}/stap-merge +%{_bindir}/stap-report +%if %{with_dyninst} +%{_bindir}/stapdyn +%endif +%dir %{_libexecdir}/systemtap +%{_libexecdir}/systemtap/stapio +%{_libexecdir}/systemtap/stap-authorize-cert +%if %{with_crash} +%dir %{_libdir}/systemtap +%{_libdir}/systemtap/staplog.so* +%endif +%{_mandir}/man1/stap-report.1* +%{_mandir}/man7/error* +%{_mandir}/man7/stappaths.7* +%{_mandir}/man7/warning* +%{_mandir}/man8/stapsh.8* +%{_mandir}/man8/staprun.8* +%if %{with_dyninst} +%{_mandir}/man8/stapdyn.8* +%endif +%doc README README.security AUTHORS NEWS +%{!?_licensedir:%global license %%doc} +%license COPYING + + +%files client -f systemtap.lang +%defattr(-,root,root) +%doc README README.unprivileged AUTHORS NEWS examples +%{!?_licensedir:%global license %%doc} +%license COPYING +%if %{with_docs} +%doc docs.installed/*.pdf +%if %{with_htmldocs} +%doc docs.installed/tapsets/*.html +%doc docs.installed/SystemTap_Beginners_Guide +%endif +%endif +%{_bindir}/stap +%{_bindir}/stap-prep +%{_bindir}/stap-report +%{_mandir}/man1/stap.1* +%{_mandir}/man1/stap-prep.1* +%{_mandir}/man1/stap-merge.1* +%{_mandir}/man1/stap-report.1* +%{_mandir}/man1/stapref.1* +%{_mandir}/man3/* +%{_mandir}/man7/error* +%{_mandir}/man7/stappaths.7* +%{_mandir}/man7/warning* +%dir %{_datadir}/systemtap +%{_datadir}/systemtap/tapset + + + +%files initscript +%defattr(-,root,root) +%{sysconfdir}/rc.d/init.d/%{?scl_prefix}systemtap +%dir %{_sysconfdir}/systemtap +%dir %{_sysconfdir}/systemtap/conf.d +%dir %{_sysconfdir}/systemtap/script.d +%config(noreplace) %{_sysconfdir}/systemtap/config +%dir %{_localstatedir}/cache/systemtap +%ghost %{_localstatedir}/run/systemtap +%{_mandir}/man8/systemtap.8* +%if %{with_dracut} + %dir %{dracutstap} + %{dracutstap}/* +%endif + + +%files sdt-devel -f systemtap.lang +%defattr(-,root,root) +%{_bindir}/dtrace +%{_includedir}/sys/sdt.h +%{_includedir}/sys/sdt-config.h +%{_mandir}/man1/dtrace.1* +%doc README AUTHORS NEWS +%{!?_licensedir:%global license %%doc} +%license COPYING + + +%files testsuite +%defattr(-,root,root) +%dir %{_datadir}/systemtap +%{_datadir}/systemtap/testsuite + + +%if %{with_java} +%files runtime-java +%dir %{_libexecdir}/systemtap +%{_libexecdir}/systemtap/libHelperSDT_*.so +%{_libexecdir}/systemtap/HelperSDT.jar +%{_libexecdir}/systemtap/stapbm +%endif + +%if %{with_virthost} +%files runtime-virthost +%{_mandir}/man1/stapvirt.1* +%{_bindir}/stapvirt +%endif + +%if %{with_virtguest} +%files runtime-virtguest +%if %{with_systemd} + %{udevrulesdir}/99-stapsh.rules + %{_unitdir}/stapsh@.service +%else + %{udevrulesdir}/99-stapsh-init.rules + %dir %{_libexecdir}/systemtap + %{_libexecdir}/systemtap/stapsh-daemon + %{initdir}/stapshd + %{_sysconfdir}/sysconfig/modules/virtio_console.modules +%endif +%endif + +# ------------------------------------------------------------------------ + +# Future new-release entries should be of the form +# * DDD MMM DD YYYY YOURNAME - V-R +# - Upstream release, see wiki page below for detailed notes. +# http://sourceware.org/systemtap/wiki/SystemTapReleases + +%changelog +* Thu Sep 22 2016 Frank Ch. Eigler - 3.0-8s +- rhbz1378462 stap-server tls cert creation + +* Mon Sep 19 2016 Frank Ch. Eigler - 3.0-7s +- rhbz1376515 ppc64le probe point / parameter value fix + +* Wed Aug 24 2016 Frank Ch. Eigler - 3.0-6 +- rhbz1346112 delay tls cert creation redux + +* Thu Aug 11 2016 Frank Ch. Eigler - 3.0-5 +- rhbz1312169 stap-prep debuginfo-install improvement + +* Tue Aug 09 2016 Frank Ch. Eigler - 3.0-4s +- rhbz1365550 PR19874 alarm(60) in staprun system() + +* Thu Jul 21 2016 Frank Ch. Eigler - 3.0-3s +- rhbz1346112 delay tls cert creation +- rhbz1269062 null elevator +- rhbz1337416 'count' tapset variable - autocast/@defined + +* Wed May 04 2016 Frank Ch. Eigler - 3.0-2 +- 4 upstream patches for kernel lockdep hygiene, bz1242368 + +* Tue May 03 2016 Frank Ch. Eigler - 3.0-1 +- Upstream release. + +* Fri Apr 01 2016 Frank Ch. Eigler - 2.9-3s +- buildroot bump + +* Thu Feb 25 2016 Frank Ch. Eigler - 2.9-2s +- buildroot bump + +* Fri Jan 29 2016 Josh Stone - 2.9-1s +- rebase to upstream 2.9 + +* Tue Jul 7 2015 Frank Ch. Eigler - 2.8-4 +- rhbz1224363 (rebase to upstream 2.8+) + +* Wed Mar 25 2015 Frank Ch. Eigler - 2.6-11 +- rhbz1121363 (dracut support) + +* Fri Feb 13 2015 Frank Ch. Eigler - 2.6-10 +- rhbz1172781 (nfs3_proc_read_setup tapset) +- rhbz1128209 (uninstalled stapvirt files found) + +* Fri Jan 09 2015 Frank Ch. Eigler - 2.6-9 +- dts3.1 merge from rhel-7.1 +- remove bodies of with_java, with_virtguest, with_virthost conditionals + +* Wed Dec 10 2014 Frank Ch. Eigler - 2.6-8 +- rhbz1171823 (nfsd svc_fh access) + +* Wed Nov 26 2014 Frank Ch. Eigler - 2.6-7 +- rhbz1167652 (stap dracut empty) + +* Thu Nov 20 2014 Frank Ch. Eigler - 2.6-6 +- rhbz1164373 (fix ppc64 kprobes via KERNEL_RELOC_SYMBOL) +- rhbz1119335 (document STAP_FIPS_OVERRIDE in staprun.8) +- rhbz1127591 (ppc64 hcall_* tracepoint blacklisting) + +* Fri Oct 17 2014 Frank Ch. Eigler - 2.6-5 +- RHBZ1153673 (stap segv during optimization) + +* Fri Sep 19 2014 Frank Ch. Eigler - 2.6-3 +- Added probinson's patch BZ1141919 for enabling more ppc64/aarch64 facilities, + with some staplog.c followup + +* Tue Sep 09 2014 Josh Stone - 2.6-2 +- Backport fix for 1139844 + +* Fri Sep 05 2014 Josh Stone - 2.6-1 +- Upstream release, rebased for 1107735 + +* Wed Aug 27 2014 Josh Stone - 2.4-16 +- Exclude ppc64le from with_crash (1125693) + +* Tue Aug 26 2014 Josh Stone - 2.4-15 +- Tighten arch lists for prelink and dyninst (1094349, 1125693) + +* Fri Mar 28 2014 Jonathan Lebon - 2.4-14 +- Small fix on latest backport fix for dyninst runtime + +* Fri Mar 28 2014 Jonathan Lebon - 2.4-13 +- Backport fixes for 1051649 (see comments 4 and 5) + +* Thu Mar 06 2014 Jonathan Lebon - 2.4-12 +- Backport fix for 1073640 + +* Wed Feb 12 2014 Jonathan Lebon - 2.4-11 +- Backport fix for 847285 + +* Wed Feb 12 2014 Jonathan Lebon - 2.4-10 +- Apply spec file patches to this one, not the tarred one +- Add missing autoreconf patch for backport feature (1051649) + +* Tue Feb 11 2014 Jonathan Lebon - 2.4-9 +- Backport fixes for: 1062076, 1020207 + +* Tue Jan 28 2014 Daniel Mach - 2.4-8 +- Mass rebuild 2014-01-24 + +* Fri Jan 24 2014 Jonathan Lebon - 2.4-7 +- Backport fix for 1057773 + +* Wed Jan 22 2014 Frank Ch. Subbackportmeister Eigler - 2.4-6 +- Backport fixes for: 1056687 + +* Wed Jan 22 2014 Jonathan Lebon - 2.4-5 +- Backport fixes for: 1035752, 1035850 + +* Tue Jan 21 2014 Jonathan Lebon - 2.4-4 +- Backport fix for 1055778 + +* Fri Jan 17 2014 Jonathan Lebon - 2.4-3 +- Backport fixes for: 1054962, 1054956, 1054954, 1044429 +- Backport boot-time probing feature (1051649) + +* Fri Dec 27 2013 Daniel Mach - 2.4-2 +- Mass rebuild 2013-12-27 + +* Wed Nov 06 2013 Frank Ch. Eigler - 2.4-1 +- Upstream release. + +* Wed Oct 09 2013 Jonathan Lebon +- Added runtime-virthost and runtime-virtguest packages. + +* Thu Jul 25 2013 Frank Ch. Eigler - 2.3-1 +- Upstream release. + +* Thu May 16 2013 Frank Ch. Eigler - 2.2.1-1 +- Upstream release. + +* Tue May 14 2013 Frank Ch. Eigler - 2.2-1 +- Upstream release. + +* Wed Feb 13 2013 Serguei Makarov - 2.1-1 +- Upstream release. + +* Tue Oct 09 2012 Josh Stone - 2.0-1 +- Upstream release. + +* Tue Sep 11 2012 William Cohen - 1.8-7 +- rhbz847919 need scl-compatible init scripts +- Backported fixes: +- rhbz848459 "groupadd: GID 156 is not unique" while installing systemtap-runtime-1.8-4.el5 +- rhbz848460 sdt.c on systemtap-testsuite cannot be compiled +- rhbz848461 /usr/libexec/systemtap/stap-authorize-cert: No such file or directory + +* Wed Sep 5 2012 William Cohen - 1.8-6 +- Backport fix for rhbz853357. + +* Thu Jul 5 2012 William Cohen - 1.8-5 +- Make compatible with software collections. + +* Wed Jun 27 2012 Stan Cox - 1.8-4 +- Backported fix for pr14325 + +* Wed Jun 27 2012 Stan Cox - 1.8-3 +- No publican in rhel 5. + +* Wed Jun 27 2012 Stan Cox - 1.8-2 +- Add s390 to the publican blacklist. + +* Sun Jun 17 2012 Frank Ch. Eigler - 1.8-1 +- Upstream release. + +* Wed Feb 01 2012 Frank Ch. Eigler - 1.7-1 +- Upstream release. + +* Fri Jan 13 2012 David Smith - 1.6-2 +- Fixed /bin/mktemp require. + +* Mon Jul 25 2011 Stan Cox - 1.6-1 +- Upstream release. + +* Mon May 23 2011 Stan Cox - 1.5-1 +- Upstream release. + +* Mon Jan 17 2011 Frank Ch. Eigler - 1.4-1 +- Upstream release. + +* Wed Jul 21 2010 Josh Stone - 1.3-1 +- Upstream release. + +* Mon Mar 22 2010 Frank Ch. Eigler - 1.2-1 +- Upstream release. + +* Mon Dec 21 2009 David Smith - 1.1-1 +- Upstream release. + +* Tue Sep 22 2009 Josh Stone - 1.0-1 +- Upstream release. + +* Tue Aug 4 2009 Josh Stone - 0.9.9-1 +- Upstream release. + +* Thu Jun 11 2009 Josh Stone - 0.9.8-1 +- Upstream release. + +* Thu Apr 23 2009 Josh Stone - 0.9.7-1 +- Upstream release. + +* Fri Mar 27 2009 Josh Stone - 0.9.5-1 +- Upstream release. + +* Wed Mar 18 2009 Will Cohen - 0.9-2 +- Add location of man pages. + +* Tue Feb 17 2009 Frank Ch. Eigler - 0.9-1 +- Upstream release. + +* Thu Nov 13 2008 Frank Ch. Eigler - 0.8-1 +- Upstream release. + +* Tue Jul 15 2008 Frank Ch. Eigler - 0.7-1 +- Upstream release. + +* Fri Feb 1 2008 Frank Ch. Eigler - 0.6.1-3 +- Add zlib-devel to buildreq; missing from crash-devel +- Process testsuite .stp files for #!stap->#!/usr/bin/stap + +* Fri Jan 18 2008 Frank Ch. Eigler - 0.6.1-1 +- Add crash-devel buildreq to build staplog.so crash(8) module. +- Many robustness & functionality improvements: + +* Wed Dec 5 2007 Will Cohen - 0.6-2 +- Correct Source to point to location contain code. + +* Thu Aug 9 2007 David Smith - 0.6-1 +- Bumped version, added libcap-devel BuildRequires. + +* Wed Jul 11 2007 Will Cohen - 0.5.14-2 +- Fix Requires and BuildRequires for sqlite. + +* Mon Jul 2 2007 Frank Ch. Eigler - 0.5.14-1 +- Many robustness improvements: 1117, 1134, 1305, 1307, 1570, 1806, + 2033, 2116, 2224, 2339, 2341, 2406, 2426, 2438, 2583, 3037, + 3261, 3282, 3331, 3428 3519, 3545, 3625, 3648, 3880, 3888, 3911, + 3952, 3965, 4066, 4071, 4075, 4078, 4081, 4096, 4119, 4122, 4127, + 4146, 4171, 4179, 4183, 4221, 4224, 4254, 4281, 4319, 4323, 4326, + 4329, 4332, 4337, 4415, 4432, 4444, 4445, 4458, 4467, 4470, 4471, + 4518, 4567, 4570, 4579, 4589, 4609, 4664 + +* Mon Mar 26 2007 Frank Ch. Eigler - 0.5.13-1 +- An emergency / preliminary refresh, mainly for compatibility + with 2.6.21-pre kernels. + +* Mon Jan 1 2007 Frank Ch. Eigler - 0.5.12-1 +- Many changes, see NEWS file. + +* Tue Sep 26 2006 David Smith - 0.5.10-1 +- Added 'systemtap-runtime' subpackage. + +* Wed Jul 19 2006 Roland McGrath - 0.5.9-1 +- PRs 2669, 2913 + +* Fri Jun 16 2006 Roland McGrath - 0.5.8-1 +- PRs 2627, 2520, 2228, 2645 + +* Fri May 5 2006 Frank Ch. Eigler - 0.5.7-1 +- PRs 2511 2453 2307 1813 1944 2497 2538 2476 2568 1341 2058 2220 2437 + 1326 2014 2599 2427 2438 2465 1930 2149 2610 2293 2634 2506 2433 + +* Tue Apr 4 2006 Roland McGrath - 0.5.5-1 +- Many changes, affected PRs include: 2068, 2293, 1989, 2334, + 1304, 2390, 2425, 953. + +* Wed Feb 1 2006 Frank Ch. Eigler - 0.5.4-1 +- PRs 1916, 2205, 2142, 2060, 1379 + +* Mon Jan 16 2006 Roland McGrath - 0.5.3-1 +- Many changes, affected PRs include: 2056, 1144, 1379, 2057, + 2060, 1972, 2140, 2148 + +* Mon Dec 19 2005 Roland McGrath - 0.5.2-1 +- Fixed build with gcc 4.1, various tapset changes. + +* Wed Dec 7 2005 Roland McGrath - 0.5.1-1 +- elfutils update, build changes + +* Fri Dec 02 2005 Frank Ch. Eigler - 0.5-1 +- Many fixes and improvements: 1425, 1536, 1505, 1380, 1329, 1828, 1271, + 1339, 1340, 1345, 1837, 1917, 1903, 1336, 1868, 1594, 1564, 1276, 1295 + +* Mon Oct 31 2005 Roland McGrath - 0.4.2-1 +- Many fixes and improvements: PRs 1344, 1260, 1330, 1295, 1311, 1368, + 1182, 1131, 1332, 1366, 1456, 1271, 1338, 1482, 1477, 1194. + +* Wed Sep 14 2005 Roland McGrath - 0.4.1-1 +- Many fixes and improvements since 0.2.2; relevant PRs include: + 1122, 1134, 1155, 1172, 1174, 1175, 1180, 1186, 1187, 1191, 1193, 1195, + 1197, 1205, 1206, 1209, 1213, 1244, 1257, 1258, 1260, 1265, 1268, 1270, + 1289, 1292, 1306, 1335, 1257 + +* Wed Sep 7 2005 Frank Ch. Eigler +- Bump version. + +* Tue Aug 16 2005 Frank Ch. Eigler +- Bump version. + +* Wed Aug 3 2005 Martin Hunt - 0.2.2-1 +- Add directory /var/cache/systemtap +- Add stp_check to /usr/libexec/systemtap + +* Wed Aug 3 2005 Roland McGrath - 0.2.1-1 +- New version 0.2.1, various fixes. + +* Fri Jul 29 2005 Roland McGrath - 0.2-1 +- New version 0.2, requires elfutils 0.111 + +* Mon Jul 25 2005 Roland McGrath +- Clean up spec file, build bundled elfutils. + +* Thu Jul 21 2005 Martin Hunt +- Set Version to use version from autoconf. +- Fix up some of the path names. +- Add Requires and BuildRequires. + +* Tue Jul 19 2005 Will Cohen +- Initial creation of RPM.