Mark Wielaard 8f3bc4
diff -ur valgrind-3.15.0.orig/coregrind/m_syswrap/priv_syswrap-linux.h valgrind-3.15.0/coregrind/m_syswrap/priv_syswrap-linux.h
Mark Wielaard 8f3bc4
--- valgrind-3.15.0.orig/coregrind/m_syswrap/priv_syswrap-linux.h	2020-02-28 14:02:29.841341757 +0100
Mark Wielaard 8f3bc4
+++ valgrind-3.15.0/coregrind/m_syswrap/priv_syswrap-linux.h	2020-02-28 14:55:44.622692816 +0100
Mark Wielaard 8f3bc4
@@ -388,6 +388,28 @@
Mark Wielaard 8f3bc4
 DECL_TEMPLATE(linux, sys_kcmp);
Mark Wielaard 8f3bc4
 DECL_TEMPLATE(linux, sys_copy_file_range);
Mark Wielaard 8f3bc4
 
Mark Wielaard 8f3bc4
+/* 64bit time_t syscalls for 32bit arches.  */
Mark Wielaard 8f3bc4
+DECL_TEMPLATE(linux, sys_clock_gettime64)
Mark Wielaard 8f3bc4
+DECL_TEMPLATE(linux, sys_clock_settime64)
Mark Wielaard 8f3bc4
+// clock_adjtime64
Mark Wielaard 8f3bc4
+DECL_TEMPLATE(linux, sys_clock_getres_time64)
Mark Wielaard 8f3bc4
+DECL_TEMPLATE(linux, sys_clock_nanosleep_time64);
Mark Wielaard 8f3bc4
+DECL_TEMPLATE(linux, sys_timer_gettime64);
Mark Wielaard 8f3bc4
+DECL_TEMPLATE(linux, sys_timer_settime64);
Mark Wielaard 8f3bc4
+DECL_TEMPLATE(linux, sys_timerfd_gettime64);
Mark Wielaard 8f3bc4
+DECL_TEMPLATE(linux, sys_timerfd_settime64);
Mark Wielaard 8f3bc4
+DECL_TEMPLATE(linux, sys_utimensat_time64);
Mark Wielaard 8f3bc4
+DECL_TEMPLATE(linux, sys_pselect6_time64);
Mark Wielaard 8f3bc4
+DECL_TEMPLATE(linux, sys_ppoll_time64);
Mark Wielaard 8f3bc4
+// io_pgetevents_time64
Mark Wielaard 8f3bc4
+DECL_TEMPLATE(linux, sys_recvmmsg_time64);
Mark Wielaard 8f3bc4
+DECL_TEMPLATE(linux, sys_mq_timedsend_time64);
Mark Wielaard 8f3bc4
+DECL_TEMPLATE(linux, sys_mq_timedreceive_time64);
Mark Wielaard 8f3bc4
+DECL_TEMPLATE(linux, sys_semtimedop_time64);
Mark Wielaard 8f3bc4
+DECL_TEMPLATE(linux, sys_rt_sigtimedwait_time64);
Mark Wielaard 8f3bc4
+DECL_TEMPLATE(linux, sys_futex_time64);
Mark Wielaard 8f3bc4
+DECL_TEMPLATE(linux, sys_sched_rr_get_interval_time64);
Mark Wielaard 8f3bc4
+
Mark Wielaard 8f3bc4
 // Some arch specific functions called from syswrap-linux.c
Mark Wielaard 8f3bc4
 extern Int do_syscall_clone_x86_linux ( Word (*fn)(void *), 
Mark Wielaard 8f3bc4
                                         void* stack, 
Mark Wielaard 8f3bc4
diff -ur valgrind-3.15.0.orig/coregrind/m_syswrap/syswrap-arm-linux.c valgrind-3.15.0/coregrind/m_syswrap/syswrap-arm-linux.c
Mark Wielaard 8f3bc4
--- valgrind-3.15.0.orig/coregrind/m_syswrap/syswrap-arm-linux.c	2020-02-28 14:02:29.848341656 +0100
Mark Wielaard 8f3bc4
+++ valgrind-3.15.0/coregrind/m_syswrap/syswrap-arm-linux.c	2020-02-28 14:55:44.623692804 +0100
Mark Wielaard 8f3bc4
@@ -744,7 +744,7 @@
Mark Wielaard 8f3bc4
    LINX_(__NR_sched_get_priority_max, sys_sched_get_priority_max),// 159
Mark Wielaard 8f3bc4
 
Mark Wielaard 8f3bc4
    LINX_(__NR_sched_get_priority_min, sys_sched_get_priority_min),// 160
Mark Wielaard 8f3bc4
-//zz    //LINX?(__NR_sched_rr_get_interval,  sys_sched_rr_get_interval), // 161 */*
Mark Wielaard 8f3bc4
+   LINXY(__NR_sched_rr_get_interval,  sys_sched_rr_get_interval), // 161
Mark Wielaard 8f3bc4
    GENXY(__NR_nanosleep,         sys_nanosleep),      // 162
Mark Wielaard 8f3bc4
    GENX_(__NR_mremap,            sys_mremap),         // 163
Mark Wielaard 8f3bc4
    LINX_(__NR_setresuid,         sys_setresuid16),    // 164
Mark Wielaard 8f3bc4
@@ -1020,6 +1020,28 @@
Mark Wielaard 8f3bc4
    LINX_(__NR_copy_file_range,   sys_copy_file_range),  // 391
Mark Wielaard 8f3bc4
 
Mark Wielaard 8f3bc4
    LINXY(__NR_statx,             sys_statx),            // 397
Mark Wielaard 8f3bc4
+
Mark Wielaard 8f3bc4
+   LINXY(__NR_clock_gettime64,   sys_clock_gettime64),  // 403
Mark Wielaard 8f3bc4
+   LINX_(__NR_clock_settime64,   sys_clock_settime64),  // 404
Mark Wielaard 8f3bc4
+
Mark Wielaard 8f3bc4
+   LINXY(__NR_clock_getres_time64, sys_clock_getres_time64), // 406
Mark Wielaard 8f3bc4
+   LINXY(__NR_clock_nanosleep_time64, sys_clock_nanosleep_time64), // 407
Mark Wielaard 8f3bc4
+   LINXY(__NR_timer_gettime64,   sys_timer_gettime64),  // 408
Mark Wielaard 8f3bc4
+   LINXY(__NR_timer_settime64,   sys_timer_settime64),  // 409
Mark Wielaard 8f3bc4
+   LINXY(__NR_timerfd_gettime64, sys_timerfd_gettime64),// 410
Mark Wielaard 8f3bc4
+   LINXY(__NR_timerfd_settime64, sys_timerfd_settime64),// 411
Mark Wielaard 8f3bc4
+   LINX_(__NR_utimensat_time64,  sys_utimensat_time64), // 412
Mark Wielaard 8f3bc4
+   LINXY(__NR_pselect6_time64,   sys_pselect6_time64),  // 413
Mark Wielaard 8f3bc4
+   LINXY(__NR_ppoll_time64,      sys_ppoll_time64),     // 414
Mark Wielaard 8f3bc4
+
Mark Wielaard 8f3bc4
+   LINXY(__NR_recvmmsg_time64,   sys_recvmmsg_time64),  // 417
Mark Wielaard 8f3bc4
+   LINX_(__NR_mq_timedsend_time64, sys_mq_timedsend_time64), // 418
Mark Wielaard 8f3bc4
+   LINXY(__NR_mq_timedreceive_time64, sys_mq_timedreceive_time64), // 419
Mark Wielaard 8f3bc4
+   LINX_(__NR_semtimedop_time64, sys_semtimedop_time64),// 420
Mark Wielaard 8f3bc4
+   LINXY(__NR_rt_sigtimedwait_time64, sys_rt_sigtimedwait_time64), // 421
Mark Wielaard 8f3bc4
+   LINXY(__NR_futex_time64,      sys_futex_time64),     // 422
Mark Wielaard 8f3bc4
+   LINXY(__NR_sched_rr_get_interval_time64,
Mark Wielaard 8f3bc4
+         sys_sched_rr_get_interval_time64),             // 423
Mark Wielaard 8f3bc4
 };
Mark Wielaard 8f3bc4
 
Mark Wielaard 8f3bc4
 
Mark Wielaard 8f3bc4
diff -ur valgrind-3.15.0.orig/coregrind/m_syswrap/syswrap-linux.c valgrind-3.15.0/coregrind/m_syswrap/syswrap-linux.c
Mark Wielaard 8f3bc4
--- valgrind-3.15.0.orig/coregrind/m_syswrap/syswrap-linux.c	2020-02-28 14:02:29.843341728 +0100
Mark Wielaard 8f3bc4
+++ valgrind-3.15.0/coregrind/m_syswrap/syswrap-linux.c	2020-02-28 14:55:44.625692781 +0100
Mark Wielaard 8f3bc4
@@ -1584,7 +1584,9 @@
Mark Wielaard 8f3bc4
    }
Mark Wielaard 8f3bc4
 }
Mark Wielaard 8f3bc4
 
Mark Wielaard 8f3bc4
-PRE(sys_futex)
Mark Wielaard 8f3bc4
+static void futex_pre_helper ( ThreadId tid, SyscallArgLayout* layout,
Mark Wielaard 8f3bc4
+                               SyscallArgs* arrghs, SyscallStatus* status,
Mark Wielaard 8f3bc4
+                               UWord* flags, Bool is_time64 )
Mark Wielaard 8f3bc4
 {
Mark Wielaard 8f3bc4
    /* 
Mark Wielaard 8f3bc4
       arg    param                              used by ops
Mark Wielaard 8f3bc4
@@ -1596,21 +1598,32 @@
Mark Wielaard 8f3bc4
       ARG5 - u32 *uaddr2			REQUEUE,CMP_REQUEUE
Mark Wielaard 8f3bc4
       ARG6 - int val3				CMP_REQUEUE
Mark Wielaard 8f3bc4
     */
Mark Wielaard 8f3bc4
-   PRINT("sys_futex ( %#" FMT_REGWORD "x, %ld, %ld, %#" FMT_REGWORD
Mark Wielaard 8f3bc4
-         "x, %#" FMT_REGWORD "x )", ARG1, SARG2, SARG3, ARG4, ARG5);
Mark Wielaard 8f3bc4
+
Mark Wielaard 8f3bc4
    switch(ARG2 & ~(VKI_FUTEX_PRIVATE_FLAG|VKI_FUTEX_CLOCK_REALTIME)) {
Mark Wielaard 8f3bc4
    case VKI_FUTEX_CMP_REQUEUE:
Mark Wielaard 8f3bc4
    case VKI_FUTEX_WAKE_OP:
Mark Wielaard 8f3bc4
    case VKI_FUTEX_CMP_REQUEUE_PI:
Mark Wielaard 8f3bc4
-      PRE_REG_READ6(long, "futex", 
Mark Wielaard 8f3bc4
-                    vki_u32 *, futex, int, op, int, val,
Mark Wielaard 8f3bc4
-                    struct timespec *, utime, vki_u32 *, uaddr2, int, val3);
Mark Wielaard 8f3bc4
+      if (is_time64) {
Mark Wielaard 8f3bc4
+         PRE_REG_READ6(long, "futex_time64", 
Mark Wielaard 8f3bc4
+                       vki_u32 *, futex, int, op, int, val,
Mark Wielaard 8f3bc4
+                       struct timespec64 *, utime, vki_u32 *, uaddr2, int, val3);
Mark Wielaard 8f3bc4
+      } else {
Mark Wielaard 8f3bc4
+         PRE_REG_READ6(long, "futex", 
Mark Wielaard 8f3bc4
+                       vki_u32 *, futex, int, op, int, val,
Mark Wielaard 8f3bc4
+                       struct timespec *, utime, vki_u32 *, uaddr2, int, val3);
Mark Wielaard 8f3bc4
+      }
Mark Wielaard 8f3bc4
       break;
Mark Wielaard 8f3bc4
    case VKI_FUTEX_REQUEUE:
Mark Wielaard 8f3bc4
    case VKI_FUTEX_WAIT_REQUEUE_PI:
Mark Wielaard 8f3bc4
-      PRE_REG_READ5(long, "futex", 
Mark Wielaard 8f3bc4
-                    vki_u32 *, futex, int, op, int, val,
Mark Wielaard 8f3bc4
-                    struct timespec *, utime, vki_u32 *, uaddr2);
Mark Wielaard 8f3bc4
+      if (is_time64) {
Mark Wielaard 8f3bc4
+         PRE_REG_READ5(long, "futex_time64", 
Mark Wielaard 8f3bc4
+                       vki_u32 *, futex, int, op, int, val,
Mark Wielaard 8f3bc4
+                       struct timespec64 *, utime, vki_u32 *, uaddr2);
Mark Wielaard 8f3bc4
+      } else {
Mark Wielaard 8f3bc4
+         PRE_REG_READ5(long, "futex", 
Mark Wielaard 8f3bc4
+                       vki_u32 *, futex, int, op, int, val,
Mark Wielaard 8f3bc4
+                       struct timespec *, utime, vki_u32 *, uaddr2);
Mark Wielaard 8f3bc4
+      }
Mark Wielaard 8f3bc4
       break;
Mark Wielaard 8f3bc4
    case VKI_FUTEX_WAIT_BITSET:
Mark Wielaard 8f3bc4
       /* Check that the address at least begins in client-accessible area. */
Mark Wielaard 8f3bc4
@@ -1619,15 +1632,27 @@
Mark Wielaard 8f3bc4
             return;
Mark Wielaard 8f3bc4
       }
Mark Wielaard 8f3bc4
       if (*(vki_u32 *)(Addr)ARG1 != ARG3) {
Mark Wielaard 8f3bc4
-         PRE_REG_READ4(long, "futex",
Mark Wielaard 8f3bc4
-                       vki_u32 *, futex, int, op, int, val,
Mark Wielaard 8f3bc4
-                       struct timespec *, utime);
Mark Wielaard 8f3bc4
+         if (is_time64) {
Mark Wielaard 8f3bc4
+            PRE_REG_READ4(long, "futex_time64",
Mark Wielaard 8f3bc4
+                          vki_u32 *, futex, int, op, int, val,
Mark Wielaard 8f3bc4
+                          struct timespec64 *, utime);
Mark Wielaard 8f3bc4
+         } else {
Mark Wielaard 8f3bc4
+            PRE_REG_READ4(long, "futex",
Mark Wielaard 8f3bc4
+                          vki_u32 *, futex, int, op, int, val,
Mark Wielaard 8f3bc4
+                          struct timespec64 *, utime);
Mark Wielaard 8f3bc4
+         }
Mark Wielaard 8f3bc4
       } else {
Mark Wielaard 8f3bc4
         /* Note argument 5 is unused, but argument 6 is used.
Mark Wielaard 8f3bc4
            So we cannot just PRE_REG_READ6. Read argument 6 separately.  */
Mark Wielaard 8f3bc4
-         PRE_REG_READ4(long, "futex",
Mark Wielaard 8f3bc4
-                       vki_u32 *, futex, int, op, int, val,
Mark Wielaard 8f3bc4
-                       struct timespec *, utime);
Mark Wielaard 8f3bc4
+         if (is_time64) {
Mark Wielaard 8f3bc4
+            PRE_REG_READ4(long, "futex_time64",
Mark Wielaard 8f3bc4
+                          vki_u32 *, futex, int, op, int, val,
Mark Wielaard 8f3bc4
+                          struct timespec64 *, utime);
Mark Wielaard 8f3bc4
+         } else {
Mark Wielaard 8f3bc4
+            PRE_REG_READ4(long, "futex",
Mark Wielaard 8f3bc4
+                          vki_u32 *, futex, int, op, int, val,
Mark Wielaard 8f3bc4
+                          struct timespec *, utime);
Mark Wielaard 8f3bc4
+         }
Mark Wielaard 8f3bc4
          if (VG_(tdict).track_pre_reg_read)
Mark Wielaard 8f3bc4
             PRA6("futex",int,val3);
Mark Wielaard 8f3bc4
       }
Mark Wielaard 8f3bc4
@@ -1641,9 +1666,15 @@
Mark Wielaard 8f3bc4
       break;
Mark Wielaard 8f3bc4
    case VKI_FUTEX_WAIT:
Mark Wielaard 8f3bc4
    case VKI_FUTEX_LOCK_PI:
Mark Wielaard 8f3bc4
-      PRE_REG_READ4(long, "futex", 
Mark Wielaard 8f3bc4
-                    vki_u32 *, futex, int, op, int, val,
Mark Wielaard 8f3bc4
-                    struct timespec *, utime);
Mark Wielaard 8f3bc4
+      if (is_time64) {
Mark Wielaard 8f3bc4
+         PRE_REG_READ4(long, "futex_time64", 
Mark Wielaard 8f3bc4
+                       vki_u32 *, futex, int, op, int, val,
Mark Wielaard 8f3bc4
+                       struct timespec64 *, utime);
Mark Wielaard 8f3bc4
+      } else {
Mark Wielaard 8f3bc4
+         PRE_REG_READ4(long, "futex", 
Mark Wielaard 8f3bc4
+                       vki_u32 *, futex, int, op, int, val,
Mark Wielaard 8f3bc4
+                       struct timespec *, utime);
Mark Wielaard 8f3bc4
+      }
Mark Wielaard 8f3bc4
       break;
Mark Wielaard 8f3bc4
    case VKI_FUTEX_WAKE:
Mark Wielaard 8f3bc4
    case VKI_FUTEX_FD:
Mark Wielaard 8f3bc4
@@ -1665,8 +1696,15 @@
Mark Wielaard 8f3bc4
    case VKI_FUTEX_WAIT_BITSET:
Mark Wielaard 8f3bc4
    case VKI_FUTEX_WAIT_REQUEUE_PI:
Mark Wielaard 8f3bc4
       PRE_MEM_READ( "futex(futex)", ARG1, sizeof(Int) );
Mark Wielaard 8f3bc4
-      if (ARG4 != 0)
Mark Wielaard 8f3bc4
-	 PRE_MEM_READ( "futex(timeout)", ARG4, sizeof(struct vki_timespec) );
Mark Wielaard 8f3bc4
+      if (ARG4 != 0) {
Mark Wielaard 8f3bc4
+         if (is_time64) {
Mark Wielaard 8f3bc4
+	    PRE_MEM_READ( "futex_time64(timeout)", ARG4,
Mark Wielaard 8f3bc4
+                          sizeof(struct vki_timespec64) );
Mark Wielaard 8f3bc4
+         } else {
Mark Wielaard 8f3bc4
+	    PRE_MEM_READ( "futex(timeout)", ARG4,
Mark Wielaard 8f3bc4
+                          sizeof(struct vki_timespec) );
Mark Wielaard 8f3bc4
+         }
Mark Wielaard 8f3bc4
+      }
Mark Wielaard 8f3bc4
       break;
Mark Wielaard 8f3bc4
 
Mark Wielaard 8f3bc4
    case VKI_FUTEX_REQUEUE:
Mark Wielaard 8f3bc4
@@ -1690,7 +1728,9 @@
Mark Wielaard 8f3bc4
       break;
Mark Wielaard 8f3bc4
    }
