diff options
-rw-r--r-- | tapset/ChangeLog | 7 | ||||
-rw-r--r-- | tapset/aux_syscalls.stp | 34 | ||||
-rw-r--r-- | tapset/syscalls.stp | 33 | ||||
-rw-r--r-- | tapset/syscalls2.stp | 2 |
4 files changed, 74 insertions, 2 deletions
diff --git a/tapset/ChangeLog b/tapset/ChangeLog index 0e1898e4..bab447c2 100644 --- a/tapset/ChangeLog +++ b/tapset/ChangeLog @@ -1,3 +1,10 @@ +2007-07-03 Martin Hunt <hunt@redhat.com> + + * 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 <hunt@redhat.com> * context.stp (print_backtrace): If no regs, just diff --git a/tapset/aux_syscalls.stp b/tapset/aux_syscalls.stp index d80139a4..708432c6 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 ba52cc09..a2a2419f 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 fec0dc55..968def00 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" |