linux-user: Add support for strace for statx() syscall

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 <jimw@sifive.com>
Signed-off-by: Aleksandar Markovic <amarkovic@wavecomp.com>
Reviewed-by: Laurent Vivier <laurent@vivier.eu>
Message-Id: <1561718618-20218-3-git-send-email-aleksandar.markovic@rt-rk.com>
Signed-off-by: Laurent Vivier <laurent@vivier.eu>
This commit is contained in:
Jim Wilson 2019-06-28 12:43:35 +02:00 committed by Laurent Vivier
parent efa921845c
commit d42744fe04
2 changed files with 89 additions and 0 deletions

View File

@ -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
*/

View File

@ -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