Le 24/04/2020 à 22:48, Helge Deller a écrit : > Drop the open-coded fcntl flags conversion in the eventfd2 syscall and > replace it with the built-in conversion with fcntl_flags_tbl. > > Signed-off-by: Helge Deller <del...@gmx.de> > > diff --git a/linux-user/syscall.c b/linux-user/syscall.c > index 05f03919ff..ebf0d38321 100644 > --- a/linux-user/syscall.c > +++ b/linux-user/syscall.c > @@ -11938,13 +11942,7 @@ static abi_long do_syscall1(void *cpu_env, int num, > abi_long arg1, > #if defined(TARGET_NR_eventfd2) > case TARGET_NR_eventfd2: > { > - int host_flags = arg2 & (~(TARGET_O_NONBLOCK | TARGET_O_CLOEXEC)); > - if (arg2 & TARGET_O_NONBLOCK) { > - host_flags |= O_NONBLOCK; > - } > - if (arg2 & TARGET_O_CLOEXEC) { > - host_flags |= O_CLOEXEC; > - } > + int host_flags = target_to_host_bitmask(arg2, fcntl_flags_tbl); > ret = get_errno(eventfd(arg1, host_flags)); > if (ret >= 0) { > fd_trans_register(ret, &target_eventfd_trans); >
The problem here is eventfd2 doesn't take O_ flags but EFD_ flags. Most EFD_ flags are mapped to O_ flags, but one is not: include/linux/eventfd.h: /* * CAREFUL: Check include/uapi/asm-generic/fcntl.h when defining * new flags, since they might collide with O_* ones. We want * to re-use O_* flags that couldn't possibly have a meaning * from eventfd, in order to leave a free define-space for * shared O_* flags. */ #define EFD_SEMAPHORE (1 << 0) #define EFD_CLOEXEC O_CLOEXEC #define EFD_NONBLOCK O_NONBLOCK So I think it's better to convert them manually Perhaps we can defined TARGET_EFD_ flags to make this clearer, I don't know. Thanks, Laurent