[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PULL 09/12] linux-user: Add strace support for printing arguments of fa
From: |
Laurent Vivier |
Subject: |
[PULL 09/12] linux-user: Add strace support for printing arguments of fallocate() |
Date: |
Sat, 4 Jul 2020 18:25:42 +0200 |
From: Filip Bozuta <Filip.Bozuta@syrmia.com>
This patch implements strace argument printing functionality for following
syscall:
*fallocate - manipulate file space
int fallocate(int fd, int mode, off_t offset, off_t len)
man page: https://www.man7.org/linux/man-pages/man2/fallocate.2.html
Implementation notes:
This syscall's second argument "mode" is composed of predefined values
which represent flags that determine the type of operation that is
to be performed on the file space. For that reason, a printing
function "print_fallocate" was stated in file "strace.list". This printing
function uses an already existing function "print_flags()" to print flags of
the "mode" argument. These flags are stated inside an array "falloc_flags"
that contains values of type "struct flags". These values are instantiated
using an existing macro "FLAG_GENERIC()". Most of these flags are defined
after kernel version 3.0 which is why they are enwrapped in an #ifdef
directive.
The syscall's third ant fourth argument are of type "off_t" which can
cause variations between 32/64-bit architectures. To handle this variation,
function "target_offset64()" was copied from file "strace.c" and used in
"print_fallocate" to print "off_t" arguments for 32-bit architectures.
Signed-off-by: Filip Bozuta <Filip.Bozuta@syrmia.com>
Reviewed-by: Laurent Vivier <laurent@vivier.eu>
Message-Id: <20200619123331.17387-7-filip.bozuta@syrmia.com>
Signed-off-by: Laurent Vivier <laurent@vivier.eu>
---
linux-user/qemu.h | 16 ++++++++++++++++
linux-user/strace.c | 40 ++++++++++++++++++++++++++++++++++++++++
linux-user/strace.list | 2 +-
linux-user/syscall.c | 16 ----------------
4 files changed, 57 insertions(+), 17 deletions(-)
diff --git a/linux-user/qemu.h b/linux-user/qemu.h
index 8f938b8105b3..be67391ba49d 100644
--- a/linux-user/qemu.h
+++ b/linux-user/qemu.h
@@ -670,6 +670,22 @@ static inline int is_error(abi_long ret)
return (abi_ulong)ret >= (abi_ulong)(-4096);
}
+#if TARGET_ABI_BITS == 32
+static inline uint64_t target_offset64(uint32_t word0, uint32_t word1)
+{
+#ifdef TARGET_WORDS_BIGENDIAN
+ return ((uint64_t)word0 << 32) | word1;
+#else
+ return ((uint64_t)word1 << 32) | word0;
+#endif
+}
+#else /* TARGET_ABI_BITS == 32 */
+static inline uint64_t target_offset64(uint64_t word0, uint64_t word1)
+{
+ return word0;
+}
+#endif /* TARGET_ABI_BITS != 32 */
+
/**
* preexit_cleanup: housekeeping before the guest exits
*
diff --git a/linux-user/strace.c b/linux-user/strace.c
index 957f08f1adf2..32e5e987acbb 100644
--- a/linux-user/strace.c
+++ b/linux-user/strace.c
@@ -1135,6 +1135,26 @@ UNUSED static struct flags statx_mask[] = {
FLAG_END,
};
+UNUSED static struct flags falloc_flags[] = {
+ FLAG_GENERIC(FALLOC_FL_KEEP_SIZE),
+ FLAG_GENERIC(FALLOC_FL_PUNCH_HOLE),
+#ifdef FALLOC_FL_NO_HIDE_STALE
+ FLAG_GENERIC(FALLOC_FL_NO_HIDE_STALE),
+#endif
+#ifdef FALLOC_FL_COLLAPSE_RANGE
+ FLAG_GENERIC(FALLOC_FL_COLLAPSE_RANGE),
+#endif
+#ifdef FALLOC_FL_ZERO_RANGE
+ FLAG_GENERIC(FALLOC_FL_ZERO_RANGE),
+#endif
+#ifdef FALLOC_FL_INSERT_RANGE
+ FLAG_GENERIC(FALLOC_FL_INSERT_RANGE),
+#endif
+#ifdef FALLOC_FL_UNSHARE_RANGE
+ FLAG_GENERIC(FALLOC_FL_UNSHARE_RANGE),
+#endif
+};
+
/*
* print_xxx utility functions. These are used to print syscall
* parameters in certain format. All of these have parameter
@@ -1552,6 +1572,26 @@ print_faccessat(const struct syscallname *name,
}
#endif
+#ifdef TARGET_NR_fallocate
+static void
+print_fallocate(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_raw_param("%d", arg0, 0);
+ print_flags(falloc_flags, arg1, 0);
+#if TARGET_ABI_BITS == 32
+ print_raw_param("%" PRIu64, target_offset64(arg2, arg3), 0);
+ print_raw_param("%" PRIu64, target_offset64(arg4, arg5), 1);
+#else
+ print_raw_param(TARGET_ABI_FMT_ld, arg2, 0);
+ print_raw_param(TARGET_ABI_FMT_ld, arg3, 1);
+#endif
+ print_syscall_epilogue(name);
+}
+#endif
+
#ifdef TARGET_NR_fchmodat
static void
print_fchmodat(const struct syscallname *name,
diff --git a/linux-user/strace.list b/linux-user/strace.list
index e99030c9ef39..ebb713252ce3 100644
--- a/linux-user/strace.list
+++ b/linux-user/strace.list
@@ -182,7 +182,7 @@
{ TARGET_NR_fadvise64_64, "fadvise64_64" , NULL, NULL, NULL },
#endif
#ifdef TARGET_NR_fallocate
-{ TARGET_NR_fallocate, "fallocate" , NULL, NULL, NULL },
+{ TARGET_NR_fallocate, "fallocate" , NULL, print_fallocate, NULL },
#endif
#ifdef TARGET_NR_fanotify_init
{ TARGET_NR_fanotify_init, "fanotify_init" , NULL, NULL, NULL },
diff --git a/linux-user/syscall.c b/linux-user/syscall.c
index 1b971c06b270..506b94a12c1e 100644
--- a/linux-user/syscall.c
+++ b/linux-user/syscall.c
@@ -6712,22 +6712,6 @@ void syscall_init(void)
}
}
-#if TARGET_ABI_BITS == 32
-static inline uint64_t target_offset64(uint32_t word0, uint32_t word1)
-{
-#ifdef TARGET_WORDS_BIGENDIAN
- return ((uint64_t)word0 << 32) | word1;
-#else
- return ((uint64_t)word1 << 32) | word0;
-#endif
-}
-#else /* TARGET_ABI_BITS == 32 */
-static inline uint64_t target_offset64(uint64_t word0, uint64_t word1)
-{
- return word0;
-}
-#endif /* TARGET_ABI_BITS != 32 */
-
#ifdef TARGET_NR_truncate64
static inline abi_long target_truncate64(void *cpu_env, const char *arg1,
abi_long arg2,
--
2.26.2
- [PULL 06/12] linux-user: Add strace support for printing argument of syscalls used for extended attributes, (continued)
- [PULL 06/12] linux-user: Add strace support for printing argument of syscalls used for extended attributes, Laurent Vivier, 2020/07/04
- [PULL 04/12] linux-user: Extend strace support to enable argument printing after syscall execution, Laurent Vivier, 2020/07/04
- [PULL 07/12] linux-user: Add strace support for printing arguments of lseek(), Laurent Vivier, 2020/07/04
- [PULL 05/12] linux-user: Add strace support for a group of syscalls, Laurent Vivier, 2020/07/04
- [PULL 12/12] MAINTAINERS: update linux-user maintainer, Laurent Vivier, 2020/07/04
- [PULL 10/12] linux-user: Add thunk argument types for SIOCGSTAMP and SIOCGSTAMPNS, Laurent Vivier, 2020/07/04
- [PULL 11/12] linux-user: Add strace support for printing arguments of ioctl(), Laurent Vivier, 2020/07/04
- [PULL 08/12] linux-user: Add strace support for printing arguments of chown()/lchown(), Laurent Vivier, 2020/07/04
- [PULL 09/12] linux-user: Add strace support for printing arguments of fallocate(),
Laurent Vivier <=
- [PULL 03/12] linux-user: syscall: ioctls: support DRM_IOCTL_VERSION, Laurent Vivier, 2020/07/04
- Re: [PULL 00/12] Linux user for 5.1 patches, no-reply, 2020/07/04
- Re: [PULL 00/12] Linux user for 5.1 patches, no-reply, 2020/07/04
- Re: [PULL 00/12] Linux user for 5.1 patches, Peter Maydell, 2020/07/07