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/tests/userfaultfd.c b/tests/userfaultfd.c
new file mode 100644
index 0000000..2dcf31c
--- /dev/null
+++ b/tests/userfaultfd.c
@@ -0,0 +1,26 @@
+#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
+}