From: Martin Cermak Date: Tue, 18 Mar 2025 17:17:30 +0000 (+0100) Subject: Wrap linux specific userfaultfd syscall X-Git-Tag: VALGRIND_3_25_0~96 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=f697142e15c44c2d3e3910ae436a6597e8782aea;p=thirdparty%2Fvalgrind.git Wrap linux specific userfaultfd syscall userfaultfd takes a flags argument and returns a file descriptor. It shows up in the Linux Test Project syscalls tests as unhandled. Declare a sys_userfaultfd wrapper in priv_syswrap-linux.h and hook it for {amd64,arm,arm64,mips64,nanomips,ppc32,ppc64,riscv64,s390x,x86}-linux using LINXY with PRE/POST handlers in syswrap-linux.c. Define __NR_userfaultfd in vki-scnums-s390x-linux.h. It was already defined for all other arches. https://bugs.kde.org/show_bug.cgi?id=501365 --- diff --git a/NEWS b/NEWS index 5ba2236a0..7ea84cdc7 100644 --- a/NEWS +++ b/NEWS @@ -62,6 +62,7 @@ are not entered into bugzilla tend to get forgotten about or ignored. 501194 Fix ML_(check_macho_and_get_rw_loads) so that it is correct for any number of segment commands 501348 glibc built with -march=x86-64-v3 does not work due to ld.so memcmp 501479 Illumos DRD pthread_mutex_init wrapper errors +501365 syscall userfaultfd not wrapped To see details of a given bug, visit diff --git a/coregrind/m_syswrap/priv_syswrap-linux.h b/coregrind/m_syswrap/priv_syswrap-linux.h index 6e6356608..21bd966dc 100644 --- a/coregrind/m_syswrap/priv_syswrap-linux.h +++ b/coregrind/m_syswrap/priv_syswrap-linux.h @@ -309,6 +309,9 @@ DECL_TEMPLATE(linux, sys_execveat); // Linux-specific (new in Linux 4.11) DECL_TEMPLATE(linux, sys_statx); +// Linux-specific (new in Linux 4.3) +DECL_TEMPLATE(linux, sys_userfaultfd); + // Linux-specific memory protection key syscalls (since Linux 4.9) DECL_TEMPLATE(linux, sys_pkey_alloc); DECL_TEMPLATE(linux, sys_pkey_free); diff --git a/coregrind/m_syswrap/syswrap-amd64-linux.c b/coregrind/m_syswrap/syswrap-amd64-linux.c index bdba41826..418924110 100644 --- a/coregrind/m_syswrap/syswrap-amd64-linux.c +++ b/coregrind/m_syswrap/syswrap-amd64-linux.c @@ -856,6 +856,7 @@ static SyscallTableEntry syscall_table[] = { // LIN__(__NR_kexec_file_load, sys_ni_syscall), // 320 LINXY(__NR_bpf, sys_bpf), // 321 LINX_(__NR_execveat, sys_execveat), // 322 + LINXY(__NR_userfaultfd, sys_userfaultfd), // 323 GENX_(__NR_mlock2, sys_mlock2), // 325 diff --git a/coregrind/m_syswrap/syswrap-arm-linux.c b/coregrind/m_syswrap/syswrap-arm-linux.c index bbe3e81e7..a12053dd0 100644 --- a/coregrind/m_syswrap/syswrap-arm-linux.c +++ b/coregrind/m_syswrap/syswrap-arm-linux.c @@ -1019,6 +1019,7 @@ static SyscallTableEntry syscall_main_table[] = { LINX_(__NR_execveat, sys_execveat), // 387 + LINXY(__NR_userfaultfd, sys_userfaultfd), // 388 LINX_(__NR_membarrier, sys_membarrier), // 389 GENX_(__NR_mlock2, sys_mlock2), // 390 LINX_(__NR_copy_file_range, sys_copy_file_range), // 391 diff --git a/coregrind/m_syswrap/syswrap-arm64-linux.c b/coregrind/m_syswrap/syswrap-arm64-linux.c index 23b0b6b51..28d36764b 100644 --- a/coregrind/m_syswrap/syswrap-arm64-linux.c +++ b/coregrind/m_syswrap/syswrap-arm64-linux.c @@ -814,7 +814,7 @@ static SyscallTableEntry syscall_main_table[] = { LINXY(__NR_memfd_create, sys_memfd_create), // 279 LINXY(__NR_bpf, sys_bpf), // 280 LINX_(__NR_execveat, sys_execveat), // 281 - // (__NR_userfaultfd, sys_ni_syscall), // 282 + LINXY(__NR_userfaultfd, sys_userfaultfd), // 282 LINX_(__NR_membarrier, sys_membarrier), // 283 GENX_(__NR_mlock2, sys_mlock2), // 284 LINX_(__NR_copy_file_range, sys_copy_file_range), // 285 diff --git a/coregrind/m_syswrap/syswrap-linux.c b/coregrind/m_syswrap/syswrap-linux.c index d2259bdd8..8c166844c 100644 --- a/coregrind/m_syswrap/syswrap-linux.c +++ b/coregrind/m_syswrap/syswrap-linux.c @@ -14019,6 +14019,26 @@ POST(sys_fspick) } } +/* int syscall(SYS_userfaultfd, int flags); */ + +PRE(sys_userfaultfd) +{ + PRINT("sys_userfaultfd ( %ld )", SARG1); + PRE_REG_READ1(long, "userfaultfd", int, size); +} + +POST(sys_userfaultfd) +{ + vg_assert(SUCCESS); + if (!ML_(fd_allowed)(RES, "userfaultfd", tid, True)) { + VG_(close)(RES); + SET_STATUS_Failure( VKI_EMFILE ); + } else { + if (VG_(clo_track_fds)) + ML_(record_fd_open_nameless)(tid, RES); + } +} + #undef PRE #undef POST diff --git a/coregrind/m_syswrap/syswrap-mips64-linux.c b/coregrind/m_syswrap/syswrap-mips64-linux.c index d603924c5..5736291c2 100644 --- a/coregrind/m_syswrap/syswrap-mips64-linux.c +++ b/coregrind/m_syswrap/syswrap-mips64-linux.c @@ -835,6 +835,7 @@ static SyscallTableEntry syscall_main_table[] = { LINX_ (__NR_landlock_add_rule, sys_landlock_add_rule), LINX_ (__NR_landlock_restrict_self, sys_landlock_restrict_self), LINX_ (__NR_fchmodat2, sys_fchmodat2), + LINXY (__NR_userfaultfd, sys_userfaultfd), }; 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 853495e98..728607317 100644 --- a/coregrind/m_syswrap/syswrap-nanomips-linux.c +++ b/coregrind/m_syswrap/syswrap-nanomips-linux.c @@ -812,7 +812,7 @@ static SyscallTableEntry syscall_main_table[] = { LINX_ (__NR_setns, sys_setns), // (__NR_bpf, sys_ni_syscall), LINX_ (__NR_execveat, sys_execveat), - // (__NR_userfaultfd, sys_ni_syscall), + LINXY (__NR_userfaultfd, sys_userfaultfd), LINX_ (__NR_membarrier, sys_membarrier), GENX_ (__NR_mlock2, sys_mlock2), // (__NR_copy_file_range, sys_ni_syscall), diff --git a/coregrind/m_syswrap/syswrap-ppc32-linux.c b/coregrind/m_syswrap/syswrap-ppc32-linux.c index 24d8eb213..089a9a59b 100644 --- a/coregrind/m_syswrap/syswrap-ppc32-linux.c +++ b/coregrind/m_syswrap/syswrap-ppc32-linux.c @@ -1025,6 +1025,7 @@ static SyscallTableEntry syscall_table[] = { LINX_ (__NR_execveat, sys_execveat), // 362 + LINXY(__NR_userfaultfd, sys_userfaultfd), // 364 GENX_(__NR_mlock2, sys_mlock2), // 378 LINX_(__NR_copy_file_range, sys_copy_file_range), // 379 LINX_(__NR_preadv2, sys_preadv2), // 380 diff --git a/coregrind/m_syswrap/syswrap-ppc64-linux.c b/coregrind/m_syswrap/syswrap-ppc64-linux.c index 2a3ed8b92..7a79c6dee 100644 --- a/coregrind/m_syswrap/syswrap-ppc64-linux.c +++ b/coregrind/m_syswrap/syswrap-ppc64-linux.c @@ -1011,6 +1011,7 @@ static SyscallTableEntry syscall_table[] = { LINX_(__NR_execveat, sys_execveat), // 362 + LINXY(__NR_userfaultfd, sys_userfaultfd), // 364 LINX_(__NR_membarrier, sys_membarrier), // 365 GENX_(__NR_mlock2, sys_mlock2), // 378 diff --git a/coregrind/m_syswrap/syswrap-riscv64-linux.c b/coregrind/m_syswrap/syswrap-riscv64-linux.c index 14310b2b2..f5e2f30de 100644 --- a/coregrind/m_syswrap/syswrap-riscv64-linux.c +++ b/coregrind/m_syswrap/syswrap-riscv64-linux.c @@ -567,6 +567,7 @@ static SyscallTableEntry syscall_main_table[] = { LINXY(__NR_memfd_create, sys_memfd_create), /* 279 */ LINXY(__NR_bpf, sys_bpf), /* 280 */ LINX_(__NR_execveat, sys_execveat), /* 281 */ + LINXY(__NR_userfaultfd, sys_userfaultfd), /* 282 */ LINX_(__NR_membarrier, sys_membarrier), /* 283 */ GENX_(__NR_mlock2, sys_mlock2), /* 284 */ LINX_(__NR_copy_file_range, sys_copy_file_range), /* 285 */ diff --git a/coregrind/m_syswrap/syswrap-s390x-linux.c b/coregrind/m_syswrap/syswrap-s390x-linux.c index 893306bbd..a3d74aef9 100644 --- a/coregrind/m_syswrap/syswrap-s390x-linux.c +++ b/coregrind/m_syswrap/syswrap-s390x-linux.c @@ -835,6 +835,7 @@ static SyscallTableEntry syscall_table[] = { LINX_(__NR_execveat, sys_execveat), // 354 + LINXY(__NR_userfaultfd, sys_userfaultfd), // 355 LINX_(__NR_membarrier, sys_membarrier), // 356 LINXY(__NR_recvmmsg, sys_recvmmsg), // 357 LINXY(__NR_sendmmsg, sys_sendmmsg), // 358 diff --git a/coregrind/m_syswrap/syswrap-x86-linux.c b/coregrind/m_syswrap/syswrap-x86-linux.c index 50384817d..13c9a3386 100644 --- a/coregrind/m_syswrap/syswrap-x86-linux.c +++ b/coregrind/m_syswrap/syswrap-x86-linux.c @@ -1606,6 +1606,7 @@ static SyscallTableEntry syscall_table[] = { LINX_(__NR_shutdown, sys_shutdown), // 373 LINX_(__NR_membarrier, sys_membarrier), // 375 + LINXY(__NR_userfaultfd, sys_userfaultfd), // 374 GENX_(__NR_mlock2, sys_mlock2), // 376 LINX_(__NR_copy_file_range, sys_copy_file_range), // 377 LINXY(__NR_preadv2, sys_preadv2), // 378 diff --git a/include/vki/vki-scnums-s390x-linux.h b/include/vki/vki-scnums-s390x-linux.h index 869c04584..efb36b991 100644 --- a/include/vki/vki-scnums-s390x-linux.h +++ b/include/vki/vki-scnums-s390x-linux.h @@ -317,6 +317,7 @@ #define __NR_execveat 354 +#define __NR_userfaultfd 355 #define __NR_membarrier 356 #define __NR_recvmmsg 357 #define __NR_sendmmsg 358