Mark Wielaard 8f3bc4
 }
Mark Wielaard 8f3bc4
-POST(sys_futex)
Mark Wielaard 8f3bc4
+
Mark Wielaard 8f3bc4
+static void futex_post_helper ( ThreadId tid, SyscallArgs* arrghs,
Mark Wielaard 8f3bc4
+                                SyscallStatus* status )
Mark Wielaard 8f3bc4
 {
Mark Wielaard 8f3bc4
    vg_assert(SUCCESS);
Mark Wielaard 8f3bc4
    POST_MEM_WRITE( ARG1, sizeof(int) );
Mark Wielaard 8f3bc4
@@ -1705,6 +1745,30 @@
Mark Wielaard 8f3bc4
    }
Mark Wielaard 8f3bc4
 }
Mark Wielaard 8f3bc4
 
Mark Wielaard 8f3bc4
+PRE(sys_futex)
Mark Wielaard 8f3bc4
+{
Mark Wielaard 8f3bc4
+   PRINT("sys_futex ( %#" FMT_REGWORD "x, %ld, %ld, %#" FMT_REGWORD
Mark Wielaard 8f3bc4
+         "x, %#" FMT_REGWORD "x )", ARG1, SARG2, SARG3, ARG4, ARG5);
Mark Wielaard 8f3bc4
+   futex_pre_helper (tid, layout, arrghs, status, flags, False);
Mark Wielaard 8f3bc4
+}
Mark Wielaard 8f3bc4
+
Mark Wielaard 8f3bc4
+POST(sys_futex)
Mark Wielaard 8f3bc4
+{
Mark Wielaard 8f3bc4
+  futex_post_helper (tid, arrghs, status);
Mark Wielaard 8f3bc4
+}
Mark Wielaard 8f3bc4
+
Mark Wielaard 8f3bc4
+PRE(sys_futex_time64)
Mark Wielaard 8f3bc4
+{
Mark Wielaard 8f3bc4
+   PRINT("sys_futex_time64 ( %#" FMT_REGWORD "x, %ld, %ld, %#" FMT_REGWORD
Mark Wielaard 8f3bc4
+         "x, %#" FMT_REGWORD "x )", ARG1, SARG2, SARG3, ARG4, ARG5);
Mark Wielaard 8f3bc4
+   futex_pre_helper (tid, layout, arrghs, status, flags, True);
Mark Wielaard 8f3bc4
+}
Mark Wielaard 8f3bc4
+
Mark Wielaard 8f3bc4
+POST(sys_futex_time64)
Mark Wielaard 8f3bc4
+{
Mark Wielaard 8f3bc4
+  futex_post_helper (tid, arrghs, status);
Mark Wielaard 8f3bc4
+}
Mark Wielaard 8f3bc4
+
Mark Wielaard 8f3bc4
 PRE(sys_set_robust_list)
