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