]> git.ipfire.org Git - thirdparty/valgrind.git/commitdiff
Wrap linux specific userfaultfd syscall
authorMartin Cermak <mcermak@redhat.com>
Tue, 18 Mar 2025 17:17:30 +0000 (18:17 +0100)
committerMark Wielaard <mark@klomp.org>
Tue, 18 Mar 2025 17:17:30 +0000 (18:17 +0100)
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

14 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-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-scnums-s390x-linux.h

diff --git a/NEWS b/NEWS
index 5ba2236a09bc0984c7fee566c7aed0cf72cb58c0..7ea84cdc735eebb1a496ce82fc8d4ce871fb9f7a 100644 (file)
--- 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
index 6e6356608f9cfa0595bf31aaa9de2f5bc3b82dc6..21bd966dcbfa84e3303f5d13985cdcf0bb5c7c8c 100644 (file)
@@ -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);
index bdba41826ad8fab2ef2496bfeaaf2b805d4054e7..4189241109009c1c439906f8af6e671fe4fc6c13 100644 (file)
@@ -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
 
index bbe3e81e7cde4fdd9cd228c8a9da8556d95bf682..a12053dd07420aa57034c01030a05c925bf5624e 100644 (file)
@@ -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
index 23b0b6b51c10c19098c5610c86514865f348381e..28d36764b51cc188f2e35cffa5be2c5c1365b0f3 100644 (file)
@@ -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
index d2259bdd8cfa75d086c2912afe426dcae8a18ffe..8c166844cc992a09ff8b1dd63b3a6e6f86868844 100644 (file)
@@ -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
 
index d603924c5566b54c9b3aecc8cf83e8aa365d944a..5736291c2174dea03bcd6c59174e1c2959cbbd8c 100644 (file)
@@ -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 )
index 853495e981b162983e04ce55c3d0a1544cfa03d9..728607317c9f4ec4671e92851bb7d5f5e7e3ad77 100644 (file)
@@ -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),
index 24d8eb21319049ccd8027ca2b5449c4ee499d769..089a9a59b06c96ba6d179a83458ce3a9bcd1c2de 100644 (file)
@@ -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
index 2a3ed8b92481c1dcf176e89f5489f164248d8c54..7a79c6dee3ca453cf93c031200f7a82f93b0f47d 100644 (file)
@@ -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
index 14310b2b2e9f41fbd01f871fad20dd7d6829968d..f5e2f30deab83d2dba5cc6ed49a61c7ac4d8aa58 100644 (file)
@@ -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 */
index 893306bbdae36e021ebb0a544e159b3db993ca5a..a3d74aef9b57eddf03aa9c4aca48998f2f9726a5 100644 (file)
@@ -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
index 50384817dbe5305ab8dfc44bc0aa983ca21242cc..13c9a3386510d6e78cafb3af74e27eb9c1c9900b 100644 (file)
@@ -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
index 869c04584775c60c7bdc057ebf2b05cc37047efd..efb36b9917ff6c32355949a299b574a6e1081227 100644 (file)
 
 #define __NR_execveat          354
 
+#define __NR_userfaultfd               355
 #define __NR_membarrier                        356
 #define __NR_recvmmsg                  357
 #define __NR_sendmmsg                  358