Implement memfd_create syscall decoding

* memfd_create.c: New file.
* Makefile.am (strace_SOURCES): Add it.
* linux/dummy.h (sys_memfd_create): Remove.
* pathtrace.c (pathtrace_match): Add SEN_memfd_create.
* xlat/memfd_create_flags.in: New file.
* tests/memfd_create.c: New file.
* tests/memfd_create.expected: Likewise.
* tests/memfd_create.test: New test.
* tests/Makefile.am: (check_PROGRAMS): Add memfd_create.
(TESTS): Add memfd_create.test.
(EXTRA_DIST): Add memfd_create.expected.
* tests/.gitignore: Add memfd_create.
diff --git a/Makefile.am b/Makefile.am
index 6e72319..32915a3 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -68,6 +68,7 @@
 	loop.c		\
 	lseek.c		\
 	mem.c		\
+	memfd_create.c	\
 	mknod.c		\
 	mount.c		\
 	mtd.c		\
diff --git a/linux/dummy.h b/linux/dummy.h
index 4e9db9e..1fc2d0b 100644
--- a/linux/dummy.h
+++ b/linux/dummy.h
@@ -37,7 +37,6 @@
 #define	sys_kcmp		printargs
 #define	sys_kexec_file_load	printargs
 #define	sys_lookup_dcookie	printargs
-#define	sys_memfd_create	printargs
 #define	sys_name_to_handle_at	printargs
 #define	sys_open_by_handle_at	printargs
 #define	sys_sched_getattr	printargs
diff --git a/memfd_create.c b/memfd_create.c
new file mode 100644
index 0000000..fcd370f
--- /dev/null
+++ b/memfd_create.c
@@ -0,0 +1,12 @@
+#include "defs.h"
+
+#include "xlat/memfd_create_flags.h"
+
+SYS_FUNC(memfd_create)
+{
+	printstr(tcp, tcp->u_arg[0], -1);
+	tprints(", ");
+	printflags(memfd_create_flags, tcp->u_arg[1], "MFD_???");
+
+	return RVAL_DECODED | RVAL_FD;
+}
diff --git a/pathtrace.c b/pathtrace.c
index bfa2df0..3946782 100644
--- a/pathtrace.c
+++ b/pathtrace.c
@@ -324,6 +324,7 @@
 	case SEN_eventfd:
 	case SEN_fanotify_init:
 	case SEN_inotify_init1:
+	case SEN_memfd_create:
 	case SEN_perf_event_open:
 	case SEN_pipe:
 	case SEN_printargs:
diff --git a/tests/.gitignore b/tests/.gitignore
index 3ea70db..6354c7a 100644
--- a/tests/.gitignore
+++ b/tests/.gitignore
@@ -11,6 +11,7 @@
 ipc_msg
 ipc_sem
 ipc_shm
+memfd_create
 mmap
 mmap64
 mmsg
diff --git a/tests/Makefile.am b/tests/Makefile.am
index bd3f5cf..e56643c 100644
--- a/tests/Makefile.am
+++ b/tests/Makefile.am
@@ -22,6 +22,7 @@
 	ipc_msg \
 	ipc_sem \
 	ipc_shm \
+	memfd_create \
 	mmap \
 	mmap64 \
 	mmsg \
@@ -88,6 +89,7 @@
 	stat32-v.test \
 	stat64-v.test \
 	statfs.test \
+	memfd_create.test \
 	mmap.test \
 	mmap64.test \
 	mmsg.test \
@@ -133,6 +135,7 @@
 	     ioctl.expected \
 	     ip_mreq.expected \
 	     ipc.sh \
+	     memfd_create.expected \
 	     mmsg.expected \
 	     net.expected \
 	     net-fd.expected \
diff --git a/tests/memfd_create.c b/tests/memfd_create.c
new file mode 100644
index 0000000..6b983c3
--- /dev/null
+++ b/tests/memfd_create.c
@@ -0,0 +1,25 @@
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include <unistd.h>
+#include <sys/syscall.h>
+
+#ifdef __NR_memfd_create
+
+int
+main(void)
+{
+	syscall(__NR_memfd_create, "strace", 7);
+	return 0;
+}
+
+#else
+
+int
+main(void)
+{
+	return 77;
+}
+
+#endif
diff --git a/tests/memfd_create.expected b/tests/memfd_create.expected
new file mode 100644
index 0000000..6fb938f
--- /dev/null
+++ b/tests/memfd_create.expected
@@ -0,0 +1 @@
+memfd_create\("strace", MFD_CLOEXEC\|MFD_ALLOW_SEALING\|0x4\) += -1 .*
diff --git a/tests/memfd_create.test b/tests/memfd_create.test
new file mode 100755
index 0000000..6a34fc1
--- /dev/null
+++ b/tests/memfd_create.test
@@ -0,0 +1,11 @@
+#!/bin/sh
+
+# Check memfd_create syscall decoding.
+
+. "${srcdir=.}/init.sh"
+
+run_prog
+run_strace -e memfd_create $args
+match_grep
+
+exit 0
diff --git a/xlat/memfd_create_flags.in b/xlat/memfd_create_flags.in
new file mode 100644
index 0000000..04a1b47
--- /dev/null
+++ b/xlat/memfd_create_flags.in
@@ -0,0 +1,2 @@
+MFD_CLOEXEC 1
+MFD_ALLOW_SEALING 2