[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-devel] [PATCH] linux-user: Add strace support for statx.
From: |
Laurent Vivier |
Subject: |
Re: [Qemu-devel] [PATCH] linux-user: Add strace support for statx. |
Date: |
Wed, 19 Jun 2019 12:27:01 +0200 |
User-agent: |
Mozilla/5.0 (X11; Linux x86_64; rv:60.0) Gecko/20100101 Thunderbird/60.7.0 |
Le 19/06/2019 à 01:53, Jim Wilson a écrit :
> 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 <address@hidden>
> ---
> 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
>
Reviewed-by: Laurent Vivier <address@hidden>