Le 28/06/2019 à 12:43, Aleksandar Markovic a écrit : > From: Jim Wilson <j...@sifive.com> > > All of the flags need to be conditional as old systems don't have > statx support. Otherwise it works the same as other stat family > syscalls. This requires the pending patch to add statx support. > > Tested on Ubuntu 16.04 (no host statx) and Ubuntu 19.04 (with host > statx) using a riscv32-linux toolchain. > > Signed-off-by: Jim Wilson <j...@sifive.com> > Signed-off-by: Aleksandar Markovic <amarko...@wavecomp.com> > Reviewed-by: Laurent Vivier <laur...@vivier.eu> > --- > linux-user/strace.c | 86 > ++++++++++++++++++++++++++++++++++++++++++++++++++ > linux-user/strace.list | 3 ++ > 2 files changed, 89 insertions(+) > > diff --git a/linux-user/strace.c b/linux-user/strace.c > index 6f72a74..c80e93b 100644 > --- a/linux-user/strace.c > +++ b/linux-user/strace.c > @@ -976,6 +976,76 @@ UNUSED static struct flags msg_flags[] = { > FLAG_END, > }; > > +UNUSED static struct flags statx_flags[] = { > +#ifdef AT_EMPTY_PATH > + FLAG_GENERIC(AT_EMPTY_PATH), > +#endif > +#ifdef AT_NO_AUTOMOUNT > + FLAG_GENERIC(AT_NO_AUTOMOUNT), > +#endif > +#ifdef AT_SYMLINK_NOFOLLOW > + FLAG_GENERIC(AT_SYMLINK_NOFOLLOW), > +#endif > +#ifdef AT_STATX_SYNC_AS_STAT > + FLAG_GENERIC(AT_STATX_SYNC_AS_STAT), > +#endif > +#ifdef AT_STATX_FORCE_SYNC > + FLAG_GENERIC(AT_STATX_FORCE_SYNC), > +#endif > +#ifdef AT_STATX_DONT_SYNC > + FLAG_GENERIC(AT_STATX_DONT_SYNC), > +#endif > + FLAG_END, > +}; > + > +UNUSED static struct flags statx_mask[] = { > +/* This must come first, because it includes everything. */ > +#ifdef STATX_ALL > + FLAG_GENERIC(STATX_ALL), > +#endif > +/* This must come second; it includes everything except STATX_BTIME. */ > +#ifdef STATX_BASIC_STATS > + FLAG_GENERIC(STATX_BASIC_STATS), > +#endif > +#ifdef STATX_TYPE > + FLAG_GENERIC(STATX_TYPE), > +#endif > +#ifdef STATX_MODE > + FLAG_GENERIC(STATX_MODE), > +#endif > +#ifdef STATX_NLINK > + FLAG_GENERIC(STATX_NLINK), > +#endif > +#ifdef STATX_UID > + FLAG_GENERIC(STATX_UID), > +#endif > +#ifdef STATX_GID > + FLAG_GENERIC(STATX_GID), > +#endif > +#ifdef STATX_ATIME > + FLAG_GENERIC(STATX_ATIME), > +#endif > +#ifdef STATX_MTIME > + FLAG_GENERIC(STATX_MTIME), > +#endif > +#ifdef STATX_CTIME > + FLAG_GENERIC(STATX_CTIME), > +#endif > +#ifdef STATX_INO > + FLAG_GENERIC(STATX_INO), > +#endif > +#ifdef STATX_SIZE > + FLAG_GENERIC(STATX_SIZE), > +#endif > +#ifdef STATX_BLOCKS > + FLAG_GENERIC(STATX_BLOCKS), > +#endif > +#ifdef STATX_BTIME > + FLAG_GENERIC(STATX_BTIME), > +#endif > + FLAG_END, > +}; > + > /* > * print_xxx utility functions. These are used to print syscall > * parameters in certain format. All of these have parameter > @@ -2611,6 +2681,22 @@ print_tgkill(const struct syscallname *name, > } > #endif > > +#ifdef TARGET_NR_statx > +static void > +print_statx(const struct syscallname *name, > + abi_long arg0, abi_long arg1, abi_long arg2, > + abi_long arg3, abi_long arg4, abi_long arg5) > +{ > + print_syscall_prologue(name); > + print_at_dirfd(arg0, 0); > + print_string(arg1, 0); > + print_flags(statx_flags, arg2, 0); > + print_flags(statx_mask, arg3, 0); > + print_pointer(arg4, 1); > + print_syscall_epilogue(name); > +} > +#endif > + > /* > * An array of all of the syscalls we know about > */ > diff --git a/linux-user/strace.list b/linux-user/strace.list > index db21ce4..63a9466 100644 > --- a/linux-user/strace.list > +++ b/linux-user/strace.list > @@ -1650,3 +1650,6 @@ > #ifdef TARGET_NR_atomic_barrier > { TARGET_NR_atomic_barrier, "atomic_barrier", NULL, NULL, NULL }, > #endif > +#ifdef TARGET_NR_statx > +{ TARGET_NR_statx, "statx", NULL, print_statx, NULL }, > +#endif >
Applied to my linux-user branch. Thanks, Laurent