From d5cd287f7860df8752f93de93fcd1cc68884d56b Mon Sep 17 00:00:00 2001 From: David Smith Date: Thu, 9 Apr 2009 12:06:05 -0500 Subject: Uses when available. 2009-04-09 David Smith * buildrun.cxx (compile_pass): Compile autoconf test for . * runtime/autoconf-asm-syscall.c: New "autoconf" test the presence of . * runtime/syscall.h: If 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. --- tapset/utrace.stp | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) (limited to 'tapset/utrace.stp') diff --git a/tapset/utrace.stp b/tapset/utrace.stp index 34cb32c5..00f427e6 100644 --- a/tapset/utrace.stp +++ b/tapset/utrace.stp @@ -6,13 +6,15 @@ %} function _utrace_syscall_nr:long () %{ - THIS->__retvalue = __stp_user_syscall_nr(CONTEXT->regs); /* pure */ + THIS->__retvalue = syscall_get_nr(current, CONTEXT->regs); /* pure */ %} function _utrace_syscall_arg:long (n:long) %{ - THIS->__retvalue = *__stp_user_syscall_arg(current, CONTEXT->regs, (int)THIS->n); /* pure */ + unsigned long arg = 0; /* pure */ + syscall_get_arguments(current, CONTEXT->regs, (int)THIS->n, 1, &arg); + THIS->__retvalue = arg; %} function _utrace_syscall_return:long () %{ - THIS->__retvalue = *__stp_user_syscall_return_value(current, CONTEXT->regs); /* pure */ + THIS->__retvalue = syscall_get_return_value(current, CONTEXT->regs); /* pure */ %} -- cgit From ee0dfa16f900396f4fd89d4d765e877daa8a2c19 Mon Sep 17 00:00:00 2001 From: David Smith Date: Fri, 17 Apr 2009 09:26:08 -0500 Subject: Avoid sign extension in syscall return values. 2009-04-17 David Smith * tapset/utrace.stp: Cast the return value of syscall_get_return_value() to an unsigned long to avoid sign extension. --- tapset/utrace.stp | 24 +++++++++++++++--------- 1 file changed, 15 insertions(+), 9 deletions(-) (limited to 'tapset/utrace.stp') diff --git a/tapset/utrace.stp b/tapset/utrace.stp index 00f427e6..0d26ed5f 100644 --- a/tapset/utrace.stp +++ b/tapset/utrace.stp @@ -1,20 +1,26 @@ /* utrace-only subset of register accessors */ - %{ #include "syscall.h" %} -function _utrace_syscall_nr:long () %{ - THIS->__retvalue = syscall_get_nr(current, CONTEXT->regs); /* pure */ +function _utrace_syscall_nr:long () %{ /* pure */ + THIS->__retvalue = syscall_get_nr(current, CONTEXT->regs); %} -function _utrace_syscall_arg:long (n:long) %{ - unsigned long arg = 0; /* pure */ - syscall_get_arguments(current, CONTEXT->regs, (int)THIS->n, 1, &arg); - THIS->__retvalue = arg; +function _utrace_syscall_arg:long (n:long) %{ /* pure */ + unsigned long arg = 0; + syscall_get_arguments(current, CONTEXT->regs, (int)THIS->n, 1, &arg); + THIS->__retvalue = arg; %} -function _utrace_syscall_return:long () %{ - THIS->__retvalue = syscall_get_return_value(current, CONTEXT->regs); /* pure */ +function _utrace_syscall_return:long () %{ /* pure */ + /* + * Here's the reason for the "unsigned long" cast. Since all + * values inside systemtap are 64-bit numbers, return values were + * getting sign extended. This caused return values to not match + * up with the same values passes as arguments. + */ + THIS->__retvalue = (unsigned long)syscall_get_return_value(current, + CONTEXT->regs); %} -- cgit