Mark Wielaard 8f3bc4
 {
Mark Wielaard 8f3bc4
    PRINT("sys_set_robust_list ( %#" FMT_REGWORD "x, %"
Mark Wielaard 8f3bc4
@@ -1747,16 +1811,22 @@
Mark Wielaard 8f3bc4
     vki_sigset_t adjusted_ss;
Mark Wielaard 8f3bc4
 };
Mark Wielaard 8f3bc4
 
Mark Wielaard 8f3bc4
-PRE(sys_pselect6)
Mark Wielaard 8f3bc4
+static void pselect6_pre_helper ( ThreadId tid, SyscallArgLayout* layout,
Mark Wielaard 8f3bc4
+                                  SyscallArgs* arrghs, SyscallStatus* status,
Mark Wielaard 8f3bc4
+                                  UWord* flags, Bool is_time64 )
Mark Wielaard 8f3bc4
 {
Mark Wielaard 8f3bc4
    *flags |= SfMayBlock | SfPostOnFail;
Mark Wielaard 8f3bc4
-   PRINT("sys_pselect6 ( %ld, %#" FMT_REGWORD "x, %#" FMT_REGWORD "x, %#"
Mark Wielaard 8f3bc4
-         FMT_REGWORD "x, %#" FMT_REGWORD "x, %#" FMT_REGWORD "x )",
Mark Wielaard 8f3bc4
-         SARG1, ARG2, ARG3, ARG4, ARG5, ARG6);
Mark Wielaard 8f3bc4
-   PRE_REG_READ6(long, "pselect6",
Mark Wielaard 8f3bc4
-                 int, n, vki_fd_set *, readfds, vki_fd_set *, writefds,
Mark Wielaard 8f3bc4
-                 vki_fd_set *, exceptfds, struct vki_timeval *, timeout,
Mark Wielaard 8f3bc4
-                 void *, sig);
Mark Wielaard 8f3bc4
+   if (is_time64) {
Mark Wielaard 8f3bc4
+      PRE_REG_READ6(long, "pselect6_time64",
Mark Wielaard 8f3bc4
+                    int, n, vki_fd_set *, readfds, vki_fd_set *, writefds,
Mark Wielaard 8f3bc4
+                    vki_fd_set *, exceptfds, struct vki_timespec64 *, timeout,
Mark Wielaard 8f3bc4
+                    void *, sig);
Mark Wielaard 8f3bc4
+   } else {
Mark Wielaard 8f3bc4
+      PRE_REG_READ6(long, "pselect6",
Mark Wielaard 8f3bc4
+                    int, n, vki_fd_set *, readfds, vki_fd_set *, writefds,
Mark Wielaard 8f3bc4
+                    vki_fd_set *, exceptfds, struct vki_timespec *, timeout,
Mark Wielaard 8f3bc4
+                    void *, sig);
Mark Wielaard 8f3bc4
+   }
Mark Wielaard 8f3bc4
    // XXX: this possibly understates how much memory is read.
Mark Wielaard 8f3bc4
    if (ARG2 != 0)
Mark Wielaard 8f3bc4
       PRE_MEM_READ( "pselect6(readfds)",   
Mark Wielaard 8f3bc4
@@ -1767,8 +1837,15 @@
Mark Wielaard 8f3bc4
    if (ARG4 != 0)
Mark Wielaard 8f3bc4
       PRE_MEM_READ( "pselect6(exceptfds)", 
Mark Wielaard 8f3bc4
 		     ARG4, ARG1/8 /* __FD_SETSIZE/8 */ );
Mark Wielaard 8f3bc4
-   if (ARG5 != 0)
Mark Wielaard 8f3bc4
-      PRE_MEM_READ( "pselect6(timeout)", ARG5, sizeof(struct vki_timeval) );
Mark Wielaard 8f3bc4
+   if (ARG5 != 0) {
Mark Wielaard 8f3bc4
+      if (is_time64) {
Mark Wielaard 8f3bc4
+         PRE_MEM_READ( "pselect6_time64(timeout)", ARG5,
Mark Wielaard 8f3bc4
+                       sizeof(struct vki_timespec64) );
Mark Wielaard 8f3bc4
+      } else {
Mark Wielaard 8f3bc4
+         PRE_MEM_READ( "pselect6(timeout)", ARG5,
Mark Wielaard 8f3bc4
+                       sizeof(struct vki_timespec) );
Mark Wielaard 8f3bc4
+      }
Mark Wielaard 8f3bc4
+   }
Mark Wielaard 8f3bc4
    if (ARG6 != 0) {
Mark Wielaard 8f3bc4
       const struct pselect_sized_sigset *pss =
Mark Wielaard 8f3bc4
           (struct pselect_sized_sigset *)(Addr)ARG6;
Mark Wielaard 8f3bc4
@@ -1796,6 +1873,15 @@
Mark Wielaard 8f3bc4
       }
Mark Wielaard 8f3bc4
    }
Mark Wielaard 8f3bc4
 }
Mark Wielaard 8f3bc4
+
Mark Wielaard 8f3bc4
+PRE(sys_pselect6)
Mark Wielaard 8f3bc4
+{
Mark Wielaard 8f3bc4
+   PRINT("sys_pselect6 ( %ld, %#" FMT_REGWORD "x, %#" FMT_REGWORD "x, %#"
Mark Wielaard 8f3bc4
+         FMT_REGWORD "x, %#" FMT_REGWORD "x, %#" FMT_REGWORD "x )",
Mark Wielaard 8f3bc4
+         SARG1, ARG2, ARG3, ARG4, ARG5, ARG6);
Mark Wielaard 8f3bc4
+   pselect6_pre_helper (tid, layout, arrghs, status, flags, False);
Mark Wielaard 8f3bc4
+}
Mark Wielaard 8f3bc4
+
Mark Wielaard 8f3bc4
 POST(sys_pselect6)
Mark Wielaard 8f3bc4
 {
Mark Wielaard 8f3bc4
    if (ARG6 != 0 && ARG6 != 1) {
Mark Wielaard 8f3bc4
@@ -1803,7 +1889,24 @@
Mark Wielaard 8f3bc4
    }
Mark Wielaard 8f3bc4
 }
Mark Wielaard 8f3bc4
 
Mark Wielaard 8f3bc4
-PRE(sys_ppoll)
Mark Wielaard 8f3bc4
+PRE(sys_pselect6_time64)
Mark Wielaard 8f3bc4
+{
Mark Wielaard 8f3bc4
+   PRINT("sys_pselect6_time64 ( %ld, %#" FMT_REGWORD "x, %#" FMT_REGWORD "x, %#"
Mark Wielaard 8f3bc4
+         FMT_REGWORD "x, %#" FMT_REGWORD "x, %#" FMT_REGWORD "x )",
Mark Wielaard 8f3bc4
+         SARG1, ARG2, ARG3, ARG4, ARG5, ARG6);
Mark Wielaard 8f3bc4
+   pselect6_pre_helper (tid, layout, arrghs, status, flags, True);
Mark Wielaard 8f3bc4
+}
Mark Wielaard 8f3bc4
+
Mark Wielaard 8f3bc4
+POST(sys_pselect6_time64)
Mark Wielaard 8f3bc4
+{
Mark Wielaard 8f3bc4
+   if (ARG6 != 0 && ARG6 != 1) {
Mark Wielaard 8f3bc4
+       VG_(free)((struct pselect_adjusted_sigset *)(Addr)ARG6);
Mark Wielaard 8f3bc4
+   }
Mark Wielaard 8f3bc4
+}
Mark Wielaard 8f3bc4
+
Mark Wielaard 8f3bc4
+static void ppoll_pre_helper ( ThreadId tid, SyscallArgLayout* layout,
Mark Wielaard 8f3bc4
+                               SyscallArgs* arrghs, SyscallStatus* status,
Mark Wielaard 8f3bc4
+                               UWord* flags, Bool is_time64 )
Mark Wielaard 8f3bc4
 {
Mark Wielaard 8f3bc4
    UInt i;
Mark Wielaard 8f3bc4
    struct vki_pollfd* ufds = (struct vki_pollfd *)(Addr)ARG1;
Mark Wielaard 8f3bc4
@@ -1811,10 +1914,17 @@
Mark Wielaard 8f3bc4
    PRINT("sys_ppoll ( %#" FMT_REGWORD "x, %" FMT_REGWORD "u, %#" FMT_REGWORD
Mark Wielaard 8f3bc4
          "x, %#" FMT_REGWORD "x, %" FMT_REGWORD "u )\n",
Mark Wielaard 8f3bc4
          ARG1, ARG2, ARG3, ARG4, ARG5);
Mark Wielaard 8f3bc4
-   PRE_REG_READ5(long, "ppoll",
Mark Wielaard 8f3bc4
-                 struct vki_pollfd *, ufds, unsigned int, nfds,
Mark Wielaard 8f3bc4
-                 struct vki_timespec *, tsp, vki_sigset_t *, sigmask,
Mark Wielaard 8f3bc4
-                 vki_size_t, sigsetsize);
Mark Wielaard 8f3bc4
+   if (is_time64) {
Mark Wielaard 8f3bc4
+      PRE_REG_READ5(long, "ppoll_time64",
Mark Wielaard 8f3bc4
+                    struct vki_pollfd *, ufds, unsigned int, nfds,
Mark Wielaard 8f3bc4
+                    struct vki_timespec64 *, tsp, vki_sigset_t *, sigmask,
Mark Wielaard 8f3bc4
+                    vki_size_t, sigsetsize);
Mark Wielaard 8f3bc4
+   } else {
Mark Wielaard 8f3bc4
+      PRE_REG_READ5(long, "ppoll",
Mark Wielaard 8f3bc4
+                    struct vki_pollfd *, ufds, unsigned int, nfds,
Mark Wielaard 8f3bc4
+                    struct vki_timespec *, tsp, vki_sigset_t *, sigmask,
Mark Wielaard 8f3bc4
+                    vki_size_t, sigsetsize);
Mark Wielaard 8f3bc4
+   }
Mark Wielaard 8f3bc4
 
Mark Wielaard 8f3bc4
    for (i = 0; i < ARG2; i++) {
Mark Wielaard 8f3bc4
       PRE_MEM_READ( "ppoll(ufds.fd)",
Mark Wielaard 8f3bc4
@@ -1825,8 +1935,15 @@
Mark Wielaard 8f3bc4
                      (Addr)(&ufds[i].revents), sizeof(ufds[i].revents) );
Mark Wielaard 8f3bc4
    }
Mark Wielaard 8f3bc4
 
Mark Wielaard 8f3bc4
-   if (ARG3)
Mark Wielaard 8f3bc4
-      PRE_MEM_READ( "ppoll(tsp)", ARG3, sizeof(struct vki_timespec) );
Mark Wielaard 8f3bc4
+   if (ARG3) {
Mark Wielaard 8f3bc4
+      if (is_time64) {
Mark Wielaard 8f3bc4
+         PRE_MEM_READ( "ppoll_time64(tsp)", ARG3,
Mark Wielaard 8f3bc4
+                       sizeof(struct vki_timespec64) );
Mark Wielaard 8f3bc4
+      } else {
Mark Wielaard 8f3bc4
+         PRE_MEM_READ( "ppoll(tsp)", ARG3,
Mark Wielaard 8f3bc4
+                       sizeof(struct vki_timespec) );
Mark Wielaard 8f3bc4
+      }
Mark Wielaard 8f3bc4
+   }
Mark Wielaard 8f3bc4
    if (ARG4 != 0 && sizeof(vki_sigset_t) == ARG5) {
Mark Wielaard 8f3bc4
       const vki_sigset_t *guest_sigmask = (vki_sigset_t *)(Addr)ARG4;
Mark Wielaard 8f3bc4
       PRE_MEM_READ( "ppoll(sigmask)", ARG4, ARG5);
Mark Wielaard 8f3bc4
@@ -1842,7 +1959,8 @@
Mark Wielaard 8f3bc4
    }
Mark Wielaard 8f3bc4
 }
Mark Wielaard 8f3bc4
 
Mark Wielaard 8f3bc4
-POST(sys_ppoll)
Mark Wielaard 8f3bc4
+static void ppoll_post_helper ( ThreadId tid, SyscallArgs* arrghs,
Mark Wielaard 8f3bc4
+                                SyscallStatus* status )
Mark Wielaard 8f3bc4
 {
Mark Wielaard 8f3bc4
    vg_assert(SUCCESS || FAILURE);
Mark Wielaard 8f3bc4
    if (SUCCESS && (RES >= 0)) {
Mark Wielaard 8f3bc4
@@ -1856,6 +1974,32 @@
Mark Wielaard 8f3bc4
    }
Mark Wielaard 8f3bc4
 }
Mark Wielaard 8f3bc4
 
Mark Wielaard 8f3bc4
+PRE(sys_ppoll)
Mark Wielaard 8f3bc4
+{
Mark Wielaard 8f3bc4
+   PRINT("sys_ppoll ( %#" FMT_REGWORD "x, %" FMT_REGWORD "u, %#" FMT_REGWORD
Mark Wielaard 8f3bc4
+         "x, %#" FMT_REGWORD "x, %" FMT_REGWORD "u )\n",
Mark Wielaard 8f3bc4
+         ARG1, ARG2, ARG3, ARG4, ARG5);
Mark Wielaard 8f3bc4
+   ppoll_pre_helper (tid, layout, arrghs, status, flags, False);
Mark Wielaard 8f3bc4
+}
Mark Wielaard 8f3bc4
+
Mark Wielaard 8f3bc4
+POST(sys_ppoll)
Mark Wielaard 8f3bc4
+{
Mark Wielaard 8f3bc4
+   ppoll_post_helper (tid, arrghs, status);
Mark Wielaard 8f3bc4
+}
Mark Wielaard 8f3bc4
+
Mark Wielaard 8f3bc4
+PRE(sys_ppoll_time64)
Mark Wielaard 8f3bc4
+{
Mark Wielaard 8f3bc4
+   PRINT("sys_ppoll_time64 ( %#" FMT_REGWORD "x, %" FMT_REGWORD
Mark Wielaard 8f3bc4
+         "u, %#" FMT_REGWORD "x, %#" FMT_REGWORD "x, %" FMT_REGWORD "u )\n",
Mark Wielaard 8f3bc4
+         ARG1, ARG2, ARG3, ARG4, ARG5);
Mark Wielaard 8f3bc4
+   ppoll_pre_helper (tid, layout, arrghs, status, flags, False);
Mark Wielaard 8f3bc4
+}
Mark Wielaard 8f3bc4
+
Mark Wielaard 8f3bc4
+POST(sys_ppoll_time64)
Mark Wielaard 8f3bc4
+{
Mark Wielaard 8f3bc4
+   ppoll_post_helper (tid, arrghs, status);
Mark Wielaard 8f3bc4
+}
Mark Wielaard 8f3bc4
+
Mark Wielaard 8f3bc4
 
Mark Wielaard 8f3bc4
 /* ---------------------------------------------------------------------
Mark Wielaard 8f3bc4
    epoll_* wrappers
Mark Wielaard 8f3bc4
@@ -2644,6 +2788,26 @@
Mark Wielaard 8f3bc4
    }
Mark Wielaard 8f3bc4
 }
Mark Wielaard 8f3bc4
 
Mark Wielaard 8f3bc4
+PRE(sys_mq_timedsend_time64)
Mark Wielaard 8f3bc4
+{
Mark Wielaard 8f3bc4
+   *flags |= SfMayBlock;
Mark Wielaard 8f3bc4
+   PRINT("sys_mq_timedsend_time64 ( %ld, %#" FMT_REGWORD "x, %" FMT_REGWORD
Mark Wielaard 8f3bc4
+         "u, %" FMT_REGWORD "u, %#" FMT_REGWORD "x )",
Mark Wielaard 8f3bc4
+         SARG1,ARG2,ARG3,ARG4,ARG5);
Mark Wielaard 8f3bc4
+   PRE_REG_READ5(long, "mq_timedsend_time64",
Mark Wielaard 8f3bc4
+                 vki_mqd_t, mqdes, const char *, msg_ptr, vki_size_t, msg_len,
Mark Wielaard 8f3bc4
+                 unsigned int, msg_prio,
Mark Wielaard 8f3bc4
+                 const struct vki_timespec64 *, abs_timeout);
Mark Wielaard 8f3bc4
+   if (!ML_(fd_allowed)(ARG1, "mq_timedsend_time64", tid, False)) {
Mark Wielaard 8f3bc4
+      SET_STATUS_Failure( VKI_EBADF );
Mark Wielaard 8f3bc4
+   } else {
Mark Wielaard 8f3bc4
+      PRE_MEM_READ( "mq_timedsend_time64(msg_ptr)", ARG2, ARG3 );
Mark Wielaard 8f3bc4
+      if (ARG5 != 0)
Mark Wielaard 8f3bc4
+         PRE_MEM_READ( "mq_timedsend_time64(abs_timeout)", ARG5,
Mark Wielaard 8f3bc4
+                        sizeof(struct vki_timespec64) );
Mark Wielaard 8f3bc4
+   }
Mark Wielaard 8f3bc4
+}
Mark Wielaard 8f3bc4
+
Mark Wielaard 8f3bc4
 PRE(sys_mq_timedreceive)
Mark Wielaard 8f3bc4
 {
Mark Wielaard 8f3bc4
    *flags |= SfMayBlock;
Mark Wielaard 8f3bc4
@@ -2673,6 +2837,36 @@
Mark Wielaard 8f3bc4
       POST_MEM_WRITE( ARG4, sizeof(unsigned int) );
Mark Wielaard 8f3bc4
 }
Mark Wielaard 8f3bc4
 
Mark Wielaard 8f3bc4
+PRE(sys_mq_timedreceive_time64)
Mark Wielaard 8f3bc4
+{
Mark Wielaard 8f3bc4
+   *flags |= SfMayBlock;
Mark Wielaard 8f3bc4
+   PRINT("sys_mq_timedreceive_time64( %ld, %#" FMT_REGWORD "x, %"
Mark Wielaard 8f3bc4
+         FMT_REGWORD "u, %#" FMT_REGWORD "x, %#" FMT_REGWORD "x )",
Mark Wielaard 8f3bc4
+         SARG1,ARG2,ARG3,ARG4,ARG5);
Mark Wielaard 8f3bc4
+   PRE_REG_READ5(ssize_t, "mq_timedreceive_time64",
Mark Wielaard 8f3bc4
+                 vki_mqd_t, mqdes, char *, msg_ptr, vki_size_t, msg_len,
Mark Wielaard 8f3bc4
+                 unsigned int *, msg_prio,
Mark Wielaard 8f3bc4
+                 const struct vki_timespec64 *, abs_timeout);
Mark Wielaard 8f3bc4
+   if (!ML_(fd_allowed)(ARG1, "mq_timedreceive_time64", tid, False)) {
Mark Wielaard 8f3bc4
+      SET_STATUS_Failure( VKI_EBADF );
Mark Wielaard 8f3bc4
+   } else {
Mark Wielaard 8f3bc4
+      PRE_MEM_WRITE( "mq_timedreceive_time64(msg_ptr)", ARG2, ARG3 );
Mark Wielaard 8f3bc4
+      if (ARG4 != 0)
Mark Wielaard 8f3bc4
+         PRE_MEM_WRITE( "mq_timedreceive_time64(msg_prio)",
Mark Wielaard 8f3bc4
+                        ARG4, sizeof(unsigned int) );
Mark Wielaard 8f3bc4
+      if (ARG5 != 0)
Mark Wielaard 8f3bc4
+         PRE_MEM_READ( "mq_timedreceive_time64(abs_timeout)",
Mark Wielaard 8f3bc4
+                        ARG5, sizeof(struct vki_timespec64) );
Mark Wielaard 8f3bc4
+   }
Mark Wielaard 8f3bc4
+}
Mark Wielaard 8f3bc4
+
Mark Wielaard 8f3bc4
+POST(sys_mq_timedreceive_time64)
Mark Wielaard 8f3bc4
+{
Mark Wielaard 8f3bc4
+   POST_MEM_WRITE( ARG2, RES );
Mark Wielaard 8f3bc4
+   if (ARG4 != 0)
Mark Wielaard 8f3bc4
+      POST_MEM_WRITE( ARG4, sizeof(unsigned int) );
Mark Wielaard 8f3bc4
+}
Mark Wielaard 8f3bc4
+
Mark Wielaard 8f3bc4
 PRE(sys_mq_notify)
Mark Wielaard 8f3bc4
 {
Mark Wielaard 8f3bc4
    PRINT("sys_mq_notify( %ld, %#" FMT_REGWORD "x )", SARG1, ARG2 );
Mark Wielaard 8f3bc4
@@ -2723,6 +2917,14 @@
Mark Wielaard 8f3bc4
    PRE_MEM_READ( "clock_settime(tp)", ARG2, sizeof(struct vki_timespec) );
Mark Wielaard 8f3bc4
 }
Mark Wielaard 8f3bc4
 
Mark Wielaard 8f3bc4
+PRE(sys_clock_settime64)
Mark Wielaard 8f3bc4
+{
Mark Wielaard 8f3bc4
+   PRINT("sys_clock_settime64( %ld, %#" FMT_REGWORD "x )", SARG1, ARG2);
Mark Wielaard 8f3bc4
+   PRE_REG_READ2(long, "clock_settime64",
Mark Wielaard 8f3bc4
+                 vki_clockid_t, clk_id, const struct timespec64 *, tp);
Mark Wielaard 8f3bc4
+   PRE_MEM_READ( "clock_settime64(tp)", ARG2, sizeof(struct vki_timespec64) );
Mark Wielaard 8f3bc4
+}
Mark Wielaard 8f3bc4
+
Mark Wielaard 8f3bc4
 PRE(sys_clock_gettime)
Mark Wielaard 8f3bc4
 {
Mark Wielaard 8f3bc4
    PRINT("sys_clock_gettime( %ld, %#" FMT_REGWORD "x )" , SARG1, ARG2);
Mark Wielaard 8f3bc4
@@ -2735,6 +2937,18 @@
Mark Wielaard 8f3bc4
    POST_MEM_WRITE( ARG2, sizeof(struct vki_timespec) );
Mark Wielaard 8f3bc4
 }
Mark Wielaard 8f3bc4
 
Mark Wielaard 8f3bc4
+PRE(sys_clock_gettime64)
Mark Wielaard 8f3bc4
+{
Mark Wielaard 8f3bc4
+   PRINT("sys_clock_gettime64( %ld, %#" FMT_REGWORD "x )" , SARG1, ARG2);
Mark Wielaard 8f3bc4
+   PRE_REG_READ2(long, "clock_gettime64",
Mark Wielaard 8f3bc4
+                 vki_clockid_t, clk_id, struct vki_timespec64 *, tp);
Mark Wielaard 8f3bc4
+   PRE_MEM_WRITE( "clock_gettime64(tp)", ARG2, sizeof(struct vki_timespec64) );
Mark Wielaard 8f3bc4
+}
Mark Wielaard 8f3bc4
+POST(sys_clock_gettime64)
Mark Wielaard 8f3bc4
+{
Mark Wielaard 8f3bc4
+   POST_MEM_WRITE( ARG2, sizeof(struct vki_timespec64) );
Mark Wielaard 8f3bc4
+}
Mark Wielaard 8f3bc4
+
Mark Wielaard 8f3bc4
 PRE(sys_clock_getres)
Mark Wielaard 8f3bc4
 {
Mark Wielaard 8f3bc4
    PRINT("sys_clock_getres( %ld, %#" FMT_REGWORD "x )" , SARG1, ARG2);
Mark Wielaard 8f3bc4
@@ -2751,6 +2965,23 @@
Mark Wielaard 8f3bc4
       POST_MEM_WRITE( ARG2, sizeof(struct vki_timespec) );
Mark Wielaard 8f3bc4
 }
Mark Wielaard 8f3bc4
 
Mark Wielaard 8f3bc4
+PRE(sys_clock_getres_time64)
Mark Wielaard 8f3bc4
+{
Mark Wielaard 8f3bc4
+   PRINT("sys_clock_getres_time64( %ld, %#" FMT_REGWORD "x )" , SARG1, ARG2);
Mark Wielaard 8f3bc4
+   // Nb: we can't use "RES" as the param name because that's a macro
Mark Wielaard 8f3bc4
+   // defined above!
Mark Wielaard 8f3bc4
+   PRE_REG_READ2(long, "clock_getres_time64",
Mark Wielaard 8f3bc4
+                 vki_clockid_t, clk_id, struct vki_timespec64 *, res);
Mark Wielaard 8f3bc4
+   if (ARG2 != 0)
Mark Wielaard 8f3bc4
+      PRE_MEM_WRITE( "clock_getres_time64(res)", ARG2,
Mark Wielaard 8f3bc4
+		     sizeof(struct vki_timespec64) );
Mark Wielaard 8f3bc4
+}
Mark Wielaard 8f3bc4
+POST(sys_clock_getres_time64)
Mark Wielaard 8f3bc4
+{
Mark Wielaard 8f3bc4
+   if (ARG2 != 0)
Mark Wielaard 8f3bc4
+      POST_MEM_WRITE( ARG2, sizeof(struct vki_timespec64) );
Mark Wielaard 8f3bc4
+}
Mark Wielaard 8f3bc4
+
Mark Wielaard 8f3bc4
 PRE(sys_clock_nanosleep)
Mark Wielaard 8f3bc4
 {
Mark Wielaard 8f3bc4
    *flags |= SfMayBlock|SfPostOnFail;
Mark Wielaard 8f3bc4
@@ -2770,6 +3001,28 @@
Mark Wielaard 8f3bc4
       POST_MEM_WRITE( ARG4, sizeof(struct vki_timespec) );
Mark Wielaard 8f3bc4
 }
Mark Wielaard 8f3bc4
 
Mark Wielaard 8f3bc4
+PRE(sys_clock_nanosleep_time64)
Mark Wielaard 8f3bc4
+{
Mark Wielaard 8f3bc4
+   *flags |= SfMayBlock|SfPostOnFail;
Mark Wielaard 8f3bc4
+   PRINT("sys_clock_nanosleep_time64( %ld, %ld, %#" FMT_REGWORD "x, %#"
Mark Wielaard 8f3bc4
+         FMT_REGWORD "x )",
Mark Wielaard 8f3bc4
+         SARG1, SARG2, ARG3, ARG4);
Mark Wielaard 8f3bc4
+   PRE_REG_READ4(int32_t, "clock_nanosleep_time64",
Mark Wielaard 8f3bc4
+                 vki_clockid_t, clkid, int, flags,
Mark Wielaard 8f3bc4
+                 const struct vki_timespec64 *, rqtp,
Mark Wielaard 8f3bc4
+		 struct vki_timespec64 *, rmtp);
Mark Wielaard 8f3bc4
+   PRE_MEM_READ( "clock_nanosleep_time64(rqtp)", ARG3,
Mark Wielaard 8f3bc4
+		 sizeof(struct vki_timespec64) );
Mark Wielaard 8f3bc4
+   if (ARG4 != 0)
Mark Wielaard 8f3bc4
+      PRE_MEM_WRITE( "clock_nanosleep_time64(rmtp)", ARG4,
Mark Wielaard 8f3bc4
+		     sizeof(struct vki_timespec64) );
Mark Wielaard 8f3bc4
+}
Mark Wielaard 8f3bc4
+POST(sys_clock_nanosleep_time64)
Mark Wielaard 8f3bc4
+{
Mark Wielaard 8f3bc4
+   if (ARG4 != 0 && FAILURE && ERR == VKI_EINTR)
Mark Wielaard 8f3bc4
+      POST_MEM_WRITE( ARG4, sizeof(struct vki_timespec64) );
Mark Wielaard 8f3bc4
+}
Mark Wielaard 8f3bc4
+
Mark Wielaard 8f3bc4
 /* ---------------------------------------------------------------------
Mark Wielaard 8f3bc4
    timer_* wrappers
Mark Wielaard 8f3bc4
    ------------------------------------------------------------------ */
Mark Wielaard 8f3bc4
@@ -2821,6 +3074,26 @@
Mark Wielaard 8f3bc4
       POST_MEM_WRITE( ARG4, sizeof(struct vki_itimerspec) );
Mark Wielaard 8f3bc4
 }
