summaryrefslogtreecommitdiffstats
path: root/runtime/task_finder.c
diff options
context:
space:
mode:
authorDavid Smith <dsmith@redhat.com>2009-04-09 12:06:05 -0500
committerDavid Smith <dsmith@redhat.com>2009-04-09 12:06:05 -0500
commitd5cd287f7860df8752f93de93fcd1cc68884d56b (patch)
tree3925169ed4a5742464677f50f7a55e18cad1b561 /runtime/task_finder.c
parent52356a26e1825acbd9146337ffdbed9b0e173f2b (diff)
downloadsystemtap-steved-d5cd287f7860df8752f93de93fcd1cc68884d56b.tar.gz
systemtap-steved-d5cd287f7860df8752f93de93fcd1cc68884d56b.tar.xz
systemtap-steved-d5cd287f7860df8752f93de93fcd1cc68884d56b.zip
Uses <asm/syscall.h> when available.
2009-04-09 David Smith <dsmith@redhat.com> * buildrun.cxx (compile_pass): Compile autoconf test for <asm/syscall.h>. * runtime/autoconf-asm-syscall.c: New "autoconf" test the presence of <asm/syscall.h>. * runtime/syscall.h: If <asm/syscall.h> exists, use it. Otherwise, use our private copy of the functions for each architecture. (syscall_get_nr): Renamed from __stp_user_syscall_nr(). (syscall_get_return_value): Renamed from __stp_user_syscall_return_value(). (syscall_get_arguments): Renamed from __stp_user_syscall_arg(). * runtime/task_finder.c (__stp_utrace_task_finder_target_syscall_exit): Uses new syscall.h functions. * tapset/utrace.stp: Ditto.
Diffstat (limited to 'runtime/task_finder.c')
-rw-r--r--runtime/task_finder.c56
1 files changed, 14 insertions, 42 deletions
diff --git a/runtime/task_finder.c b/runtime/task_finder.c
index 433a042a..fa6c296e 100644
--- a/runtime/task_finder.c
+++ b/runtime/task_finder.c
@@ -1065,11 +1065,9 @@ __stp_utrace_task_finder_target_syscall_exit(enum utrace_resume_action action,
#endif
{
struct stap_task_finder_target *tgt = engine->data;
- unsigned long syscall_no;
- unsigned long *rv_addr, rv;
- unsigned long *arg_addr, arg0;
- unsigned long arg1 = 0;
- unsigned long arg2 = 0;
+ long syscall_no;
+ unsigned long rv;
+ unsigned long args[3];
int rc;
struct mm_struct *mm;
struct vm_area_struct *vma;
@@ -1088,7 +1086,7 @@ __stp_utrace_task_finder_target_syscall_exit(enum utrace_resume_action action,
// See if syscall is one we're interested in.
//
// FIXME: do we need to handle mremap()?
- syscall_no = __stp_user_syscall_nr(regs);
+ syscall_no = syscall_get_nr(tsk, regs);
if (syscall_no != MMAP_SYSCALL_NO(tsk)
&& syscall_no != MMAP2_SYSCALL_NO(tsk)
&& syscall_no != MPROTECT_SYSCALL_NO(tsk)
@@ -1106,21 +1104,11 @@ __stp_utrace_task_finder_target_syscall_exit(enum utrace_resume_action action,
return UTRACE_RESUME;
// Get return value
- rv_addr = __stp_user_syscall_return_value(tsk, regs);
- if ((rc = __stp_get_user(rv, rv_addr)) != 0) {
- _stp_error("couldn't read syscall return value for pid %d: %d",
- tsk->pid, rc);
- return UTRACE_RESUME;
- }
+ rv = syscall_get_return_value(tsk, regs);
// We need the first syscall argument to see what address we
// were operating on.
- arg_addr = __stp_user_syscall_arg(tsk, regs, 0);
- if ((rc = __stp_get_user(arg0, arg_addr)) != 0) {
- _stp_error("couldn't read syscall arg 0 for pid %d: %d",
- tsk->pid, rc);
- return UTRACE_RESUME;
- }
+ syscall_get_arguments(tsk, regs, 0, 1, args);
#ifdef DEBUG_TASK_FINDER_VMA
_stp_dbug(__FUNCTION__, __LINE__,
@@ -1131,20 +1119,15 @@ __stp_utrace_task_finder_target_syscall_exit(enum utrace_resume_action action,
: ((syscall_no == MPROTECT_SYSCALL_NO(tsk)) ? "mprotect"
: ((syscall_no == MUNMAP_SYSCALL_NO(tsk)) ? "munmap"
: "UNKNOWN")))),
- arg0, rv);
+ args[0], rv);
#endif
__stp_tf_handler_start();
if (syscall_no == MUNMAP_SYSCALL_NO(tsk)) {
// We need the 2nd syscall argument for the length.
- arg_addr = __stp_user_syscall_arg(tsk, regs, 1);
- if ((rc = __stp_get_user(arg1, arg_addr)) != 0) {
- _stp_error("couldn't read syscall arg 1 for pid %d: %d",
- tsk->pid, rc);
- goto syscall_exit_done;
- }
+ syscall_get_arguments(tsk, regs, 1, 1, &args[1]);
// Call the callbacks
- __stp_call_munmap_callbacks(tgt, tsk, arg0, arg1);
+ __stp_call_munmap_callbacks(tgt, tsk, args[0], args[1]);
}
else if (syscall_no == MMAP_SYSCALL_NO(tsk)
|| syscall_no == MMAP2_SYSCALL_NO(tsk)) {
@@ -1165,24 +1148,13 @@ __stp_utrace_task_finder_target_syscall_exit(enum utrace_resume_action action,
}
}
else {
- // We need the 2nd syscall argument for the length.
- arg_addr = __stp_user_syscall_arg(tsk, regs, 1);
- if ((rc = __stp_get_user(arg1, arg_addr)) != 0) {
- _stp_error("couldn't read syscall arg 1 for pid %d: %d",
- tsk->pid, rc);
- goto syscall_exit_done;
- }
-
- // We need the 3nd syscall argument for the protection.
- arg_addr = __stp_user_syscall_arg(tsk, regs, 2);
- if ((rc = __stp_get_user(arg2, arg_addr)) != 0) {
- _stp_error("couldn't read syscall arg 2 for pid %d: %d",
- tsk->pid, rc);
- goto syscall_exit_done;
- }
+ // We need the 2nd syscall argument for the length and
+ // the 3rd argument for the protection.
+ syscall_get_arguments(tsk, regs, 1, 2, &args[1]);
// Call the callbacks
- __stp_call_mprotect_callbacks(tgt, tsk, arg0, arg1, arg2);
+ __stp_call_mprotect_callbacks(tgt, tsk, args[0], args[1],
+ args[2]);
}
syscall_exit_done: