]> git.ipfire.org Git - thirdparty/valgrind.git/commitdiff
Wrap the futex_waitv syscall
authorMartin Cermak <mcermak@redhat.com>
Fri, 12 Sep 2025 05:52:55 +0000 (07:52 +0200)
committerMark Wielaard <mark@klomp.org>
Fri, 12 Sep 2025 11:31:03 +0000 (13:31 +0200)
Wrap the futex2/futex_waitv syscall:

sys_futex_waitv(struct futex_waitv __user *, waiters,
                unsigned int, nr_futexes, unsigned int, flags,
                struct __kernel_timespec __user *, timeout, clockid_t, clockid)

sys_futex_waitv - Wait on a list of futexes
@waiters:    List of futexes to wait on
@nr_futexes: Length of futexv
@flags:      Flag for timeout (monotonic/realtime)
@timeout:    Optional absolute timeout.
@clockid:    Clock to be used for the timeout, realtime or monotonic.

Given an array of `struct futex_waitv`, wait on each uaddr. The thread wakes
if a futex_wake() is performed at any uaddr. The syscall returns immediately
if any waiter has *uaddr != val. *timeout is an optional timeout value for
the operation. Each waiter has individual flags. The `flags` argument for
the syscall should be used solely for specifying the timeout as realtime, if
needed. Flags for private futexes, sizes, etc. should be used on the
individual flags of each waiter. Returns the array index of one of the woken
futexes. No further information is provided.

Declare a futex_waitv wrapper in priv_syswrap-linux.h
and hook it for {amd64,arm,arm64,mips64,ppc32,ppc64,riscv64,s390x\
,x86}- linux using LINX_ with PRE handler in syswrap-linux.c

https://bugs.kde.org/show_bug.cgi?id=506816

24 files changed:
NEWS
coregrind/m_syswrap/priv_syswrap-linux.h
coregrind/m_syswrap/syswrap-amd64-linux.c
coregrind/m_syswrap/syswrap-arm-linux.c
coregrind/m_syswrap/syswrap-arm64-linux.c
coregrind/m_syswrap/syswrap-linux.c
coregrind/m_syswrap/syswrap-mips32-linux.c
coregrind/m_syswrap/syswrap-mips64-linux.c
coregrind/m_syswrap/syswrap-nanomips-linux.c
coregrind/m_syswrap/syswrap-ppc32-linux.c
coregrind/m_syswrap/syswrap-ppc64-linux.c
coregrind/m_syswrap/syswrap-riscv64-linux.c
coregrind/m_syswrap/syswrap-s390x-linux.c
coregrind/m_syswrap/syswrap-x86-linux.c
include/vki/vki-linux.h
include/vki/vki-scnums-32bit-linux.h
include/vki/vki-scnums-amd64-linux.h
include/vki/vki-scnums-arm-linux.h
include/vki/vki-scnums-arm64-linux.h
include/vki/vki-scnums-ppc32-linux.h
include/vki/vki-scnums-ppc64-linux.h
include/vki/vki-scnums-riscv64-linux.h
include/vki/vki-scnums-s390x-linux.h
include/vki/vki-scnums-x86-linux.h

diff --git a/NEWS b/NEWS
index 38c00488bfa5350b2fb8b59ef76964897fd3ebb1..ff7d0ffc868d530cf0c1b41f57a3e81424341cc9 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -67,6 +67,7 @@ are not entered into bugzilla tend to get forgotten about or ignored.
 506795  Better report which clone flags are problematic
 506806  Fix execveat() with AT_FDCWD and relative path
 506813  The execveat wrapper needs to do more checking
+506816  futex2, futex_waitv WARNING: unhandled amd64-linux syscall: 449
 506910  openat2 with RESOLVE_NO_MAGICLINKS succeeds on /proc/self/exe
 506928  Wrap (deprecated) linux specific ustat syscall
 506929  Wrap (deprecated) linux sysfs syscall
index 2fe8fd59da16ea8688018c0099d6ad9a949cdb4d..1706af786b0c3fb280da00830d61e9b8b6db1367 100644 (file)
@@ -465,6 +465,7 @@ DECL_TEMPLATE(linux, sys_mq_timedreceive_time64);
 DECL_TEMPLATE(linux, sys_semtimedop_time64);
 DECL_TEMPLATE(linux, sys_rt_sigtimedwait_time64);
 DECL_TEMPLATE(linux, sys_futex_time64);
+DECL_TEMPLATE(linux, sys_futex_waitv);
 DECL_TEMPLATE(linux, sys_sched_rr_get_interval_time64);
 
 // Some arch specific functions called from syswrap-linux.c
