From: Mark W. <ma...@so...> - 2025-03-18 17:28:21
|
https://sourceware.org/git/gitweb.cgi?p=valgrind.git;h=f697142e15c44c2d3e3910ae436a6597e8782aea commit f697142e15c44c2d3e3910ae436a6597e8782aea Author: Martin Cermak <mc...@re...> Date: Tue Mar 18 18:17:30 2025 +0100 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: --- NEWS | 1 + coregrind/m_syswrap/priv_syswrap-linux.h | 3 +++ coregrind/m_syswrap/syswrap-amd64-linux.c | 1 + coregrind/m_syswrap/syswrap-arm-linux.c | 1 + coregrind/m_syswrap/syswrap-arm64-linux.c | 2 +- coregrind/m_syswrap/syswrap-linux.c | 20 ++++++++++++++++++++ coregrind/m_syswrap/syswrap-mips64-linux.c | 1 + coregrind/m_syswrap/syswrap-nanomips-linux.c | 2 +- coregrind/m_syswrap/syswrap-ppc32-linux.c | 1 + coregrind/m_syswrap/syswrap-ppc64-linux.c | 1 + coregrind/m_syswrap/syswrap-riscv64-linux.c | 1 + coregrind/m_syswrap/syswrap-s390x-linux.c | 1 + coregrind/m_syswrap/syswrap-x86-linux.c | 1 + include/vki/vki-scnums-s390x-linux.h | 1 + 14 files changed, 35 insertions(+), 2 deletions(-) diff --git a/NEWS b/NEWS index 5ba2236a09..7ea84cdc73 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 6e6356608f..21bd966dcb 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 bdba41826a..4189241109 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 bbe3e81e7c..a12053dd07 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 23b0b6b51c..28d36764b5 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 d2259bdd8c..8c166844cc 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 d603924c55..5736291c21 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 853495e981..728607317c 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 24d8eb2131..089a9a59b0 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 2a3ed8b924..7a79c6dee3 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 14310b2b2e..f5e2f30dea 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 893306bbda..a3d74aef9b 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 50384817db..13c9a33865 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 869c045847..efb36b9917 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 |