Mark Wielaard 8f3bc4
 
Mark Wielaard 8f3bc4
+PRE(sys_timer_settime64)
Mark Wielaard 8f3bc4
+{
Mark Wielaard 8f3bc4
+   PRINT("sys_timer_settime64( %ld, %ld, %#" FMT_REGWORD "x, %#"
Mark Wielaard 8f3bc4
+          FMT_REGWORD "x )", SARG1,SARG2,ARG3,ARG4);
Mark Wielaard 8f3bc4
+   PRE_REG_READ4(long, "timer_settime64", 
Mark Wielaard 8f3bc4
+                 vki_timer_t, timerid, int, flags,
Mark Wielaard 8f3bc4
+                 const struct vki_itimerspec64 *, value,
Mark Wielaard 8f3bc4
+                 struct vki_itimerspec64 *, ovalue);
Mark Wielaard 8f3bc4
+   PRE_MEM_READ( "timer_settime64(value)", ARG3,
Mark Wielaard 8f3bc4
+                  sizeof(struct vki_itimerspec64) );
Mark Wielaard 8f3bc4
+   if (ARG4 != 0)
Mark Wielaard 8f3bc4
+       PRE_MEM_WRITE( "timer_settime64(ovalue)", ARG4,
Mark Wielaard 8f3bc4
+                      sizeof(struct vki_itimerspec64) );
Mark Wielaard 8f3bc4
+}
Mark Wielaard 8f3bc4
+POST(sys_timer_settime64)
Mark Wielaard 8f3bc4
+{
Mark Wielaard 8f3bc4
+   if (ARG4 != 0)
Mark Wielaard 8f3bc4
+      POST_MEM_WRITE( ARG4, sizeof(struct vki_itimerspec64) );
Mark Wielaard 8f3bc4
+}
Mark Wielaard 8f3bc4
+
Mark Wielaard 8f3bc4
 PRE(sys_timer_gettime)
Mark Wielaard 8f3bc4
 {
Mark Wielaard 8f3bc4
    PRINT("sys_timer_gettime( %ld, %#" FMT_REGWORD "x )", SARG1, ARG2);
Mark Wielaard 8f3bc4
@@ -2834,6 +3107,19 @@
Mark Wielaard 8f3bc4
    POST_MEM_WRITE( ARG2, sizeof(struct vki_itimerspec) );
Mark Wielaard 8f3bc4
 }
Mark Wielaard 8f3bc4
 
Mark Wielaard 8f3bc4
+PRE(sys_timer_gettime64)
Mark Wielaard 8f3bc4
+{
Mark Wielaard 8f3bc4
+   PRINT("sys_timer_gettime64( %ld, %#" FMT_REGWORD "x )", SARG1, ARG2);
Mark Wielaard 8f3bc4
+   PRE_REG_READ2(long, "timer_gettime64", 
Mark Wielaard 8f3bc4
+                 vki_timer_t, timerid, struct vki_itimerspec64 *, value);
Mark Wielaard 8f3bc4
+   PRE_MEM_WRITE( "timer_gettime64(value)", ARG2,
Mark Wielaard 8f3bc4
+                  sizeof(struct vki_itimerspec64));
Mark Wielaard 8f3bc4
+}
Mark Wielaard 8f3bc4
+POST(sys_timer_gettime64)
Mark Wielaard 8f3bc4
+{
Mark Wielaard 8f3bc4
+   POST_MEM_WRITE( ARG2, sizeof(struct vki_itimerspec64) );
Mark Wielaard 8f3bc4
+}
Mark Wielaard 8f3bc4
+
Mark Wielaard 8f3bc4
 PRE(sys_timer_getoverrun)
Mark Wielaard 8f3bc4
 {
Mark Wielaard 8f3bc4
    PRINT("sys_timer_getoverrun( %#" FMT_REGWORD "x )", ARG1);
Mark Wielaard 8f3bc4
@@ -2940,6 +3226,24 @@
Mark Wielaard 8f3bc4
       POST_MEM_WRITE(ARG2, sizeof(struct vki_itimerspec));
Mark Wielaard 8f3bc4
 }
Mark Wielaard 8f3bc4
 
Mark Wielaard 8f3bc4
+PRE(sys_timerfd_gettime64)
Mark Wielaard 8f3bc4
+{
Mark Wielaard 8f3bc4
+   PRINT("sys_timerfd_gettime64 ( %ld, %#" FMT_REGWORD "x )", SARG1, ARG2);
Mark Wielaard 8f3bc4
+   PRE_REG_READ2(long, "timerfd_gettime64",
Mark Wielaard 8f3bc4
+                 int, ufd,
Mark Wielaard 8f3bc4
+                 struct vki_itimerspec64*, otmr);
Mark Wielaard 8f3bc4
+   if (!ML_(fd_allowed)(ARG1, "timerfd_gettime64", tid, False))
Mark Wielaard 8f3bc4
+      SET_STATUS_Failure(VKI_EBADF);
Mark Wielaard 8f3bc4
+   else
Mark Wielaard 8f3bc4
+      PRE_MEM_WRITE("timerfd_gettime64(result)",
Mark Wielaard 8f3bc4
+                    ARG2, sizeof(struct vki_itimerspec64));
Mark Wielaard 8f3bc4
+}
Mark Wielaard 8f3bc4
+POST(sys_timerfd_gettime64)
Mark Wielaard 8f3bc4
+{
Mark Wielaard 8f3bc4
+   if (RES == 0)
Mark Wielaard 8f3bc4
+      POST_MEM_WRITE(ARG2, sizeof(struct vki_itimerspec64));
Mark Wielaard 8f3bc4
+}
Mark Wielaard 8f3bc4
+
Mark Wielaard 8f3bc4
 PRE(sys_timerfd_settime)
Mark Wielaard 8f3bc4
 {
Mark Wielaard 8f3bc4
    PRINT("sys_timerfd_settime ( %ld, %ld, %#" FMT_REGWORD "x, %#"
Mark Wielaard 8f3bc4
@@ -2968,6 +3272,34 @@
Mark Wielaard 8f3bc4
       POST_MEM_WRITE(ARG4, sizeof(struct vki_itimerspec));
Mark Wielaard 8f3bc4
 }
Mark Wielaard 8f3bc4
 
Mark Wielaard 8f3bc4
+PRE(sys_timerfd_settime64)
Mark Wielaard 8f3bc4
+{
Mark Wielaard 8f3bc4
+   PRINT("sys_timerfd_settime64 ( %ld, %ld, %#" FMT_REGWORD "x, %#"
Mark Wielaard 8f3bc4
+         FMT_REGWORD "x )", SARG1, SARG2, ARG3, ARG4);
Mark Wielaard 8f3bc4
+   PRE_REG_READ4(long, "timerfd_settime64",
Mark Wielaard 8f3bc4
+                 int, ufd,
Mark Wielaard 8f3bc4
+                 int, flags,
Mark Wielaard 8f3bc4
+                 const struct vki_itimerspec64*, utmr,
Mark Wielaard 8f3bc4
+                 struct vki_itimerspec64*, otmr);
Mark Wielaard 8f3bc4
+   if (!ML_(fd_allowed)(ARG1, "timerfd_settime64", tid, False))
Mark Wielaard 8f3bc4
+      SET_STATUS_Failure(VKI_EBADF);
Mark Wielaard 8f3bc4
+   else
Mark Wielaard 8f3bc4
+   {
Mark Wielaard 8f3bc4
+      PRE_MEM_READ("timerfd_settime64(result)",
Mark Wielaard 8f3bc4
+                   ARG3, sizeof(struct vki_itimerspec64));
Mark Wielaard 8f3bc4
+      if (ARG4)
Mark Wielaard 8f3bc4
+      {
Mark Wielaard 8f3bc4
+         PRE_MEM_WRITE("timerfd_settime64(result)",
Mark Wielaard 8f3bc4
+                       ARG4, sizeof(struct vki_itimerspec64));
Mark Wielaard 8f3bc4
+      }
Mark Wielaard 8f3bc4
+   }
Mark Wielaard 8f3bc4
+}
Mark Wielaard 8f3bc4
+POST(sys_timerfd_settime64)
Mark Wielaard 8f3bc4
+{
Mark Wielaard 8f3bc4
+   if (RES == 0 && ARG4 != 0)
Mark Wielaard 8f3bc4
+      POST_MEM_WRITE(ARG4, sizeof(struct vki_itimerspec64));
Mark Wielaard 8f3bc4
+}
Mark Wielaard 8f3bc4
+
Mark Wielaard 8f3bc4
 /* ---------------------------------------------------------------------
Mark Wielaard 8f3bc4
    capabilities wrappers
Mark Wielaard 8f3bc4
    ------------------------------------------------------------------ */
Mark Wielaard 8f3bc4
@@ -3350,6 +3682,22 @@
Mark Wielaard 8f3bc4
    POST_MEM_WRITE(ARG2, sizeof(struct vki_timespec));
Mark Wielaard 8f3bc4
 }
Mark Wielaard 8f3bc4
 
Mark Wielaard 8f3bc4
+PRE(sys_sched_rr_get_interval_time64)
Mark Wielaard 8f3bc4
+{
Mark Wielaard 8f3bc4
+   PRINT("sys_sched_rr_get_interval_time64 ( %ld, %#" FMT_REGWORD "x )",
Mark Wielaard 8f3bc4
+         SARG1, ARG2);
Mark Wielaard 8f3bc4
+   PRE_REG_READ2(int, "sched_rr_get_interval_time64",
Mark Wielaard 8f3bc4
+                 vki_pid_t, pid,
Mark Wielaard 8f3bc4
+                 struct vki_timespec *, tp);
Mark Wielaard 8f3bc4
+   PRE_MEM_WRITE("sched_rr_get_interval_time64(timespec)",
Mark Wielaard 8f3bc4
+                 ARG2, sizeof(struct vki_timespec64));
Mark Wielaard 8f3bc4
+}
Mark Wielaard 8f3bc4
+
Mark Wielaard 8f3bc4
+POST(sys_sched_rr_get_interval_time64)
Mark Wielaard 8f3bc4
+{
Mark Wielaard 8f3bc4
+   POST_MEM_WRITE(ARG2, sizeof(struct vki_timespec64));
Mark Wielaard 8f3bc4
+}
Mark Wielaard 8f3bc4
+
Mark Wielaard 8f3bc4
 PRE(sys_sched_setaffinity)
