* userfaultfd.c: New file.
* Makefile.am (strace_SOURCES): Add it.
* xlat/uffd_flags.in: New file.
* linux/dummy.h (userfaultfd): Remove.
* tests/userfaultfd.c: New file.
* tests/userfaultfd.test: New test.
* tests/Makefile.am (check_PROGRAMS): Add userfaultfd.
(TESTS): Add userfaultfd.test.
* tests/.gitignore: Add userfaultfd.
umask.c \
umount.c \
uname.c \
+ userfaultfd.c \
util.c \
utime.c \
utimes.c \
#define sys_name_to_handle_at printargs
#define sys_open_by_handle_at printargs
#define sys_sysfs printargs
-#define sys_userfaultfd printargs
#define sys_vm86 printargs
#define sys_vm86old printargs
umovestr
umovestr2
unix-pair-send-recv
+userfaultfd
utime
utimensat
wait
umovestr \
umovestr2 \
unix-pair-send-recv \
+ userfaultfd \
utime \
utimensat \
wait \
uid16.test \
uid32.test \
uio.test \
+ userfaultfd.test \
utime.test \
utimensat.test \
wait.test \
--- /dev/null
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include <errno.h>
+#include <fcntl.h>
+#include <stdio.h>
+#include <unistd.h>
+#include <sys/syscall.h>
+
+int
+main(void)
+{
+#if defined __NR_userfaultfd && defined O_CLOEXEC
+ if (syscall(__NR_userfaultfd, 1 | O_NONBLOCK | O_CLOEXEC) != -1)
+ return 77;
+ printf("userfaultfd(O_NONBLOCK|O_CLOEXEC|0x1) = -1 %s\n",
+ errno == ENOSYS ?
+ "ENOSYS (Function not implemented)" :
+ "EINVAL (Invalid argument)");
+ puts("+++ exited with 0 +++");
+ return 0;
+#else
+ return 77;
+#endif
+}
--- /dev/null
+#!/bin/sh
+
+# Check userfaultfd syscall decoding.
+
+. "${srcdir=.}/init.sh"
+
+run_prog > /dev/null
+OUT="$LOG.out"
+run_strace -a38 -euserfaultfd $args > "$OUT"
+match_diff "$OUT" "$LOG"
+rm -f "$OUT"
+
+exit 0
--- /dev/null
+#include "defs.h"
+#include <fcntl.h>
+
+#include "xlat/uffd_flags.h"
+
+SYS_FUNC(userfaultfd)
+{
+ printflags(uffd_flags, tcp->u_arg[0], "UFFD_???");
+
+ return RVAL_DECODED | RVAL_FD;
+}
--- /dev/null
+O_NONBLOCK
+O_CLOEXEC