* 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-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
# 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;
}
%}
+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;
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) {
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") {
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"