Mark Wielaard 8f3bc4
 {
Mark Wielaard 8f3bc4
    PRINT("sched_setaffinity ( %ld, %" FMT_REGWORD "u, %#" FMT_REGWORD "x )",
Mark Wielaard 8f3bc4
@@ -4067,6 +4415,31 @@
Mark Wielaard 8f3bc4
       POST_MEM_WRITE( ARG2, sizeof(vki_siginfo_t) );
Mark Wielaard 8f3bc4
 }
Mark Wielaard 8f3bc4
 
Mark Wielaard 8f3bc4
+PRE(sys_rt_sigtimedwait_time64)
Mark Wielaard 8f3bc4
+{
Mark Wielaard 8f3bc4
+   *flags |= SfMayBlock;
Mark Wielaard 8f3bc4
+   PRINT("sys_rt_sigtimedwait_time64 ( %#" FMT_REGWORD "x, %#"
Mark Wielaard 8f3bc4
+         FMT_REGWORD "x, %#" FMT_REGWORD "x, %" FMT_REGWORD "u )",
Mark Wielaard 8f3bc4
+         ARG1, ARG2, ARG3, ARG4);
Mark Wielaard 8f3bc4
+   PRE_REG_READ4(long, "rt_sigtimedwait_time64", 
Mark Wielaard 8f3bc4
+                 const vki_sigset_t *, set, vki_siginfo_t *, info,
Mark Wielaard 8f3bc4
+                 const struct vki_timespec64 *, timeout,
Mark Wielaard 8f3bc4
+                 vki_size_t, sigsetsize);
Mark Wielaard 8f3bc4
+   if (ARG1 != 0) 
Mark Wielaard 8f3bc4
+      PRE_MEM_READ( "rt_sigtimedwait_time64(set)", ARG1, sizeof(vki_sigset_t) );
Mark Wielaard 8f3bc4
+   if (ARG2 != 0)
Mark Wielaard 8f3bc4
+      PRE_MEM_WRITE( "rt_sigtimedwait_time64(info)", ARG2,
Mark Wielaard 8f3bc4
+                     sizeof(vki_siginfo_t) );
Mark Wielaard 8f3bc4
+   if (ARG3 != 0)
Mark Wielaard 8f3bc4
+      PRE_MEM_READ( "rt_sigtimedwait_time64(timeout)",
Mark Wielaard 8f3bc4
+                    ARG3, sizeof(struct vki_timespec64) );
Mark Wielaard 8f3bc4
+}
Mark Wielaard 8f3bc4
+POST(sys_rt_sigtimedwait_time64)
Mark Wielaard 8f3bc4
+{
Mark Wielaard 8f3bc4
+   if (ARG2 != 0)
Mark Wielaard 8f3bc4
+      POST_MEM_WRITE( ARG2, sizeof(vki_siginfo_t) );
Mark Wielaard 8f3bc4
+}
Mark Wielaard 8f3bc4
+
Mark Wielaard 8f3bc4
 PRE(sys_rt_sigqueueinfo)
Mark Wielaard 8f3bc4
 {
Mark Wielaard 8f3bc4
    PRINT("sys_rt_sigqueueinfo(%ld, %ld, %#" FMT_REGWORD "x)",
Mark Wielaard 8f3bc4
@@ -4515,6 +4888,21 @@
Mark Wielaard 8f3bc4
    ML_(generic_PRE_sys_semtimedop)(tid, ARG1,ARG2,ARG3,ARG4);
Mark Wielaard 8f3bc4
 }
Mark Wielaard 8f3bc4
 
Mark Wielaard 8f3bc4
+PRE(sys_semtimedop_time64)
Mark Wielaard 8f3bc4
+{
Mark Wielaard 8f3bc4
+   *flags |= SfMayBlock;
Mark Wielaard 8f3bc4
+   PRINT("sys_semtimedop_time64 ( %ld, %#" FMT_REGWORD "x, %"
Mark Wielaard 8f3bc4
+         FMT_REGWORD "u, %#" FMT_REGWORD "x )", SARG1, ARG2, ARG3, ARG4);
Mark Wielaard 8f3bc4
+   PRE_REG_READ4(long, "semtimedop_time64",
Mark Wielaard 8f3bc4
+                 int, semid, struct sembuf *, sops, unsigned, nsoops,
Mark Wielaard 8f3bc4
+                 struct vki_timespec64 *, timeout);
Mark Wielaard 8f3bc4
+   PRE_MEM_READ( "semtimedop_time64(sops)", ARG1,
Mark Wielaard 8f3bc4
+                 ARG2 * sizeof(struct vki_sembuf) );
Mark Wielaard 8f3bc4
+   if (ARG3 != 0)
Mark Wielaard 8f3bc4
+      PRE_MEM_READ( "semtimedop_time64(timeout)", ARG3,
Mark Wielaard 8f3bc4
+                    sizeof(struct vki_timespec64) );
Mark Wielaard 8f3bc4
+}
Mark Wielaard 8f3bc4
+
Mark Wielaard 8f3bc4
 PRE(sys_msgget)
Mark Wielaard 8f3bc4
 {
Mark Wielaard 8f3bc4
    PRINT("sys_msgget ( %ld, %ld )", SARG1, SARG2);
Mark Wielaard 8f3bc4
@@ -5324,6 +5712,36 @@
Mark Wielaard 8f3bc4
    }
Mark Wielaard 8f3bc4
 }
Mark Wielaard 8f3bc4
 
Mark Wielaard 8f3bc4
+PRE(sys_utimensat_time64)
Mark Wielaard 8f3bc4
+{
Mark Wielaard 8f3bc4
+   PRINT("sys_utimensat_time64 ( %ld, %#" FMT_REGWORD "x(%s), %#"
Mark Wielaard 8f3bc4
+         FMT_REGWORD "x, 0x%" FMT_REGWORD "x )",
Mark Wielaard 8f3bc4
+         SARG1, ARG2, (HChar*)(Addr)ARG2, ARG3, ARG4);
Mark Wielaard 8f3bc4
+   PRE_REG_READ4(long, "utimensat_time64",
Mark Wielaard 8f3bc4
+                 int, dfd, char *, filename, struct timespec *, utimes, int, flags);
Mark Wielaard 8f3bc4
+   if (ARG2 != 0)
Mark Wielaard 8f3bc4
+      PRE_MEM_RASCIIZ( "utimensat_time64(filename)", ARG2 );
Mark Wielaard 8f3bc4
+   if (ARG3 != 0) {
Mark Wielaard 8f3bc4
+      /* If timespec.tv_nsec has the special value UTIME_NOW or UTIME_OMIT
Mark Wielaard 8f3bc4
+         then the tv_sec field is ignored.  */
Mark Wielaard 8f3bc4
+      struct vki_timespec64 *times = (struct vki_timespec64 *)(Addr)ARG3;
Mark Wielaard 8f3bc4
+      PRE_MEM_READ( "utimensat_time64(times[0].tv_nsec)",
Mark Wielaard 8f3bc4
+                    (Addr)&times[0].tv_nsec, sizeof(times[0].tv_nsec));
Mark Wielaard 8f3bc4
+      PRE_MEM_READ( "utimensat_time64(times[1].tv_nsec)",
Mark Wielaard 8f3bc4
+                    (Addr)&times[1].tv_nsec, sizeof(times[1].tv_nsec));
Mark Wielaard 8f3bc4
+      if (ML_(safe_to_deref)(times, 2 * sizeof(struct vki_timespec64))) {
Mark Wielaard 8f3bc4
+         if (times[0].tv_nsec != VKI_UTIME_NOW
Mark Wielaard 8f3bc4
+             && times[0].tv_nsec != VKI_UTIME_OMIT)
Mark Wielaard 8f3bc4
+            PRE_MEM_READ( "utimensat_time64(times[0].tv_sec)",
Mark Wielaard 8f3bc4
+                          (Addr)&times[0].tv_sec, sizeof(times[0].tv_sec));
Mark Wielaard 8f3bc4
+         if (times[1].tv_nsec != VKI_UTIME_NOW
Mark Wielaard 8f3bc4
+             && times[1].tv_nsec != VKI_UTIME_OMIT)
Mark Wielaard 8f3bc4
+            PRE_MEM_READ( "utimensat_time64(times[1].tv_sec)",
Mark Wielaard 8f3bc4
+                          (Addr)&times[1].tv_sec, sizeof(times[1].tv_sec));
Mark Wielaard 8f3bc4
+      }
Mark Wielaard 8f3bc4
+   }
Mark Wielaard 8f3bc4
+}
Mark Wielaard 8f3bc4
+
Mark Wielaard 8f3bc4
 PRE(sys_newfstatat)
Mark Wielaard 8f3bc4
 {
Mark Wielaard 8f3bc4
    FUSE_COMPATIBLE_MAY_BLOCK();
Mark Wielaard 8f3bc4
@@ -5816,6 +6234,34 @@
Mark Wielaard 8f3bc4
    ML_(linux_POST_sys_recvmmsg) (tid, RES, ARG1,ARG2,ARG3,ARG4,ARG5);
Mark Wielaard 8f3bc4
 }
Mark Wielaard 8f3bc4
 
Mark Wielaard 8f3bc4
+PRE(sys_recvmmsg_time64)
Mark Wielaard 8f3bc4
+{
Mark Wielaard 8f3bc4
+   *flags |= SfMayBlock;
Mark Wielaard 8f3bc4
+   PRINT("sys_recvmmsg_time64 ( %ld, %#" FMT_REGWORD "x, %ld, %ld, %#"
Mark Wielaard 8f3bc4
+         FMT_REGWORD "x )",
Mark Wielaard 8f3bc4
+         SARG1, ARG2, SARG3, SARG4, ARG5);
Mark Wielaard 8f3bc4
+   PRE_REG_READ5(long, "recvmmsg_time64",
Mark Wielaard 8f3bc4
+                 int, s, struct mmsghdr *, mmsg, int, vlen,
Mark Wielaard 8f3bc4
+                 int, flags, struct vki_timespec64 *, timeout);
Mark Wielaard 8f3bc4
+   struct vki_mmsghdr *mmsg = (struct vki_mmsghdr *)ARG2;
Mark Wielaard 8f3bc4
+   HChar name[40];     // large enough
Mark Wielaard 8f3bc4
+   UInt i;
Mark Wielaard 8f3bc4
+   for (i = 0; i < ARG3; i++) {
Mark Wielaard 8f3bc4
+      VG_(sprintf)(name, "mmsg[%u].msg_hdr", i);
Mark Wielaard 8f3bc4
+      ML_(generic_PRE_sys_recvmsg)(tid, name, &mmsg[i].msg_hdr);
Mark Wielaard 8f3bc4
+      VG_(sprintf)(name, "recvmmsg(mmsg[%u].msg_len)", i);
Mark Wielaard 8f3bc4
+      PRE_MEM_WRITE( name, (Addr)&mmsg[i].msg_len, sizeof(mmsg[i].msg_len) );
Mark Wielaard 8f3bc4
+   }
Mark Wielaard 8f3bc4
+   if (ARG5)
Mark Wielaard 8f3bc4
+      PRE_MEM_READ( "recvmmsg(timeout)", ARG5, sizeof(struct vki_timespec64) );
Mark Wielaard 8f3bc4
+}
Mark Wielaard 8f3bc4
+
Mark Wielaard 8f3bc4
+POST(sys_recvmmsg_time64)
Mark Wielaard 8f3bc4
+{
Mark Wielaard 8f3bc4
+   /* ARG5 isn't actually used, so just use the generic POST. */
Mark Wielaard 8f3bc4
+   ML_(linux_POST_sys_recvmmsg) (tid, RES, ARG1,ARG2,ARG3,ARG4,ARG5);
Mark Wielaard 8f3bc4
+}
Mark Wielaard 8f3bc4
+
Mark Wielaard 8f3bc4
 /* ---------------------------------------------------------------------
Mark Wielaard 8f3bc4
    key retention service wrappers
Mark Wielaard 8f3bc4
    ------------------------------------------------------------------ */
Mark Wielaard 8f3bc4
@@ -12312,3 +12758,4 @@
Mark Wielaard 8f3bc4
 /*--------------------------------------------------------------------*/
Mark Wielaard 8f3bc4
 /*--- end                                                          ---*/
Mark Wielaard 8f3bc4
 /*--------------------------------------------------------------------*/
Mark Wielaard 8f3bc4
+
Mark Wielaard 8f3bc4
diff -ur valgrind-3.15.0.orig/coregrind/m_syswrap/syswrap-mips32-linux.c valgrind-3.15.0/coregrind/m_syswrap/syswrap-mips32-linux.c
Mark Wielaard 8f3bc4
--- valgrind-3.15.0.orig/coregrind/m_syswrap/syswrap-mips32-linux.c	2019-04-13 12:56:21.000000000 +0200
Mark Wielaard 8f3bc4
+++ valgrind-3.15.0/coregrind/m_syswrap/syswrap-mips32-linux.c	2020-02-28 15:48:55.507851274 +0100
Mark Wielaard 8f3bc4
@@ -1066,7 +1066,29 @@
Mark Wielaard 8f3bc4
    //..
Mark Wielaard 8f3bc4
    LINX_(__NR_membarrier,              sys_membarrier),              // 358
Mark Wielaard 8f3bc4
    //..
Mark Wielaard 8f3bc4
-   LINXY(__NR_statx,                   sys_statx)                    // 366
Mark Wielaard 8f3bc4
+   LINXY(__NR_statx,                   sys_statx),                   // 366
Mark Wielaard 8f3bc4
+
Mark Wielaard 8f3bc4
+   LINXY(__NR_clock_gettime64,         sys_clock_gettime64),         // 403
Mark Wielaard 8f3bc4
+   LINX_(__NR_clock_settime64,         sys_clock_settime64),         // 404
Mark Wielaard 8f3bc4
+
Mark Wielaard 8f3bc4
+   LINXY(__NR_clock_getres_time64,     sys_clock_getres_time64),     // 406
Mark Wielaard 8f3bc4
+   LINXY(__NR_clock_nanosleep_time64,  sys_clock_nanosleep_time64),  // 407
Mark Wielaard 8f3bc4
+   LINXY(__NR_timer_gettime64,         sys_timer_gettime64),         // 408
Mark Wielaard 8f3bc4
+   LINXY(__NR_timer_settime64,         sys_timer_settime64),         // 409
Mark Wielaard 8f3bc4
+   LINXY(__NR_timerfd_gettime64,       sys_timerfd_gettime64),       // 410
Mark Wielaard 8f3bc4
+   LINXY(__NR_timerfd_settime64,       sys_timerfd_settime64),       // 411
Mark Wielaard 8f3bc4
+   LINX_(__NR_utimensat_time64,        sys_utimensat_time64),        // 412
Mark Wielaard 8f3bc4
+   LINXY(__NR_pselect6_time64,         sys_pselect6_time64),         // 413
Mark Wielaard 8f3bc4
+   LINXY(__NR_ppoll_time64,            sys_ppoll_time64),            // 414
Mark Wielaard 8f3bc4
+
Mark Wielaard 8f3bc4
+   LINXY(__NR_recvmmsg_time64,         sys_recvmmsg_time64),         // 417
Mark Wielaard 8f3bc4
+   LINX_(__NR_mq_timedsend_time64,     sys_mq_timedsend_time64),     // 418
Mark Wielaard 8f3bc4
+   LINXY(__NR_mq_timedreceive_time64,  sys_mq_timedreceive_time64),  // 419
Mark Wielaard 8f3bc4
+   LINX_(__NR_semtimedop_time64,       sys_semtimedop_time64),       // 420
Mark Wielaard 8f3bc4
+   LINXY(__NR_rt_sigtimedwait_time64,  sys_rt_sigtimedwait_time64),  // 421
Mark Wielaard 8f3bc4
+   LINXY(__NR_futex_time64,            sys_futex_time64),            // 422
Mark Wielaard 8f3bc4
+   LINXY(__NR_sched_rr_get_interval_time64,
Mark Wielaard 8f3bc4
+         sys_sched_rr_get_interval_time64),                          // 423
Mark Wielaard 8f3bc4
 };
