summaryrefslogtreecommitdiffstats
path: root/runtime
diff options
context:
space:
mode:
authorMaynard Johnson <maynardj@us.ibm.com>2009-04-01 09:51:57 -0500
committerJosh Stone <jistone@redhat.com>2009-04-01 16:33:22 -0700
commit489afa702639fd10e9756795bd516d939766247d (patch)
treea6951f8542398c73bfe5c6a0fd5d796560f77f43 /runtime
parent4cc40e829870dd6a1d9714706d38f5fd4b2ec982 (diff)
downloadsystemtap-steved-489afa702639fd10e9756795bd516d939766247d.tar.gz
systemtap-steved-489afa702639fd10e9756795bd516d939766247d.tar.xz
systemtap-steved-489afa702639fd10e9756795bd516d939766247d.zip
Fix runtime/itrace.c to call arch_has_*_step() prior to calling utrace_control
As Roland pointed out in his Mar 31 reply to a posting of mine (subject: Re: Testing insn.block probe point uncovers possible utrace bug), utrace_control() documents that the caller must ensure that arch_has_single_step and arch_has_block_step are defined before trying to use those step modes. The attached patch addresses that issue. I've tested this patch on x86_64 arch, and a block step test runs successfully, since block step is supported on that arch. Testing on ppc64 arch, the test fails as expected (since block step is not supported on ppc64 yet) with: "ERROR: callback for <pid> failed: 1" which is sent to stdderr and "usr_itrace_init: arch does not support block step mode" which is sent to the system log. This isn't the most user-friendly way of surfacing an error. Perhaps the stap runtime could have a set of defined return codes that would be mapped to strings so the user can get an idea of what the error is without looking in the system log. But that's a side issue, of course. Regards, -Maynard
Diffstat (limited to 'runtime')
-rw-r--r--runtime/itrace.c13
1 files changed, 13 insertions, 0 deletions
diff --git a/runtime/itrace.c b/runtime/itrace.c
index 97ba427e..69f3bf74 100644
--- a/runtime/itrace.c
+++ b/runtime/itrace.c
@@ -318,6 +318,19 @@ static int usr_itrace_init(int single_step, pid_t tid, struct stap_itrace_probe
struct task_struct *tsk;
spin_lock_init(&itrace_lock);
+
+ /* 'arch_has_single_step' needs to be defined for either single step mode
+ * or branch mode.
+ */
+ if (!arch_has_single_step()) {
+ printk(KERN_ERR "usr_itrace_init: arch does not support step mode\n");
+ return 1;
+ }
+ if (!single_step && !arch_has_block_step()) {
+ printk(KERN_ERR "usr_itrace_init: arch does not support block step mode\n");
+ return 1;
+ }
+
rcu_read_lock();
#ifdef STAPCONF_FIND_TASK_PID
tsk = find_task_by_pid(tid);