index bb970b47d167eb50acd48e27264180676797b23b..c0d3637f7dbe7741a2817b1888cd8678a967b6c6 100644 (file)
@@ -901,6 +901,7 @@ static SyscallTableEntry syscall_table[] = {
    LINX_(__NR_landlock_restrict_self,  sys_landlock_restrict_self),  // 446
 
    LINXY(__NR_memfd_secret,      sys_memfd_secret),      // 447
+   LINX_(__NR_futex_waitv,       sys_futex_waitv),       // 449
 
    LINXY(__NR_cachestat,         sys_cachestat),         // 451
    LINX_(__NR_fchmodat2,         sys_fchmodat2),         // 452
index 043a4095c40662737a54880ae0d16c798529285e..42f795210340d04df42f67d37cf0f7c6cb9ed709 100644 (file)
@@ -1070,6 +1070,7 @@ static SyscallTableEntry syscall_main_table[] = {
    LINX_(__NR_faccessat2,    sys_faccessat2),           // 439
 
    LINXY(__NR_epoll_pwait2,      sys_epoll_pwait2),      // 441
+   LINX_(__NR_futex_waitv,       sys_futex_waitv),       // 449
 
    LINXY(__NR_landlock_create_ruleset, sys_landlock_create_ruleset), // 444
    LINX_(__NR_landlock_add_rule,       sys_landlock_add_rule),       // 445
index 71d1123d0ef612835adbafc1bb60f6681b197337..fd6ac23f708bd36f9e959634357072e3de45d6fa 100644 (file)
@@ -852,6 +852,7 @@ static SyscallTableEntry syscall_main_table[] = {
    LINX_(__NR_landlock_restrict_self,  sys_landlock_restrict_self),  // 446
 
    LINXY(__NR_memfd_secret,      sys_memfd_secret),      // 447
+   LINX_(__NR_futex_waitv,       sys_futex_waitv),       // 449
 
    LINXY(__NR_cachestat,         sys_cachestat),         // 451
    LINX_(__NR_fchmodat2,         sys_fchmodat2),         // 452
index e1450d88638bdf1ea541464829a6ee8bf51f882b..cbb692db92cbdbba5d039e4a44affe0246cb691b 100644 (file)
@@ -1854,6 +1854,18 @@ POST(sys_futex_time64)
   futex_post_helper (tid, arrghs, status);
 }
 
+PRE(sys_futex_waitv)
+{
+    /* asmlinkage long sys_futex_waitv(struct futex_waitv __user *waiters,
+     *                                 unsigned int nr_futexes, unsigned int flags,
+     *                                 struct __kernel_timespec __user *timeout, clockid_t clockid); */
+    *flags |= SfMayBlock;
+    PRINT("sys_futex_waitv ( %#" FMT_REGWORD "x, %ld, %ld, %#" FMT_REGWORD "x, %d )",
+          ARG1, SARG2, SARG3, ARG4, ARG5);
+    PRE_MEM_READ("sys_futex_waitv(waiters)", ARG1, sizeof(struct vki_futex_waitv) * ARG2);
+    PRE_MEM_READ("sys_futex_waitv(timeout)", ARG4, sizeof(struct vki__kernel_timespec));
+}
+
 PRE(sys_set_robust_list)
 {
    PRINT("sys_set_robust_list ( %#" FMT_REGWORD "x, %"
index 09d292ea88b065dbc1e941388ff78e1bf4c37fe1..3020d15fe37910b909d6278995347e0e59faf2cd 100644 (file)
@@ -1180,6 +1180,7 @@ static SyscallTableEntry syscall_main_table[] = {
    LINXY(__NR_landlock_create_ruleset, sys_landlock_create_ruleset), // 444
    LINX_(__NR_landlock_add_rule,       sys_landlock_add_rule),       // 445
    LINX_(__NR_landlock_restrict_self,  sys_landlock_restrict_self),  // 446
+   LINX_(__NR_futex_waitv,             sys_futex_waitv),             // 449
 
    LINXY(__NR_cachestat,               sys_cachestat),               // 451
    LINX_(__NR_fchmodat2,               sys_fchmodat2),               // 452
index 26ece232b5c9ab67ab5ea0b8dbd2668460efef18..ec6e3fa14138af3968907684e3056d59bc72e5e8 100644 (file)
@@ -818,6 +818,7 @@ static SyscallTableEntry syscall_main_table[] = {
    LINXY (__NR_statmount, sys_statmount),
    LINXY (__NR_listmount, sys_listmount),
    LINX_ (__NR_mseal, sys_mseal),
+   LINX_ (__NR_futex_waitv, sys_futex_waitv),
 };
 
 SyscallTableEntry * ML_(get_linux_syscall_entry) ( UInt sysno )
index 17b39a89c60ccf82132bc8d5f956491808d4d4ca..592d93d8f39b7875ac86e4d6895cf6ecac4718aa 100644 (file)
@@ -845,6 +845,7 @@ static SyscallTableEntry syscall_main_table[] = {
    LINXY (__NR_statmount,              sys_statmount),
    LINXY (__NR_listmount,              sys_listmount),
    LINX_ (__NR_mseal,                  sys_mseal),
+   LINX_ (__NR_futex_waitv,            sys_futex_waitv),
 };
 
 SyscallTableEntry* ML_(get_linux_syscall_entry) (UInt sysno)
index d8dbe7de622be210be9b82d2cb222d78e68e2f20..2a7612ccc4ab8c159944302c65aaa60950d62726 100644 (file)
@@ -1080,6 +1080,7 @@ static SyscallTableEntry syscall_table[] = {
    LINX_(__NR_landlock_add_rule,       sys_landlock_add_rule),       // 445
    LINX_(__NR_landlock_restrict_self,  sys_landlock_restrict_self),  // 446
 
+   LINX_(__NR_futex_waitv,       sys_futex_waitv),       // 449
    LINXY(__NR_cachestat,         sys_cachestat),         // 451
    LINX_ (__NR_fchmodat2,        sys_fchmodat2),         // 452
    LINXY (__NR_statmount,        sys_statmount),         // 457
index 3e7a14e405fe574bb17a8c69557a481a88d75bbc..5b1b0c1aff7f9f2dd59ff493cdc3d1bc083a2c99 100644 (file)
@@ -1054,6 +1054,7 @@ static SyscallTableEntry syscall_table[] = {
    LINX_(__NR_landlock_add_rule,       sys_landlock_add_rule),       // 445
    LINX_(__NR_landlock_restrict_self,  sys_landlock_restrict_self),  // 446
 
+   LINX_ (__NR_futex_waitv,      sys_futex_waitv),       // 449
    LINXY (__NR_cachestat,        sys_cachestat),         // 451
    LINX_ (__NR_fchmodat2,        sys_fchmodat2),         // 452
    LINXY (__NR_statmount,        sys_statmount),         // 457
index 987205319881c04a14583dd6c39a3ee6f5537402..a0655706b15a8002633bf369314a60cf147172f0 100644 (file)
@@ -598,6 +598,7 @@ static SyscallTableEntry syscall_main_table[] = {
    LINX_(__NR_landlock_add_rule, sys_landlock_add_rule),           /* 445 */
    LINX_(__NR_landlock_restrict_self, sys_landlock_restrict_self), /* 446 */
    LINXY(__NR_memfd_secret, sys_memfd_secret),                     /* 447 */
+   LINX_(__NR_futex_waitv, sys_futex_waitv),                       /* 449 */
    LINXY(__NR_cachestat, sys_cachestat),                           /* 451 */
    LINX_(__NR_fchmodat2, sys_fchmodat2),                           /* 452 */
    LINXY(__NR_statmount, sys_statmount),                           /* 457 */
index 8ab81d59352284865df8dc7e3c365ddc6aeddd5c..5a68f14db37ce65f397f0799b2c54b8d00029910 100644 (file)
@@ -888,6 +888,7 @@ static SyscallTableEntry syscall_table[] = {
 
    LINXY(__NR_memfd_secret, sys_memfd_secret),                        // 447
 
+   LINX_ (__NR_futex_waitv, sys_futex_waitv),                         // 449
    LINXY (__NR_cachestat, sys_cachestat),                             // 451
    LINX_ (__NR_fchmodat2, sys_fchmodat2),                             // 452
    LINXY (__NR_statmount, sys_statmount),                             // 457
index 7e68c4e0e58cc4ad08bd8a7291ab54a3ec0f3175..fb6adff112f9bf538cc101a9a2f10bd90e4f1a54 100644 (file)
@@ -1675,6 +1675,7 @@ static SyscallTableEntry syscall_table[] = {
 
    LINXY(__NR_memfd_secret,      sys_memfd_secret),      // 447
 
+   LINX_(__NR_futex_waitv,       sys_futex_waitv),       // 449
    LINXY(__NR_cachestat,         sys_cachestat),         // 451
    LINX_(__NR_fchmodat2,         sys_fchmodat2),         // 452
    LINXY(__NR_statmount,         sys_statmount),         // 457
index 1e04bdd4887352fd0a9ef776c1bf2590bcd4e72f..1b32295bf222ab64f81a7fce2182bafad2c4b6f4 100644 (file)
@@ -1415,6 +1415,19 @@ struct vki_robust_list_head {
        struct vki_robust_list __user *list_op_pending;
 };
 
+/* Introduced in linux commit bf69bad38cf63d980e8a603f8d1bd1f85b5ed3d9 */
+struct vki_futex_waitv {
+       __vki_u64 val;
+       __vki_u64 uaddr;
+       __vki_u32 flags;
+       __vki_u32 __reserved;
+};
+
+struct vki__kernel_timespec {
+       long long tv_sec;
+       long long tv_nsec;
+};
+
 //----------------------------------------------------------------------
 // From linux-2.6.8.1/include/linux/errno.h
 //----------------------------------------------------------------------
index f276ddaeddda647fbb9a631e1e21466c2ea0f758..ca0ff79bd4c90f5ea94be71186883eb760e560f4 100644 (file)
@@ -45,5 +45,6 @@
 #define __NR_rt_sigtimedwait_time64    421
 #define __NR_futex_time64      422
 #define __NR_sched_rr_get_interval_time64      423
+#define __NR_futex_waitv       449
 
 #endif
index 65134734a52bd69badeea591a9dd3f253f249e1d..5e218a3aeb6b4eefe42f9da93e50c77ede2dd9ba 100644 (file)
 #define __NR_statx              332
 #define __NR_io_pgetevents     333
 #define __NR_rseq              334
+#define __NR_futex_waitv       449
 
 #endif /* __VKI_SCNUMS_AMD64_LINUX_H */
 
index 485db8b265dc80c5647624c7d122118f3cd8a66d..44803bcb886b2d94fd7bff73a1a2ba0c03c809e6 100644 (file)
 #define __NR_pkey_free                  396
 #define __NR_statx                      397
 #define __NR_rseq                       398
+#define __NR_futex_waitv                449
 
 
 
index 08d569004580610819dbe471a3984a0f3a531bfe..e2ac07625a9e514a1d09f4ad72bceb69ddefc700 100644 (file)
 #define __NR_statx 291
 #define __NR_io_pgetevents 292
 #define __NR_rseq 293
+#define __NR_futex_waitv 449
 
 #undef __NR_syscalls
 #define __NR_syscalls 294
index 08fa77df0d4c73497f7b9b2199f9e0f6284d4a6e..d3ca94ebb8429f84530017ac809640a138f13f01 100644 (file)
@@ -4,6 +4,8 @@
 /*---                                     vki-scnums-ppc32-linux.h ---*/
 /*--------------------------------------------------------------------*/
 
+
+
 /*
    This file is part of Valgrind, a dynamic binary instrumentation
    framework.
 #define __NR_pkey_free         385
 #define __NR_pkey_mprotect     386
 #define __NR_rseq              387
+#define __NR_futex_waitv       449
 
 #endif /* __VKI_SCNUMS_PPC32_LINUX_H */
 
index 6d8b2b508c6377e1786f9d643f3f3bf782a2c5c3..4b42c60b59341c2c7778a401be02ac1c93346cbc 100644 (file)
 #define __NR_pkey_mprotect     386
 #define __NR_rseq              387
 #define __NR_io_pgetevents     388
+#define __NR_futex_waitv       449
 
 #endif /* __VKI_SCNUMS_PPC64_LINUX_H */
 
index f084cf44e991e03656b818d86b427dcdb7bb282b..f30636f417439c624621657a73d7dbab1a174c75 100644 (file)
 #define __NR_close_range 436
 #define __NR_faccessat2 439
 #define __NR_memfd_secret 447
+#define __NR_futex_waitv 449
 
 #define __NR_fcntl __NR3264_fcntl
 #define __NR_statfs __NR3264_statfs
index efb36b9917ff6c32355949a299b574a6e1081227..ad3647d23d366c2d7d1641e889c21ac67a0db649 100644 (file)
 #define __NR_kexec_file_load           381
 #define __NR_io_pgetevents             382
 #define __NR_rseq                      383
+#define __NR_futex_waitv               449
 
 #define NR_syscalls 384
 
index 5019321d3982e8eb41c616b538c65a571d0a61ff..4807c5daae8899be823fe147b47419e3e8d84c22 100644 (file)
 #define __NR_msgsnd            400
 #define __NR_msgrcv            401
 #define __NR_msgctl            402
+#define __NR_futex_waitv       449
 
 #endif /* __VKI_SCNUMS_X86_LINUX_H */