Mark Wielaard 8f3bc4
 
Mark Wielaard 8f3bc4
 SyscallTableEntry* ML_(get_linux_syscall_entry) (UInt sysno)
Mark Wielaard 8f3bc4
diff -ur valgrind-3.15.0.orig/coregrind/m_syswrap/syswrap-ppc32-linux.c valgrind-3.15.0/coregrind/m_syswrap/syswrap-ppc32-linux.c
Mark Wielaard 8f3bc4
--- valgrind-3.15.0.orig/coregrind/m_syswrap/syswrap-ppc32-linux.c	2020-02-28 14:02:29.809342221 +0100
Mark Wielaard 8f3bc4
+++ valgrind-3.15.0/coregrind/m_syswrap/syswrap-ppc32-linux.c	2020-02-28 14:55:44.626692770 +0100
Mark Wielaard 8f3bc4
@@ -1024,6 +1024,28 @@
Mark Wielaard 8f3bc4
    LINX_(__NR_copy_file_range,   sys_copy_file_range),  // 379
Mark Wielaard 8f3bc4
 
Mark Wielaard 8f3bc4
    LINXY(__NR_statx,             sys_statx),            // 383
Mark Wielaard 8f3bc4
+
Mark Wielaard 8f3bc4
+   LINXY(__NR_clock_gettime64,   sys_clock_gettime64),  // 403
Mark Wielaard 8f3bc4
+   LINX_(__NR_clock_settime64,   sys_clock_settime64),  // 404
Mark Wielaard 8f3bc4
+
Mark Wielaard 8f3bc4
+   LINXY(__NR_clock_getres_time64, sys_clock_getres_time64), // 406
Mark Wielaard 8f3bc4
+   LINXY(__NR_clock_nanosleep_time64, sys_clock_nanosleep_time64), // 407
Mark Wielaard 8f3bc4
+   LINXY(__NR_timer_gettime64,   sys_timer_gettime64),  // 408
Mark Wielaard 8f3bc4
+   LINXY(__NR_timer_settime64,   sys_timer_settime64),  // 409
Mark Wielaard 8f3bc4
+   LINXY(__NR_timerfd_gettime64, sys_timerfd_gettime64),// 410
Mark Wielaard 8f3bc4
+   LINXY(__NR_timerfd_settime64, sys_timerfd_settime64),// 411
Mark Wielaard 8f3bc4
+   LINX_(__NR_utimensat_time64,  sys_utimensat_time64), // 412
Mark Wielaard 8f3bc4
+   LINXY(__NR_pselect6_time64,   sys_pselect6_time64),  // 413
Mark Wielaard 8f3bc4
+   LINXY(__NR_ppoll_time64,      sys_ppoll_time64),     // 414
Mark Wielaard 8f3bc4
+
Mark Wielaard 8f3bc4
+   LINXY(__NR_recvmmsg_time64,   sys_recvmmsg_time64),  // 417
Mark Wielaard 8f3bc4
+   LINX_(__NR_mq_timedsend_time64, sys_mq_timedsend_time64), // 418
Mark Wielaard 8f3bc4
+   LINXY(__NR_mq_timedreceive_time64, sys_mq_timedreceive_time64), // 419
Mark Wielaard 8f3bc4
+   LINX_(__NR_semtimedop_time64, sys_semtimedop_time64),// 420
Mark Wielaard 8f3bc4
+   LINXY(__NR_rt_sigtimedwait_time64, sys_rt_sigtimedwait_time64), // 421
Mark Wielaard 8f3bc4
+   LINXY(__NR_futex_time64,      sys_futex_time64),     // 422
Mark Wielaard 8f3bc4
+   LINXY(__NR_sched_rr_get_interval_time64,
Mark Wielaard 8f3bc4
+         sys_sched_rr_get_interval_time64),             // 423
Mark Wielaard 8f3bc4
 };
Mark Wielaard 8f3bc4
 
Mark Wielaard 8f3bc4
 SyscallTableEntry* ML_(get_linux_syscall_entry) ( UInt sysno )
Mark Wielaard 8f3bc4
diff -ur valgrind-3.15.0.orig/coregrind/m_syswrap/syswrap-x86-linux.c valgrind-3.15.0/coregrind/m_syswrap/syswrap-x86-linux.c
Mark Wielaard 8f3bc4
--- valgrind-3.15.0.orig/coregrind/m_syswrap/syswrap-x86-linux.c	2020-02-28 14:02:29.844341714 +0100
Mark Wielaard 8f3bc4
+++ valgrind-3.15.0/coregrind/m_syswrap/syswrap-x86-linux.c	2020-02-28 15:44:37.688691592 +0100
Mark Wielaard 8f3bc4
@@ -1618,7 +1618,30 @@
Mark Wielaard 8f3bc4
    LINXY(__NR_statx,             sys_statx),            // 383
Mark Wielaard 8f3bc4
 
Mark Wielaard 8f3bc4
    /* Explicitly not supported on i386 yet. */
Mark Wielaard 8f3bc4
-   GENX_(__NR_arch_prctl,        sys_ni_syscall)        // 384
Mark Wielaard 8f3bc4
+   GENX_(__NR_arch_prctl,        sys_ni_syscall),       // 384
Mark Wielaard 8f3bc4
+
Mark Wielaard 8f3bc4
+   LINXY(__NR_clock_gettime64,   sys_clock_gettime64),  // 403
Mark Wielaard 8f3bc4
+   LINX_(__NR_clock_settime64,   sys_clock_settime64),  // 404
Mark Wielaard 8f3bc4
+
Mark Wielaard 8f3bc4
+   LINXY(__NR_clock_getres_time64, sys_clock_getres_time64), // 406
Mark Wielaard 8f3bc4
+   LINXY(__NR_clock_nanosleep_time64, sys_clock_nanosleep_time64), // 407
Mark Wielaard 8f3bc4
+   LINXY(__NR_timer_gettime64,   sys_timer_gettime64),  // 408
Mark Wielaard 8f3bc4
+   LINXY(__NR_timer_settime64,   sys_timer_settime64),  // 409
Mark Wielaard 8f3bc4
+   LINXY(__NR_timerfd_gettime64, sys_timerfd_gettime64),// 410
Mark Wielaard 8f3bc4
+   LINXY(__NR_timerfd_settime64, sys_timerfd_settime64),// 411
Mark Wielaard 8f3bc4
+   LINX_(__NR_utimensat_time64,  sys_utimensat_time64), // 412
Mark Wielaard 8f3bc4
+   LINXY(__NR_pselect6_time64,   sys_pselect6_time64),  // 413
Mark Wielaard 8f3bc4
+   LINXY(__NR_ppoll_time64,      sys_ppoll_time64),     // 414
Mark Wielaard 8f3bc4
+
Mark Wielaard 8f3bc4
+   LINXY(__NR_recvmmsg_time64,   sys_recvmmsg_time64),  // 417
Mark Wielaard 8f3bc4
+   LINX_(__NR_mq_timedsend_time64, sys_mq_timedsend_time64), // 418
Mark Wielaard 8f3bc4
+   LINXY(__NR_mq_timedreceive_time64, sys_mq_timedreceive_time64), // 419
Mark Wielaard 8f3bc4
+   LINX_(__NR_semtimedop_time64, sys_semtimedop_time64),// 420
Mark Wielaard 8f3bc4
+   LINXY(__NR_rt_sigtimedwait_time64, sys_rt_sigtimedwait_time64), // 421
Mark Wielaard 8f3bc4
+   LINXY(__NR_futex_time64,      sys_futex_time64),     // 422
Mark Wielaard 8f3bc4
+   LINXY(__NR_sched_rr_get_interval_time64,
Mark Wielaard 8f3bc4
+         sys_sched_rr_get_interval_time64),             // 423
Mark Wielaard 8f3bc4
+
Mark Wielaard 8f3bc4
 };
Mark Wielaard 8f3bc4
 
Mark Wielaard 8f3bc4
 SyscallTableEntry* ML_(get_linux_syscall_entry) ( UInt sysno )
Mark Wielaard 8f3bc4
diff -ur valgrind-3.15.0.orig/include/pub_tool_vkiscnums_asm.h valgrind-3.15.0/include/pub_tool_vkiscnums_asm.h
Mark Wielaard 8f3bc4
--- valgrind-3.15.0.orig/include/pub_tool_vkiscnums_asm.h	2019-04-13 12:56:21.000000000 +0200
Mark Wielaard 8f3bc4
+++ valgrind-3.15.0/include/pub_tool_vkiscnums_asm.h	2020-02-28 14:55:44.627692759 +0100
Mark Wielaard 8f3bc4
@@ -34,30 +34,43 @@
Mark Wielaard 8f3bc4
 #define __PUB_TOOL_VKISCNUMS_ASM_H
Mark Wielaard 8f3bc4
 
Mark Wielaard 8f3bc4
 #if defined(VGP_x86_linux)
Mark Wielaard 8f3bc4
+#  include "vki/vki-scnums-shared-linux.h"
Mark Wielaard 8f3bc4
+#  include "vki/vki-scnums-32bit-linux.h"
Mark Wielaard 8f3bc4
 #  include "vki/vki-scnums-x86-linux.h"
Mark Wielaard 8f3bc4
 
Mark Wielaard 8f3bc4
 #elif defined(VGP_amd64_linux)
Mark Wielaard 8f3bc4
+#  include "vki/vki-scnums-shared-linux.h"
Mark Wielaard 8f3bc4
 #  include "vki/vki-scnums-amd64-linux.h"
Mark Wielaard 8f3bc4
 
Mark Wielaard 8f3bc4
 #elif defined(VGP_ppc32_linux)
Mark Wielaard 8f3bc4
+#  include "vki/vki-scnums-shared-linux.h"
Mark Wielaard 8f3bc4
+#  include "vki/vki-scnums-32bit-linux.h"
Mark Wielaard 8f3bc4
 #  include "vki/vki-scnums-ppc32-linux.h"
Mark Wielaard 8f3bc4
 
Mark Wielaard 8f3bc4
 #elif defined(VGP_ppc64be_linux) || defined(VGP_ppc64le_linux)
Mark Wielaard 8f3bc4
+#  include "vki/vki-scnums-shared-linux.h"
Mark Wielaard 8f3bc4
 #  include "vki/vki-scnums-ppc64-linux.h"
Mark Wielaard 8f3bc4
 
Mark Wielaard 8f3bc4
 #elif defined(VGP_s390x_linux)
Mark Wielaard 8f3bc4
+#  include "vki/vki-scnums-shared-linux.h"
Mark Wielaard 8f3bc4
 #  include "vki/vki-scnums-s390x-linux.h"
Mark Wielaard 8f3bc4
 
Mark Wielaard 8f3bc4
 #elif defined(VGP_arm_linux)
Mark Wielaard 8f3bc4
+#  include "vki/vki-scnums-shared-linux.h"
Mark Wielaard 8f3bc4
+#  include "vki/vki-scnums-32bit-linux.h"
Mark Wielaard 8f3bc4
 #  include "vki/vki-scnums-arm-linux.h"
Mark Wielaard 8f3bc4
 
Mark Wielaard 8f3bc4
 #elif defined(VGP_arm64_linux)
Mark Wielaard 8f3bc4
+#  include "vki/vki-scnums-shared-linux.h"
Mark Wielaard 8f3bc4
 #  include "vki/vki-scnums-arm64-linux.h"
Mark Wielaard 8f3bc4
 
Mark Wielaard 8f3bc4
 #elif defined(VGP_mips32_linux)
Mark Wielaard 8f3bc4
+#  include "vki/vki-scnums-shared-linux.h"
Mark Wielaard 8f3bc4
+#  include "vki/vki-scnums-32bit-linux.h"
Mark Wielaard 8f3bc4
 #  include "vki/vki-scnums-mips32-linux.h"
Mark Wielaard 8f3bc4
 
Mark Wielaard 8f3bc4
 #elif defined(VGP_mips64_linux)
Mark Wielaard 8f3bc4
+#  include "vki/vki-scnums-shared-linux.h"
Mark Wielaard 8f3bc4
 #  include "vki/vki-scnums-mips64-linux.h"
Mark Wielaard 8f3bc4
 
Mark Wielaard 8f3bc4
 #elif defined(VGP_x86_darwin) || defined(VGP_amd64_darwin)
Mark Wielaard 8f3bc4
diff -ur valgrind-3.15.0.orig/include/vki/vki-linux.h valgrind-3.15.0/include/vki/vki-linux.h
Mark Wielaard 8f3bc4
--- valgrind-3.15.0.orig/include/vki/vki-linux.h	2020-02-28 14:02:29.873341294 +0100
Mark Wielaard 8f3bc4
+++ valgrind-3.15.0/include/vki/vki-linux.h	2020-02-28 14:55:44.627692759 +0100
Mark Wielaard 8f3bc4
@@ -5130,6 +5130,20 @@
Mark Wielaard 8f3bc4
 	__vki_u32 id;
Mark Wielaard 8f3bc4
 } __attribute__((aligned(8)));
Mark Wielaard 8f3bc4
 
Mark Wielaard 8f3bc4
+/* Needed for 64bit time_t on 32bit arches.  */
Mark Wielaard 8f3bc4
+
Mark Wielaard 8f3bc4
+typedef vki_int64_t vki_time64_t;
Mark Wielaard 8f3bc4
+
Mark Wielaard 8f3bc4
+struct vki_timespec64 {
Mark Wielaard 8f3bc4
+   vki_time64_t tv_sec;
Mark Wielaard 8f3bc4
+   long tv_nsec;
Mark Wielaard 8f3bc4
+};
Mark Wielaard 8f3bc4
+
Mark Wielaard 8f3bc4
+struct vki_itimerspec64 {
Mark Wielaard 8f3bc4
+   struct vki_timespec it_interval;
Mark Wielaard 8f3bc4
+   struct vki_timespec it_value;
Mark Wielaard 8f3bc4
+};
Mark Wielaard 8f3bc4
+
Mark Wielaard 8f3bc4
 /*--------------------------------------------------------------------*/
