From: Dmitry V. Levin Date: Sun, 15 Nov 2015 02:22:44 +0000 (+0000) Subject: Implement userfaultfd syscall decoding X-Git-Tag: v4.11~142 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=a6ebdb149edadac7ddb793448778bd8643003d27;p=strace Implement userfaultfd syscall decoding * 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. --- diff --git a/Makefile.am b/Makefile.am index 8070ba3e..82cd7ca8 100644 --- a/Makefile.am +++ b/Makefile.am @@ -154,6 +154,7 @@ strace_SOURCES = \ umask.c \ umount.c \ uname.c \ + userfaultfd.c \ util.c \ utime.c \ utimes.c \ diff --git a/linux/dummy.h b/linux/dummy.h index 3a333ac3..6c8d1452 100644 --- a/linux/dummy.h +++ b/linux/dummy.h @@ -42,7 +42,6 @@ #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 diff --git a/tests/.gitignore b/tests/.gitignore index 62574686..c886eb92 100644 --- a/tests/.gitignore +++ b/tests/.gitignore @@ -65,6 +65,7 @@ uio umovestr umovestr2 unix-pair-send-recv +userfaultfd utime utimensat wait diff --git a/tests/Makefile.am b/tests/Makefile.am index c52f2760..e0e352f4 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -78,6 +78,7 @@ check_PROGRAMS = \ umovestr \ umovestr2 \ unix-pair-send-recv \ + userfaultfd \ utime \ utimensat \ wait \ @@ -170,6 +171,7 @@ TESTS = \ uid16.test \ uid32.test \ uio.test \ + userfaultfd.test \ utime.test \ utimensat.test \ wait.test \ diff --git a/tests/userfaultfd.c b/tests/userfaultfd.c new file mode 100644 index 00000000..2dcf31cb --- /dev/null +++ b/tests/userfaultfd.c @@ -0,0 +1,26 @@ +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#include +#include +#include +#include +#include + +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 +} diff --git a/tests/userfaultfd.test b/tests/userfaultfd.test new file mode 100755 index 00000000..b9c83682 --- /dev/null +++ b/tests/userfaultfd.test @@ -0,0 +1,13 @@ +#!/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 diff --git a/userfaultfd.c b/userfaultfd.c new file mode 100644 index 00000000..7f8e3e46 --- /dev/null +++ b/userfaultfd.c @@ -0,0 +1,11 @@ +#include "defs.h" +#include + +#include "xlat/uffd_flags.h" + +SYS_FUNC(userfaultfd) +{ + printflags(uffd_flags, tcp->u_arg[0], "UFFD_???"); + + return RVAL_DECODED | RVAL_FD; +} diff --git a/xlat/uffd_flags.in b/xlat/uffd_flags.in new file mode 100644 index 00000000..fb0338bc --- /dev/null +++ b/xlat/uffd_flags.in @@ -0,0 +1,2 @@ +O_NONBLOCK +O_CLOEXEC