From: Martin Cermak Date: Fri, 12 Sep 2025 05:52:55 +0000 (+0200) Subject: Wrap the futex_waitv syscall X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=4b9d06bcde9935b3eae0307ec07fc1437a76e903;p=thirdparty%2Fvalgrind.git Wrap the futex_waitv syscall 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 --- diff --git a/NEWS b/NEWS index 38c00488b..ff7d0ffc8 100644 --- 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 diff --git a/coregrind/m_syswrap/priv_syswrap-linux.h b/coregrind/m_syswrap/priv_syswrap-linux.h index 2fe8fd59d..1706af786 100644 --- a/coregrind/m_syswrap/priv_syswrap-linux.h +++ b/coregrind/m_syswrap/priv_syswrap-linux.h @@ -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 diff --git a/coregrind/m_syswrap/syswrap-amd64-linux.c b/coregrind/m_syswrap/syswrap-amd64-linux.c index bb970b47d..c0d3637f7 100644 --- a/coregrind/m_syswrap/syswrap-amd64-linux.c +++ b/coregrind/m_syswrap/syswrap-amd64-linux.c @@ -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 diff --git a/coregrind/m_syswrap/syswrap-arm-linux.c b/coregrind/m_syswrap/syswrap-arm-linux.c index 043a4095c..42f795210 100644 --- a/coregrind/m_syswrap/syswrap-arm-linux.c +++ b/coregrind/m_syswrap/syswrap-arm-linux.c @@ -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 diff --git a/coregrind/m_syswrap/syswrap-arm64-linux.c b/coregrind/m_syswrap/syswrap-arm64-linux.c index 71d1123d0..fd6ac23f7 100644 --- a/coregrind/m_syswrap/syswrap-arm64-linux.c +++ b/coregrind/m_syswrap/syswrap-arm64-linux.c @@ -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 diff --git a/coregrind/m_syswrap/syswrap-linux.c b/coregrind/m_syswrap/syswrap-linux.c index e1450d886..cbb692db9 100644 --- a/coregrind/m_syswrap/syswrap-linux.c +++ b/coregrind/m_syswrap/syswrap-linux.c @@ -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, %" diff --git a/coregrind/m_syswrap/syswrap-mips32-linux.c b/coregrind/m_syswrap/syswrap-mips32-linux.c index 09d292ea8..3020d15fe 100644 --- a/coregrind/m_syswrap/syswrap-mips32-linux.c +++ b/coregrind/m_syswrap/syswrap-mips32-linux.c @@ -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 diff --git a/coregrind/m_syswrap/syswrap-mips64-linux.c b/coregrind/m_syswrap/syswrap-mips64-linux.c index 26ece232b..ec6e3fa14 100644 --- a/coregrind/m_syswrap/syswrap-mips64-linux.c +++ b/coregrind/m_syswrap/syswrap-mips64-linux.c @@ -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 ) diff --git a/coregrind/m_syswrap/syswrap-nanomips-linux.c b/coregrind/m_syswrap/syswrap-nanomips-linux.c index 17b39a89c..592d93d8f 100644 --- a/coregrind/m_syswrap/syswrap-nanomips-linux.c +++ b/coregrind/m_syswrap/syswrap-nanomips-linux.c @@ -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) diff --git a/coregrind/m_syswrap/syswrap-ppc32-linux.c b/coregrind/m_syswrap/syswrap-ppc32-linux.c index d8dbe7de6..2a7612ccc 100644 --- a/coregrind/m_syswrap/syswrap-ppc32-linux.c +++ b/coregrind/m_syswrap/syswrap-ppc32-linux.c @@ -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 diff --git a/coregrind/m_syswrap/syswrap-ppc64-linux.c b/coregrind/m_syswrap/syswrap-ppc64-linux.c index 3e7a14e40..5b1b0c1af 100644 --- a/coregrind/m_syswrap/syswrap-ppc64-linux.c +++ b/coregrind/m_syswrap/syswrap-ppc64-linux.c @@ -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 diff --git a/coregrind/m_syswrap/syswrap-riscv64-linux.c b/coregrind/m_syswrap/syswrap-riscv64-linux.c index 987205319..a0655706b 100644 --- a/coregrind/m_syswrap/syswrap-riscv64-linux.c +++ b/coregrind/m_syswrap/syswrap-riscv64-linux.c @@ -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 */ diff --git a/coregrind/m_syswrap/syswrap-s390x-linux.c b/coregrind/m_syswrap/syswrap-s390x-linux.c index 8ab81d593..5a68f14db 100644 --- a/coregrind/m_syswrap/syswrap-s390x-linux.c +++ b/coregrind/m_syswrap/syswrap-s390x-linux.c @@ -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 diff --git a/coregrind/m_syswrap/syswrap-x86-linux.c b/coregrind/m_syswrap/syswrap-x86-linux.c index 7e68c4e0e..fb6adff11 100644 --- a/coregrind/m_syswrap/syswrap-x86-linux.c +++ b/coregrind/m_syswrap/syswrap-x86-linux.c @@ -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 diff --git a/include/vki/vki-linux.h b/include/vki/vki-linux.h index 1e04bdd48..1b32295bf 100644 --- a/include/vki/vki-linux.h +++ b/include/vki/vki-linux.h @@ -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 //---------------------------------------------------------------------- diff --git a/include/vki/vki-scnums-32bit-linux.h b/include/vki/vki-scnums-32bit-linux.h index f276ddaed..ca0ff79bd 100644 --- a/include/vki/vki-scnums-32bit-linux.h +++ b/include/vki/vki-scnums-32bit-linux.h @@ -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 diff --git a/include/vki/vki-scnums-amd64-linux.h b/include/vki/vki-scnums-amd64-linux.h index 65134734a..5e218a3ae 100644 --- a/include/vki/vki-scnums-amd64-linux.h +++ b/include/vki/vki-scnums-amd64-linux.h @@ -414,6 +414,7 @@ #define __NR_statx 332 #define __NR_io_pgetevents 333 #define __NR_rseq 334 +#define __NR_futex_waitv 449 #endif /* __VKI_SCNUMS_AMD64_LINUX_H */ diff --git a/include/vki/vki-scnums-arm-linux.h b/include/vki/vki-scnums-arm-linux.h index 485db8b26..44803bcb8 100644 --- a/include/vki/vki-scnums-arm-linux.h +++ b/include/vki/vki-scnums-arm-linux.h @@ -433,6 +433,7 @@ #define __NR_pkey_free 396 #define __NR_statx 397 #define __NR_rseq 398 +#define __NR_futex_waitv 449 diff --git a/include/vki/vki-scnums-arm64-linux.h b/include/vki/vki-scnums-arm64-linux.h index 08d569004..e2ac07625 100644 --- a/include/vki/vki-scnums-arm64-linux.h +++ b/include/vki/vki-scnums-arm64-linux.h @@ -325,6 +325,7 @@ #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 diff --git a/include/vki/vki-scnums-ppc32-linux.h b/include/vki/vki-scnums-ppc32-linux.h index 08fa77df0..d3ca94ebb 100644 --- a/include/vki/vki-scnums-ppc32-linux.h +++ b/include/vki/vki-scnums-ppc32-linux.h @@ -4,6 +4,8 @@ /*--- vki-scnums-ppc32-linux.h ---*/ /*--------------------------------------------------------------------*/ + + /* This file is part of Valgrind, a dynamic binary instrumentation framework. @@ -416,6 +418,7 @@ #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 */ diff --git a/include/vki/vki-scnums-ppc64-linux.h b/include/vki/vki-scnums-ppc64-linux.h index 6d8b2b508..4b42c60b5 100644 --- a/include/vki/vki-scnums-ppc64-linux.h +++ b/include/vki/vki-scnums-ppc64-linux.h @@ -409,6 +409,7 @@ #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 */ diff --git a/include/vki/vki-scnums-riscv64-linux.h b/include/vki/vki-scnums-riscv64-linux.h index f084cf44e..f30636f41 100644 --- a/include/vki/vki-scnums-riscv64-linux.h +++ b/include/vki/vki-scnums-riscv64-linux.h @@ -309,6 +309,7 @@ #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 diff --git a/include/vki/vki-scnums-s390x-linux.h b/include/vki/vki-scnums-s390x-linux.h index efb36b991..ad3647d23 100644 --- a/include/vki/vki-scnums-s390x-linux.h +++ b/include/vki/vki-scnums-s390x-linux.h @@ -346,6 +346,7 @@ #define __NR_kexec_file_load 381 #define __NR_io_pgetevents 382 #define __NR_rseq 383 +#define __NR_futex_waitv 449 #define NR_syscalls 384 diff --git a/include/vki/vki-scnums-x86-linux.h b/include/vki/vki-scnums-x86-linux.h index 5019321d3..4807c5daa 100644 --- a/include/vki/vki-scnums-x86-linux.h +++ b/include/vki/vki-scnums-x86-linux.h @@ -429,6 +429,7 @@ #define __NR_msgsnd 400 #define __NR_msgrcv 401 #define __NR_msgctl 402 +#define __NR_futex_waitv 449 #endif /* __VKI_SCNUMS_X86_LINUX_H */