diff options
author | Maynard Johnson <maynardj@us.ibm.com> | 2009-04-01 09:51:57 -0500 |
---|---|---|
committer | Josh Stone <jistone@redhat.com> | 2009-04-01 16:33:22 -0700 |
commit | 489afa702639fd10e9756795bd516d939766247d (patch) | |
tree | a6951f8542398c73bfe5c6a0fd5d796560f77f43 /runtime | |
parent | 4cc40e829870dd6a1d9714706d38f5fd4b2ec982 (diff) | |
download | systemtap-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.c | 13 |
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); |