From: hunt Date: Tue, 3 Jul 2007 21:43:20 +0000 (+0000) Subject: 2007-07-03 Martin Hunt X-Git-Tag: release-0.6~383 X-Git-Url: https://sourceware.org/git/?a=commitdiff_plain;h=84cd02024b221fc66501d210a2790040ee4b14ff;p=systemtap.git 2007-07-03 Martin Hunt * syscalls.stp: Add sys_futimesat, compat_sys_futimesat. * syscalls2.stp (utimes): Use _struct_timeval2_u. * aux_syscalls.stp (_struct_timeval2_u): New function. (_struct_compat_timeval2_u): New function. --- diff --git a/tapset/ChangeLog b/tapset/ChangeLog index 0e1898e45..bab447c2a 100644 --- a/tapset/ChangeLog +++ b/tapset/ChangeLog @@ -1,3 +1,10 @@ +2007-07-03 Martin Hunt + + * syscalls.stp: Add sys_futimesat, compat_sys_futimesat. + * syscalls2.stp (utimes): Use _struct_timeval2_u. + * aux_syscalls.stp (_struct_timeval2_u): New function. + (_struct_compat_timeval2_u): New function. + 2007-07-02 Martin Hunt * context.stp (print_backtrace): If no regs, just diff --git a/tapset/aux_syscalls.stp b/tapset/aux_syscalls.stp index d80139a48..708432c69 100644 --- a/tapset/aux_syscalls.stp +++ b/tapset/aux_syscalls.stp @@ -2,6 +2,22 @@ # Given a userspace pointer to a timeval, # copy and decode it and return a string. # +function _struct_timeval2_u:string(uaddr:long) +%{ /* pure */ + struct timeval tv[2]; + char *ptr = (char *)(unsigned long)THIS->uaddr; + + if (ptr == NULL) + strlcpy (THIS->__retvalue, "NULL", MAXSTRINGLEN); + else { + if(_stp_copy_from_user((char*)&tv,ptr,2*sizeof(struct timeval)) == 0) + snprintf(THIS->__retvalue, MAXSTRINGLEN, "[%ld.%06ld][%ld.%.06ld]", + tv[0].tv_sec, tv[0].tv_usec, tv[1].tv_sec, tv[1].tv_usec); + else + strlcpy (THIS->__retvalue, "UNKNOWN", MAXSTRINGLEN); + } +%} + function _struct_timeval_u:string(uaddr:long) %{ /* pure */ struct timeval tv; @@ -32,6 +48,22 @@ function _struct_compat_timeval_u:string(uaddr:long) } %} +function _struct_compat_timeval2_u:string(uaddr:long) +%{ /* pure */ + struct timeval tv[2]; + char *ptr = (char *)(unsigned long)THIS->uaddr; + + if (ptr == NULL) + strlcpy (THIS->__retvalue, "NULL", MAXSTRINGLEN); + else { + if(_stp_copy_from_user((char*)&tv,ptr,2*sizeof(struct compat_timeval)) == 0) + snprintf(THIS->__retvalue, MAXSTRINGLEN, "[%ld.%06ld][%ld.%.06ld]", + tv[0].tv_sec, tv[0].tv_usec, tv[1].tv_sec, tv[1].tv_usec); + else + strlcpy (THIS->__retvalue, "UNKNOWN", MAXSTRINGLEN); + } +%} + function _struct_timeval:string(addr:long) %{ /* pure */ struct timeval *tv = (struct timeval *)(unsigned long)THIS->addr; @@ -820,7 +852,7 @@ function _get_wc_str(wc) { if(wc==3) return "CLOCK_THREAD_CPUTIME_ID" if(wc==4) return "CLOCK_REALTIME_HR" if(wc==5) return "CLOCK_MONOTONIC_HR" - return "" + return "CLOCK_UNKNOWN" } function _flock_cmd_str(c) { diff --git a/tapset/syscalls.stp b/tapset/syscalls.stp index ba52cc093..a2a2419f4 100644 --- a/tapset/syscalls.stp +++ b/tapset/syscalls.stp @@ -920,6 +920,39 @@ probe syscall.futex.return = kernel.function("sys_futex").return { retstr = returnstr(1) } +# futimesat _____________________________________________________ +# +# long sys_futimesat(int dfd, char __user *filename, struct timeval __user *utimes) +# long compat_sys_futimesat(unsigned int dfd, char __user *filename, struct compat_timeval __user *t) +# + +probe syscall.futimesat = kernel.function("sys_futimesat") ? { + name = "futimesat" + dirfd = $dfd + filename_uaddr = $filename + filename = user_string($filename) + tvp_uaddr = $utimes + argstr = sprintf("%d, %s, %s", $dfd, user_string_quoted($filename), + _struct_timeval2_u($utimes)) +} +probe syscall.compat_futimesat = kernel.function("compat_sys_futimesat") ? { + name = "futimesat" + dirfd = $dfd + filename_uaddr = $filename + filename = user_string($filename) + tvp_uaddr = $utimes + argstr = sprintf("%d, %s, %s", $dfd, user_string_quoted($filename), + _struct_compat_timeval2_u($utimes)) +} +probe syscall.futimesat.return = kernel.function("sys_futimesat").return ? { + name = "futimesat" + retstr = returnstr(1) +} +probe syscall.compat_futimesat.return = kernel.function("compat_sys_futimesat").return ? { + name = "futimesat" + retstr = returnstr(1) +} + # getcwd _____________________________________________________ # long sys_getcwd(char __user *buf, unsigned long size) probe syscall.getcwd = kernel.function("sys_getcwd") { diff --git a/tapset/syscalls2.stp b/tapset/syscalls2.stp index fec0dc552..968def004 100644 --- a/tapset/syscalls2.stp +++ b/tapset/syscalls2.stp @@ -2386,7 +2386,7 @@ probe syscall.utimes = kernel.function("sys_utimes") { filename = user_string($filename) tvp_uaddr = $utimes argstr = sprintf("%s, %s", user_string_quoted($filename), - _struct_timeval_u($utimes)) + _struct_timeval2_u($utimes)) } probe syscall.utimes.return = kernel.function("sys_utimes").return { name = "utimes"