diff --git a/configure.ac b/configure.ac index aa0703c1..8c7e8264 100644 --- a/configure.ac +++ b/configure.ac @@ -268,6 +268,7 @@ AC_CHECK_HEADERS(m4_normalize([ stropts.h sys/conf.h sys/epoll.h + sys/eventfd.h sys/fanotify.h sys/ioctl.h sys/reg.h diff --git a/eventfd.c b/eventfd.c index 0e22c2b7..0f899461 100644 --- a/eventfd.c +++ b/eventfd.c @@ -1,4 +1,10 @@ #include "defs.h" +#include +#ifdef HAVE_SYS_EVENTFD_H +# include +#endif + +#include "xlat/efd_flags.h" static int do_eventfd(struct tcb *tcp, int flags_arg) @@ -6,7 +12,7 @@ do_eventfd(struct tcb *tcp, int flags_arg) tprintf("%u", (unsigned int) tcp->u_arg[0]); if (flags_arg >= 0) { tprints(", "); - printflags(open_mode_flags, tcp->u_arg[flags_arg], "O_???"); + printflags(efd_flags, tcp->u_arg[flags_arg], "EFD_???"); } return RVAL_DECODED | RVAL_FD; diff --git a/tests/.gitignore b/tests/.gitignore index f9512460..9b73a955 100644 --- a/tests/.gitignore +++ b/tests/.gitignore @@ -1,5 +1,6 @@ bpf caps +eventfd execve execveat fanotify_mark diff --git a/tests/Makefile.am b/tests/Makefile.am index a94881c0..dc76ddda 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -11,6 +11,7 @@ AM_CPPFLAGS = -I$(top_builddir)/$(OS)/$(ARCH) \ check_PROGRAMS = \ bpf \ caps \ + eventfd \ execve \ execveat \ fanotify_mark \ @@ -71,6 +72,7 @@ TESTS = \ bpf.test \ caps.test \ dumpio.test \ + eventfd.test \ execve.test \ execveat.test \ fanotify_mark.test \ @@ -129,6 +131,7 @@ AM_TEST_LOG_FLAGS = STRACE_ARCH=$(ARCH) $(srcdir)/run.sh EXTRA_DIST = init.sh run.sh match.awk \ caps.awk \ dumpio.expected \ + eventfd.expected \ execve.expected \ execve-v.expected \ execveat.expected \ diff --git a/tests/eventfd.c b/tests/eventfd.c new file mode 100644 index 00000000..07a0b102 --- /dev/null +++ b/tests/eventfd.c @@ -0,0 +1,19 @@ +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#include +#include +#include + +int +main(void) +{ +#ifdef __NR_eventfd2 + (void) close(0); + return syscall(__NR_eventfd2, -1L, 1 | O_CLOEXEC | O_NONBLOCK) == 0 ? + 0 : 77; +#else + return 77; +#endif +} diff --git a/tests/eventfd.expected b/tests/eventfd.expected new file mode 100644 index 00000000..c4b45a07 --- /dev/null +++ b/tests/eventfd.expected @@ -0,0 +1,2 @@ +eventfd2(4294967295, EFD_SEMAPHORE|EFD_CLOEXEC|EFD_NONBLOCK) = 0 ++++ exited with 0 +++ diff --git a/tests/eventfd.test b/tests/eventfd.test new file mode 100755 index 00000000..e181ed6e --- /dev/null +++ b/tests/eventfd.test @@ -0,0 +1,11 @@ +#!/bin/sh + +# Check eventfd2 syscall decoding. + +. "${srcdir=.}/init.sh" + +run_prog +run_strace -e eventfd2 $args +match_diff + +exit 0 diff --git a/xlat/efd_flags.in b/xlat/efd_flags.in new file mode 100644 index 00000000..0db0ade6 --- /dev/null +++ b/xlat/efd_flags.in @@ -0,0 +1,3 @@ +EFD_SEMAPHORE 1 +EFD_CLOEXEC O_CLOEXEC +EFD_NONBLOCK O_NONBLOCK