Mark Wielaard 8f3bc4
 /*--- end                                                          ---*/
Mark Wielaard 8f3bc4
 /*--------------------------------------------------------------------*/
Mark Wielaard 8f3bc4
Only in valgrind-3.15.0/include/vki: vki-scnums-32bit-linux.h
Mark Wielaard 8f3bc4
diff -ur valgrind-3.15.0.orig/include/vki/vki-scnums-amd64-linux.h valgrind-3.15.0/include/vki/vki-scnums-amd64-linux.h
Mark Wielaard 8f3bc4
--- valgrind-3.15.0.orig/include/vki/vki-scnums-amd64-linux.h	2019-04-13 12:56:21.000000000 +0200
Mark Wielaard 8f3bc4
+++ valgrind-3.15.0/include/vki/vki-scnums-amd64-linux.h	2020-02-28 14:55:44.628692747 +0100
Mark Wielaard 8f3bc4
@@ -32,7 +32,7 @@
Mark Wielaard 8f3bc4
 #ifndef __VKI_SCNUMS_AMD64_LINUX_H
Mark Wielaard 8f3bc4
 #define __VKI_SCNUMS_AMD64_LINUX_H
Mark Wielaard 8f3bc4
 
Mark Wielaard 8f3bc4
-// Derived from linux-2.6/arch/x86/entry/syscalls/syscall_64.tbl
Mark Wielaard 8f3bc4
+// Derived from linux-5.2/arch/x86/entry/syscalls/syscall_64.tbl
Mark Wielaard 8f3bc4
 
Mark Wielaard 8f3bc4
 #define __NR_read                                0
Mark Wielaard 8f3bc4
 #define __NR_write                               1
Mark Wielaard 8f3bc4
@@ -414,6 +414,8 @@
Mark Wielaard 8f3bc4
 #define __NR_pkey_alloc         330
Mark Wielaard 8f3bc4
 #define __NR_pkey_free          331
Mark Wielaard 8f3bc4
 #define __NR_statx              332
Mark Wielaard 8f3bc4
+#define __NR_io_pgetevents	333
Mark Wielaard 8f3bc4
+#define __NR_rseq		334
Mark Wielaard 8f3bc4
 
Mark Wielaard 8f3bc4
 #endif /* __VKI_SCNUMS_AMD64_LINUX_H */
Mark Wielaard 8f3bc4
 
Mark Wielaard 8f3bc4
Only in valgrind-3.15.0/include/vki: vki-scnums-shared-linux.h
Mark Wielaard 8f3bc4
diff -ur valgrind-3.15.0.orig/include/vki/vki-scnums-x86-linux.h valgrind-3.15.0/include/vki/vki-scnums-x86-linux.h
Mark Wielaard 8f3bc4
--- valgrind-3.15.0.orig/include/vki/vki-scnums-x86-linux.h	2019-04-13 12:56:21.000000000 +0200
Mark Wielaard 8f3bc4
+++ valgrind-3.15.0/include/vki/vki-scnums-x86-linux.h	2020-02-28 14:55:44.628692747 +0100
Mark Wielaard 8f3bc4
@@ -32,7 +32,7 @@
Mark Wielaard 8f3bc4
 #ifndef __VKI_SCNUMS_X86_LINUX_H
Mark Wielaard 8f3bc4
 #define __VKI_SCNUMS_X86_LINUX_H
Mark Wielaard 8f3bc4
 
Mark Wielaard 8f3bc4
-// Derived from linux-2.6/arch/x86/entry/syscalls/syscall_32.tbl
Mark Wielaard 8f3bc4
+// Derived from linux-5.2/arch/x86/entry/syscalls/syscall_32.tbl
Mark Wielaard 8f3bc4
 
Mark Wielaard 8f3bc4
 #define __NR_restart_syscall      0
Mark Wielaard 8f3bc4
 #define __NR_exit		  1
Mark Wielaard 8f3bc4
@@ -419,6 +419,18 @@
Mark Wielaard 8f3bc4
 #define __NR_pkey_free          382
Mark Wielaard 8f3bc4
 #define __NR_statx              383
Mark Wielaard 8f3bc4
 #define __NR_arch_prctl         384
Mark Wielaard 8f3bc4
+#define __NR_io_pgetevents	385
Mark Wielaard 8f3bc4
+#define __NR_rseq		386
Mark Wielaard 8f3bc4
+#define __NR_semget		393
Mark Wielaard 8f3bc4
+#define __NR_semctl		394
Mark Wielaard 8f3bc4
+#define __NR_shmget		395
Mark Wielaard 8f3bc4
+#define __NR_shmctl		396
Mark Wielaard 8f3bc4
+#define __NR_shmat		397
Mark Wielaard 8f3bc4
+#define __NR_shmdt		398
Mark Wielaard 8f3bc4
+#define __NR_msgget		399
Mark Wielaard 8f3bc4
+#define __NR_msgsnd		400
Mark Wielaard 8f3bc4
+#define __NR_msgrcv		401
Mark Wielaard 8f3bc4
+#define __NR_msgctl		402
Mark Wielaard 8f3bc4
 
Mark Wielaard 8f3bc4
 #endif /* __VKI_SCNUMS_X86_LINUX_H */
Mark Wielaard 8f3bc4
 
Mark Wielaard 8f3bc4
diff --git a/include/vki/vki-scnums-32bit-linux.h b/include/vki/vki-scnums-32bit-linux.h
Mark Wielaard 8f3bc4
new file mode 100644
Mark Wielaard 8f3bc4
index 000000000..f276ddaed
Mark Wielaard 8f3bc4
--- /dev/null
Mark Wielaard 8f3bc4
+++ b/include/vki/vki-scnums-32bit-linux.h
Mark Wielaard 8f3bc4
@@ -0,0 +1,49 @@
Mark Wielaard 8f3bc4
+/*
Mark Wielaard 8f3bc4
+   This file is part of Valgrind, a dynamic binary instrumentation framework.
Mark Wielaard 8f3bc4
+
Mark Wielaard 8f3bc4
+   Copyright (C) 2019 Bart Van Assche <bvanassche@acm.org>
Mark Wielaard 8f3bc4
+
Mark Wielaard 8f3bc4
+   This program is free software; you can redistribute it and/or
Mark Wielaard 8f3bc4
+   modify it under the terms of the GNU General Public License as
Mark Wielaard 8f3bc4
+   published by the Free Software Foundation; either version 2 of the
Mark Wielaard 8f3bc4
+   License, or (at your option) any later version.
Mark Wielaard 8f3bc4
+
Mark Wielaard 8f3bc4
+   This program is distributed in the hope that it will be useful, but
Mark Wielaard 8f3bc4
+   WITHOUT ANY WARRANTY; without even the implied warranty of
Mark Wielaard 8f3bc4
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Mark Wielaard 8f3bc4
+   General Public License for more details.
Mark Wielaard 8f3bc4
+
Mark Wielaard 8f3bc4
+   You should have received a copy of the GNU General Public License
Mark Wielaard 8f3bc4
+   along with this program; if not, see <http://www.gnu.org/licenses/>.
Mark Wielaard 8f3bc4
+
Mark Wielaard 8f3bc4
+   The GNU General Public License is contained in the file COPYING.
Mark Wielaard 8f3bc4
+*/
Mark Wielaard 8f3bc4
+
Mark Wielaard 8f3bc4
+#ifndef __VKI_SCNUMS_32BIT_LINUX_H
Mark Wielaard 8f3bc4
+#define __VKI_SCNUMS_32BIT_LINUX_H
Mark Wielaard 8f3bc4
+
Mark Wielaard 8f3bc4
+// Derived from the __BITS_PER_LONG == 32 sections in
Mark Wielaard 8f3bc4
+// linux-5.2/include/uapi/asm-generic/unistd.h
Mark Wielaard 8f3bc4
+
Mark Wielaard 8f3bc4
+#define __NR_clock_gettime64	403
Mark Wielaard 8f3bc4
+#define __NR_clock_settime64	404
Mark Wielaard 8f3bc4
+#define __NR_clock_adjtime64	405
Mark Wielaard 8f3bc4
+#define __NR_clock_getres_time64	406
Mark Wielaard 8f3bc4
+#define __NR_clock_nanosleep_time64	407
Mark Wielaard 8f3bc4
+#define __NR_timer_gettime64	408
Mark Wielaard 8f3bc4
+#define __NR_timer_settime64	409
Mark Wielaard 8f3bc4
+#define __NR_timerfd_gettime64	410
Mark Wielaard 8f3bc4
+#define __NR_timerfd_settime64	411
Mark Wielaard 8f3bc4
+#define __NR_utimensat_time64	412
Mark Wielaard 8f3bc4
+#define __NR_pselect6_time64	413
Mark Wielaard 8f3bc4
+#define __NR_ppoll_time64	414
Mark Wielaard 8f3bc4
+#define __NR_io_pgetevents_time64	416
Mark Wielaard 8f3bc4
+#define __NR_recvmmsg_time64	417
Mark Wielaard 8f3bc4
+#define __NR_mq_timedsend_time64	418
Mark Wielaard 8f3bc4
+#define __NR_mq_timedreceive_time64	419
Mark Wielaard 8f3bc4
+#define __NR_semtimedop_time64	420
Mark Wielaard 8f3bc4
+#define __NR_rt_sigtimedwait_time64	421
Mark Wielaard 8f3bc4
+#define __NR_futex_time64	422
Mark Wielaard 8f3bc4
+#define __NR_sched_rr_get_interval_time64	423
Mark Wielaard 8f3bc4
+
Mark Wielaard 8f3bc4
+#endif
Mark Wielaard 8f3bc4
diff --git a/include/vki/vki-scnums-shared-linux.h b/include/vki/vki-scnums-shared-linux.h
Mark Wielaard 8f3bc4
new file mode 100644
Mark Wielaard 8f3bc4
index 000000000..6221d5a81
Mark Wielaard 8f3bc4
--- /dev/null
Mark Wielaard 8f3bc4
+++ b/include/vki/vki-scnums-shared-linux.h
Mark Wielaard 8f3bc4
@@ -0,0 +1,42 @@
Mark Wielaard 8f3bc4
+
Mark Wielaard 8f3bc4
+/* System call numbers for Linux that are shared across all architectures. */
Mark Wielaard 8f3bc4
+
Mark Wielaard 8f3bc4
+/*
Mark Wielaard 8f3bc4
+   This file is part of Valgrind, a dynamic binary instrumentation
Mark Wielaard 8f3bc4
+   framework.
Mark Wielaard 8f3bc4
+
Mark Wielaard 8f3bc4
+   Copyright (C) 2019 Bart Van Assche <bvanassche@acm.org>
Mark Wielaard 8f3bc4
+
Mark Wielaard 8f3bc4
+   This program is free software; you can redistribute it and/or
Mark Wielaard 8f3bc4
+   modify it under the terms of the GNU General Public License as
Mark Wielaard 8f3bc4
+   published by the Free Software Foundation; either version 2 of the
Mark Wielaard 8f3bc4
+   License, or (at your option) any later version.
Mark Wielaard 8f3bc4
+
Mark Wielaard 8f3bc4
+   This program is distributed in the hope that it will be useful, but
Mark Wielaard 8f3bc4
+   WITHOUT ANY WARRANTY; without even the implied warranty of
Mark Wielaard 8f3bc4
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Mark Wielaard 8f3bc4
+   General Public License for more details.
Mark Wielaard 8f3bc4
+
Mark Wielaard 8f3bc4
+   You should have received a copy of the GNU General Public License
Mark Wielaard 8f3bc4
+   along with this program; if not, see <http://www.gnu.org/licenses/>.
Mark Wielaard 8f3bc4
+
Mark Wielaard 8f3bc4
+   The GNU General Public License is contained in the file COPYING.
Mark Wielaard 8f3bc4
+*/
Mark Wielaard 8f3bc4
+
Mark Wielaard 8f3bc4
+#ifndef __VKI_SCNUMS_SHARED_LINUX_H
Mark Wielaard 8f3bc4
+#define __VKI_SCNUMS_SHARED_LINUX_H
Mark Wielaard 8f3bc4
+
Mark Wielaard 8f3bc4
+// Derived from linux-5.2/include/uapi/asm-generic/unistd.h
Mark Wielaard 8f3bc4
+
Mark Wielaard 8f3bc4
+#define __NR_pidfd_send_signal	424
Mark Wielaard 8f3bc4
+#define __NR_io_uring_setup	425
Mark Wielaard 8f3bc4
+#define __NR_io_uring_enter	426
Mark Wielaard 8f3bc4
+#define __NR_io_uring_register	427
Mark Wielaard 8f3bc4
+#define __NR_open_tree		428
Mark Wielaard 8f3bc4
+#define __NR_move_mount		429
Mark Wielaard 8f3bc4
+#define __NR_fsopen		430
Mark Wielaard 8f3bc4
+#define __NR_fsconfig		431
Mark Wielaard 8f3bc4
+#define __NR_fsmount		432
Mark Wielaard 8f3bc4
+#define __NR_fspick		433
Mark Wielaard 8f3bc4
+
Mark Wielaard 8f3bc4
+#endif
Mark Wielaard 8f3bc4
 
Mark Wielaard 8f3bc4
diff --git a/coregrind/m_syswrap/syswrap-linux.c b/coregrind/m_syswrap/syswrap-linux.c
Mark Wielaard 8f3bc4
index 14b78addb..1190a57d6 100644
Mark Wielaard 8f3bc4
--- a/coregrind/m_syswrap/syswrap-linux.c
Mark Wielaard 8f3bc4
+++ b/coregrind/m_syswrap/syswrap-linux.c
Mark Wielaard 8f3bc4
@@ -1622,6 +1622,20 @@ POST(sys_sendfile64)
Mark Wielaard 8f3bc4
    }
Mark Wielaard 8f3bc4
 }
Mark Wielaard 8f3bc4
 
Mark Wielaard 8f3bc4
+static void pre_read_timespec64 (ThreadId tid, const char *msg, UWord arg)
Mark Wielaard 8f3bc4
+{
Mark Wielaard 8f3bc4
+   struct vki_timespec64 *ts64 = (void *)(Addr)arg;
Mark Wielaard 8f3bc4
+   PRE_MEM_READ (msg, (Addr) &ts64->tv_sec, sizeof(vki_time64_t));
Mark Wielaard 8f3bc4
+   PRE_MEM_READ (msg, (Addr) &ts64->tv_nsec, sizeof(vki_int32_t));
Mark Wielaard 8f3bc4
+}
Mark Wielaard 8f3bc4
+
Mark Wielaard 8f3bc4
+static void pre_read_itimerspec64 (ThreadId tid, const char *msg, UWord arg)
Mark Wielaard 8f3bc4
+{
Mark Wielaard 8f3bc4
+   struct vki_itimerspec64 *its64 = (void *)(Addr)arg;
Mark Wielaard 8f3bc4
+   pre_read_timespec64 (tid, msg, (UWord) &its64->it_interval);
Mark Wielaard 8f3bc4
+   pre_read_timespec64 (tid, msg, (UWord) &its64->it_value);
Mark Wielaard 8f3bc4
+}
Mark Wielaard 8f3bc4
+
Mark Wielaard 8f3bc4
 static void futex_pre_helper ( ThreadId tid, SyscallArgLayout* layout,
Mark Wielaard 8f3bc4
                                SyscallArgs* arrghs, SyscallStatus* status,
Mark Wielaard 8f3bc4
                                UWord* flags, Bool is_time64 )
Mark Wielaard 8f3bc4
@@ -1736,8 +1750,7 @@ static void futex_pre_helper ( ThreadId tid, SyscallArgLayout* layout,
Mark Wielaard 8f3bc4
       PRE_MEM_READ( "futex(futex)", ARG1, sizeof(Int) );
Mark Wielaard 8f3bc4
       if (ARG4 != 0) {
Mark Wielaard 8f3bc4
          if (is_time64) {
Mark Wielaard 8f3bc4
-	    PRE_MEM_READ( "futex_time64(timeout)", ARG4,
Mark Wielaard 8f3bc4
-                          sizeof(struct vki_timespec64) );
Mark Wielaard 8f3bc4
+            pre_read_timespec64 (tid, "futex_time64(timeout)", ARG4);
Mark Wielaard 8f3bc4
          } else {
Mark Wielaard 8f3bc4
 	    PRE_MEM_READ( "futex(timeout)", ARG4,
Mark Wielaard 8f3bc4
                           sizeof(struct vki_timespec) );
Mark Wielaard 8f3bc4
@@ -1877,8 +1890,7 @@ static void pselect6_pre_helper ( ThreadId tid, SyscallArgLayout* layout,
Mark Wielaard 8f3bc4
 		     ARG4, ARG1/8 /* __FD_SETSIZE/8 */ );
Mark Wielaard 8f3bc4
    if (ARG5 != 0) {
Mark Wielaard 8f3bc4
       if (is_time64) {
Mark Wielaard 8f3bc4
-         PRE_MEM_READ( "pselect6_time64(timeout)", ARG5,
Mark Wielaard 8f3bc4
-                       sizeof(struct vki_timespec64) );
Mark Wielaard 8f3bc4
+         pre_read_timespec64(tid, "pselect6_time64(timeout)", ARG5);
Mark Wielaard 8f3bc4
       } else {
Mark Wielaard 8f3bc4
          PRE_MEM_READ( "pselect6(timeout)", ARG5,
Mark Wielaard 8f3bc4
                        sizeof(struct vki_timespec) );
Mark Wielaard 8f3bc4
@@ -1975,8 +1987,7 @@ static void ppoll_pre_helper ( ThreadId tid, SyscallArgLayout* layout,
Mark Wielaard 8f3bc4
 
Mark Wielaard 8f3bc4
    if (ARG3) {
Mark Wielaard 8f3bc4
       if (is_time64) {
Mark Wielaard 8f3bc4
-         PRE_MEM_READ( "ppoll_time64(tsp)", ARG3,
Mark Wielaard 8f3bc4
-                       sizeof(struct vki_timespec64) );
Mark Wielaard 8f3bc4
+         pre_read_timespec64(tid, "ppoll_time64(tsp)", ARG3);
Mark Wielaard 8f3bc4
       } else {
Mark Wielaard 8f3bc4
          PRE_MEM_READ( "ppoll(tsp)", ARG3,
Mark Wielaard 8f3bc4
                        sizeof(struct vki_timespec) );
Mark Wielaard 8f3bc4
@@ -2841,8 +2852,7 @@ PRE(sys_mq_timedsend_time64)
Mark Wielaard 8f3bc4
    } else {
Mark Wielaard 8f3bc4
       PRE_MEM_READ( "mq_timedsend_time64(msg_ptr)", ARG2, ARG3 );
Mark Wielaard 8f3bc4
       if (ARG5 != 0)
Mark Wielaard 8f3bc4
-         PRE_MEM_READ( "mq_timedsend_time64(abs_timeout)", ARG5,
Mark Wielaard 8f3bc4
-                        sizeof(struct vki_timespec64) );
Mark Wielaard 8f3bc4
+         pre_read_timespec64(tid, "mq_timedsend_time64(abs_timeout)", ARG5);
Mark Wielaard 8f3bc4
    }
Mark Wielaard 8f3bc4
 }
Mark Wielaard 8f3bc4
 
Mark Wielaard 8f3bc4
@@ -2893,8 +2903,7 @@ PRE(sys_mq_timedreceive_time64)
Mark Wielaard 8f3bc4
          PRE_MEM_WRITE( "mq_timedreceive_time64(msg_prio)",
Mark Wielaard 8f3bc4
                         ARG4, sizeof(unsigned int) );
Mark Wielaard 8f3bc4
       if (ARG5 != 0)
Mark Wielaard 8f3bc4
-         PRE_MEM_READ( "mq_timedreceive_time64(abs_timeout)",
Mark Wielaard 8f3bc4
-                        ARG5, sizeof(struct vki_timespec64) );
Mark Wielaard 8f3bc4
+         pre_read_timespec64(tid, "mq_timedreceive_time64(abs_timeout)", ARG5);
Mark Wielaard 8f3bc4
    }
Mark Wielaard 8f3bc4
 }
Mark Wielaard 8f3bc4
 
Mark Wielaard 8f3bc4
@@ -2960,7 +2969,7 @@ PRE(sys_clock_settime64)
Mark Wielaard 8f3bc4
    PRINT("sys_clock_settime64( %ld, %#" FMT_REGWORD "x )", SARG1, ARG2);
Mark Wielaard 8f3bc4
    PRE_REG_READ2(long, "clock_settime64",
Mark Wielaard 8f3bc4
                  vki_clockid_t, clk_id, const struct timespec64 *, tp);
Mark Wielaard 8f3bc4
-   PRE_MEM_READ( "clock_settime64(tp)", ARG2, sizeof(struct vki_timespec64) );
Mark Wielaard 8f3bc4
+   pre_read_timespec64(tid, "clock_settime64(tp)", ARG2);
Mark Wielaard 8f3bc4
 }
Mark Wielaard 8f3bc4
 
Mark Wielaard 8f3bc4
 PRE(sys_clock_gettime)
Mark Wielaard 8f3bc4
@@ -2980,7 +2989,8 @@ PRE(sys_clock_gettime64)
Mark Wielaard 8f3bc4
    PRINT("sys_clock_gettime64( %ld, %#" FMT_REGWORD "x )" , SARG1, ARG2);
Mark Wielaard 8f3bc4
    PRE_REG_READ2(long, "clock_gettime64",
Mark Wielaard 8f3bc4
                  vki_clockid_t, clk_id, struct vki_timespec64 *, tp);
Mark Wielaard 8f3bc4
-   PRE_MEM_WRITE( "clock_gettime64(tp)", ARG2, sizeof(struct vki_timespec64) );
Mark Wielaard 8f3bc4
+   PRE_MEM_WRITE ( "clock_gettime64(tp)", ARG2,
Mark Wielaard 8f3bc4
+                   sizeof(struct vki_timespec64) );
Mark Wielaard 8f3bc4
 }
Mark Wielaard 8f3bc4
 POST(sys_clock_gettime64)
Mark Wielaard 8f3bc4
 {
Mark Wielaard 8f3bc4
@@ -3012,7 +3022,7 @@ PRE(sys_clock_getres_time64)
Mark Wielaard 8f3bc4
                  vki_clockid_t, clk_id, struct vki_timespec64 *, res);
Mark Wielaard 8f3bc4
    if (ARG2 != 0)
Mark Wielaard 8f3bc4
       PRE_MEM_WRITE( "clock_getres_time64(res)", ARG2,
Mark Wielaard 8f3bc4
-		     sizeof(struct vki_timespec64) );
Mark Wielaard 8f3bc4
+                     sizeof(struct vki_timespec64) );
Mark Wielaard 8f3bc4
 }
Mark Wielaard 8f3bc4
 POST(sys_clock_getres_time64)
Mark Wielaard 8f3bc4
 {
Mark Wielaard 8f3bc4
@@ -3049,8 +3059,7 @@ PRE(sys_clock_nanosleep_time64)
Mark Wielaard 8f3bc4
                  vki_clockid_t, clkid, int, flags,
Mark Wielaard 8f3bc4
                  const struct vki_timespec64 *, rqtp,
Mark Wielaard 8f3bc4
 		 struct vki_timespec64 *, rmtp);
Mark Wielaard 8f3bc4
-   PRE_MEM_READ( "clock_nanosleep_time64(rqtp)", ARG3,
Mark Wielaard 8f3bc4
-		 sizeof(struct vki_timespec64) );
Mark Wielaard 8f3bc4
+   pre_read_timespec64(tid, "clock_nanosleep_time64(rqtp)", ARG3);
Mark Wielaard 8f3bc4
    if (ARG4 != 0)
Mark Wielaard 8f3bc4
       PRE_MEM_WRITE( "clock_nanosleep_time64(rmtp)", ARG4,
Mark Wielaard 8f3bc4
 		     sizeof(struct vki_timespec64) );
Mark Wielaard 8f3bc4
@@ -3323,8 +3332,7 @@ PRE(sys_timerfd_settime64)
Mark Wielaard 8f3bc4
       SET_STATUS_Failure(VKI_EBADF);
Mark Wielaard 8f3bc4
    else
Mark Wielaard 8f3bc4
    {
Mark Wielaard 8f3bc4
-      PRE_MEM_READ("timerfd_settime64(result)",
Mark Wielaard 8f3bc4
-                   ARG3, sizeof(struct vki_itimerspec64));
Mark Wielaard 8f3bc4
+      pre_read_itimerspec64 (tid, "timerfd_settime64(result)", ARG3);
Mark Wielaard 8f3bc4
       if (ARG4)
Mark Wielaard 8f3bc4
       {
Mark Wielaard 8f3bc4
          PRE_MEM_WRITE("timerfd_settime64(result)",
Mark Wielaard 8f3bc4
@@ -4479,8 +4487,7 @@ PRE(sys_rt_sigtimedwait_time64)
Mark Wielaard 8f3bc4
       PRE_MEM_WRITE( "rt_sigtimedwait_time64(info)", ARG2,
Mark Wielaard 8f3bc4
                      sizeof(vki_siginfo_t) );
Mark Wielaard 8f3bc4
    if (ARG3 != 0)
Mark Wielaard 8f3bc4
-      PRE_MEM_READ( "rt_sigtimedwait_time64(timeout)",
Mark Wielaard 8f3bc4
-                    ARG3, sizeof(struct vki_timespec64) );
Mark Wielaard 8f3bc4
+      pre_read_timespec64(tid, "rt_sigtimedwait_time64(timeout)", ARG3);
Mark Wielaard 8f3bc4
 }
Mark Wielaard 8f3bc4
 POST(sys_rt_sigtimedwait_time64)
Mark Wielaard 8f3bc4
 {
Mark Wielaard 8f3bc4
@@ -4947,8 +4954,7 @@ PRE(sys_semtimedop_time64)
Mark Wielaard 8f3bc4
    PRE_MEM_READ( "semtimedop_time64(sops)", ARG1,
Mark Wielaard 8f3bc4
                  ARG2 * sizeof(struct vki_sembuf) );
Mark Wielaard 8f3bc4
    if (ARG3 != 0)
Mark Wielaard 8f3bc4
-      PRE_MEM_READ( "semtimedop_time64(timeout)", ARG3,
Mark Wielaard 8f3bc4
-                    sizeof(struct vki_timespec64) );
Mark Wielaard 8f3bc4
+      pre_read_timespec64(tid, "semtimedop_time64(timeout)", ARG3);
Mark Wielaard 8f3bc4
 }
Mark Wielaard 8f3bc4
 
Mark Wielaard 8f3bc4
 PRE(sys_msgget)
Mark Wielaard 8f3bc4
@@ -6303,7 +6309,7 @@ PRE(sys_recvmmsg_time64)
Mark Wielaard 8f3bc4
       PRE_MEM_WRITE( name, (Addr)&mmsg[i].msg_len, sizeof(mmsg[i].msg_len) );
Mark Wielaard 8f3bc4
    }
Mark Wielaard 8f3bc4
    if (ARG5)
Mark Wielaard 8f3bc4
-      PRE_MEM_READ( "recvmmsg(timeout)", ARG5, sizeof(struct vki_timespec64) );
Mark Wielaard 8f3bc4
+      pre_read_timespec64(tid, "recvmmsg(timeout)", ARG5);
Mark Wielaard 8f3bc4
 }
Mark Wielaard 8f3bc4
 
Mark Wielaard 8f3bc4
 POST(sys_recvmmsg_time64)
Mark Wielaard 8f3bc4
diff --git a/include/vki/vki-linux.h b/include/vki/vki-linux.h
Mark Wielaard 8f3bc4
index 6f42b3822..3d9dabc86 100644
Mark Wielaard 8f3bc4
--- a/include/vki/vki-linux.h
Mark Wielaard 8f3bc4
+++ b/include/vki/vki-linux.h
Mark Wielaard 8f3bc4
@@ -5317,9 +5317,21 @@ struct vki_ptp_pin_desc {
Mark Wielaard 8f3bc4
 
Mark Wielaard 8f3bc4
 typedef vki_int64_t vki_time64_t;
Mark Wielaard 8f3bc4
 
Mark Wielaard 8f3bc4
+/* Note that this is the padding used by glibc, the kernel uses
Mark Wielaard 8f3bc4
+   a 64-bit signed int, but is ignoring the upper 32 bits of the
Mark Wielaard 8f3bc4
+   tv_nsec field.  It does always write the full struct though.
Mark Wielaard 8f3bc4
+   So this is only needed for PRE_MEM_READ. See pre_read_timespec64. */
Mark Wielaard 8f3bc4
 struct vki_timespec64 {
Mark Wielaard 8f3bc4
    vki_time64_t tv_sec;
Mark Wielaard 8f3bc4
-   long tv_nsec;
Mark Wielaard 8f3bc4
+#if defined(VKI_BIG_ENDIAN)
Mark Wielaard 8f3bc4
+   vki_int32_t tv_pad;
Mark Wielaard 8f3bc4
+   vki_int32_t tv_nsec;
Mark Wielaard 8f3bc4
+#elif defined(VKI_LITTLE_ENDIAN)
Mark Wielaard 8f3bc4
+   vki_int32_t tv_nsec;
Mark Wielaard 8f3bc4
+   vki_int32_t tv_pad;
Mark Wielaard 8f3bc4
+#else
Mark Wielaard 8f3bc4
+#error edit for your odd byteorder.
Mark Wielaard 8f3bc4
+#endif
Mark Wielaard 8f3bc4
 };
Mark Wielaard 8f3bc4
 
Mark Wielaard 8f3bc4
 struct vki_itimerspec64 {