[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH v7 10/74] linux-user: Split out pread64, pwrite64
From: |
Richard Henderson |
Subject: |
[Qemu-devel] [PATCH v7 10/74] linux-user: Split out pread64, pwrite64 |
Date: |
Sun, 19 May 2019 13:36:22 -0700 |
Signed-off-by: Richard Henderson <address@hidden>
---
linux-user/syscall-defs.h | 6 ++++
linux-user/syscall-file.inc.c | 62 +++++++++++++++++++++++++++++++++++
linux-user/syscall.c | 36 --------------------
linux-user/strace.list | 6 ----
4 files changed, 68 insertions(+), 42 deletions(-)
diff --git a/linux-user/syscall-defs.h b/linux-user/syscall-defs.h
index 130ba7e344..027793d5d0 100644
--- a/linux-user/syscall-defs.h
+++ b/linux-user/syscall-defs.h
@@ -21,6 +21,12 @@ SYSCALL_DEF(close, ARG_DEC);
SYSCALL_DEF(open, ARG_STR, ARG_OPENFLAG, ARG_MODEFLAG);
#endif
SYSCALL_DEF(openat, ARG_ATDIRFD, ARG_STR, ARG_OPENFLAG, ARG_MODEFLAG);
+SYSCALL_DEF_FULL(pread64, .impl = impl_pread64,
+ .args = args_pread64_pwrite64,
+ .arg_type = { ARG_DEC, ARG_PTR, ARG_DEC, ARG_DEC64 });
+SYSCALL_DEF_FULL(pwrite64, .impl = impl_pwrite64,
+ .args = args_pread64_pwrite64,
+ .arg_type = { ARG_DEC, ARG_PTR, ARG_DEC, ARG_DEC64 });
SYSCALL_DEF(read, ARG_DEC, ARG_PTR, ARG_DEC);
#ifdef TARGET_NR_readlink
SYSCALL_DEF(readlink, ARG_STR, ARG_PTR, ARG_DEC);
diff --git a/linux-user/syscall-file.inc.c b/linux-user/syscall-file.inc.c
index 2297ca1760..43aa6eeeb8 100644
--- a/linux-user/syscall-file.inc.c
+++ b/linux-user/syscall-file.inc.c
@@ -323,6 +323,68 @@ SYSCALL_IMPL(openat)
return do_openat(cpu_env, arg1, arg2, arg3, arg4);
}
+/*
+ * Both pread64 and pwrite64 merge args into a 64-bit offset,
+ * but the input registers and ordering are target specific.
+ */
+#if TARGET_ABI_BITS == 32
+SYSCALL_ARGS(pread64_pwrite64)
+{
+ /* We have already assigned out[0-2]. */
+ int off = regpairs_aligned(cpu_env, TARGET_NR_pread64);
+ out[3] = target_offset64(in[3 + off], in[4 + off]);
+ return def;
+}
+#else
+#define args_pread64_pwrite64 NULL
+#endif
+
+SYSCALL_IMPL(pread64)
+{
+ int fd = arg1;
+ abi_ulong target_buf = arg2;
+ abi_ulong len = arg3;
+ uint64_t off = arg4;
+ void *p;
+ abi_long ret;
+
+ if (target_buf == 0 && len == 0) {
+ /* Special-case NULL buffer and zero length, which should succeed */
+ p = NULL;
+ } else {
+ p = lock_user(VERIFY_WRITE, target_buf, len, 0);
+ if (!p) {
+ return -TARGET_EFAULT;
+ }
+ }
+ ret = get_errno(pread64(fd, p, len, off));
+ unlock_user(p, target_buf, ret);
+ return ret;
+}
+
+SYSCALL_IMPL(pwrite64)
+{
+ int fd = arg1;
+ abi_ulong target_buf = arg2;
+ abi_ulong len = arg3;
+ uint64_t off = arg4;
+ void *p;
+ abi_long ret;
+
+ if (target_buf == 0 && len == 0) {
+ /* Special-case NULL buffer and zero length, which should succeed */
+ p = 0;
+ } else {
+ p = lock_user(VERIFY_READ, target_buf, len, 1);
+ if (!p) {
+ return -TARGET_EFAULT;
+ }
+ }
+ ret = get_errno(pwrite64(fd, p, len, off));
+ unlock_user(p, target_buf, 0);
+ return ret;
+}
+
SYSCALL_IMPL(read)
{
int fd = arg1;
diff --git a/linux-user/syscall.c b/linux-user/syscall.c
index 8086626707..f636fb8bb3 100644
--- a/linux-user/syscall.c
+++ b/linux-user/syscall.c
@@ -9404,42 +9404,6 @@ static abi_long do_syscall1(void *cpu_env, int num,
abi_long arg1,
#else
#error unreachable
#endif
-#endif
-#ifdef TARGET_NR_pread64
- case TARGET_NR_pread64:
- if (regpairs_aligned(cpu_env, num)) {
- arg4 = arg5;
- arg5 = arg6;
- }
- if (arg2 == 0 && arg3 == 0) {
- /* Special-case NULL buffer and zero length, which should succeed
*/
- p = 0;
- } else {
- p = lock_user(VERIFY_WRITE, arg2, arg3, 0);
- if (!p) {
- return -TARGET_EFAULT;
- }
- }
- ret = get_errno(pread64(arg1, p, arg3, target_offset64(arg4, arg5)));
- unlock_user(p, arg2, ret);
- return ret;
- case TARGET_NR_pwrite64:
- if (regpairs_aligned(cpu_env, num)) {
- arg4 = arg5;
- arg5 = arg6;
- }
- if (arg2 == 0 && arg3 == 0) {
- /* Special-case NULL buffer and zero length, which should succeed
*/
- p = 0;
- } else {
- p = lock_user(VERIFY_READ, arg2, arg3, 1);
- if (!p) {
- return -TARGET_EFAULT;
- }
- }
- ret = get_errno(pwrite64(arg1, p, arg3, target_offset64(arg4, arg5)));
- unlock_user(p, arg2, 0);
- return ret;
#endif
case TARGET_NR_getcwd:
if (!(p = lock_user(VERIFY_WRITE, arg1, arg2, 0)))
diff --git a/linux-user/strace.list b/linux-user/strace.list
index c4ae70b485..a11ad3c3c7 100644
--- a/linux-user/strace.list
+++ b/linux-user/strace.list
@@ -1025,9 +1025,6 @@
#ifdef TARGET_NR_prctl
{ TARGET_NR_prctl, "prctl" , NULL, NULL, NULL },
#endif
-#ifdef TARGET_NR_pread64
-{ TARGET_NR_pread64, "pread64" , NULL, NULL, NULL },
-#endif
#ifdef TARGET_NR_preadv
{ TARGET_NR_preadv, "preadv" , NULL, NULL, NULL },
#endif
@@ -1055,9 +1052,6 @@
#ifdef TARGET_NR_putpmsg
{ TARGET_NR_putpmsg, "putpmsg" , NULL, NULL, NULL },
#endif
-#ifdef TARGET_NR_pwrite64
-{ TARGET_NR_pwrite64, "pwrite64" , NULL, NULL, NULL },
-#endif
#ifdef TARGET_NR_pwritev
{ TARGET_NR_pwritev, "pwritev" , NULL, NULL, NULL },
#endif
--
2.17.1
- [Qemu-devel] [PATCH v7 00/74] linux-user: Split do_syscall, Richard Henderson, 2019/05/19
- [Qemu-devel] [PATCH v7 03/74] linux-user: Share more code for open and openat, Richard Henderson, 2019/05/19
- [Qemu-devel] [PATCH v7 04/74] linux-user: Tidy do_openat loop over fakes, Richard Henderson, 2019/05/19
- [Qemu-devel] [PATCH v7 02/74] linux-user: Split out open, open_at, Richard Henderson, 2019/05/19
- [Qemu-devel] [PATCH v7 01/74] linux-user: Setup split syscall infrastructure, Richard Henderson, 2019/05/19
- [Qemu-devel] [PATCH v7 05/74] linux-user: Split out readlink, readlinkat, Richard Henderson, 2019/05/19
- [Qemu-devel] [PATCH v7 06/74] linux-user: Split out close, Richard Henderson, 2019/05/19
- [Qemu-devel] [PATCH v7 07/74] linux-user: Split out read, write, Richard Henderson, 2019/05/19
- [Qemu-devel] [PATCH v7 08/74] linux-user: Reduce regpairs_aligned & target_offset64 ifdefs, Richard Henderson, 2019/05/19
- [Qemu-devel] [PATCH v7 09/74] linux-user: Split out readv, writev, Richard Henderson, 2019/05/19
- [Qemu-devel] [PATCH v7 10/74] linux-user: Split out pread64, pwrite64,
Richard Henderson <=
- [Qemu-devel] [PATCH v7 11/74] linux-user: Split out preadv, pwritev, Richard Henderson, 2019/05/19
- [Qemu-devel] [PATCH v7 12/74] linux-user: Split out name_to_handle_at, open_by_handle_at, Richard Henderson, 2019/05/19
- [Qemu-devel] [PATCH v7 15/74] linux-user: Split out exit, Richard Henderson, 2019/05/19
- [Qemu-devel] [PATCH v7 14/74] linux-user: Split out memory syscalls, Richard Henderson, 2019/05/19
- [Qemu-devel] [PATCH v7 16/74] linux-user: Split out brk, Richard Henderson, 2019/05/19
- [Qemu-devel] [PATCH v7 18/74] linux-user: Split out wait4, waitid, waitpid, Richard Henderson, 2019/05/19
- [Qemu-devel] [PATCH v7 19/74] linux-user: Implement rusage argument to waitid, Richard Henderson, 2019/05/19
- [Qemu-devel] [PATCH v7 17/74] linux-user: Split out clone, fork, vfork, Richard Henderson, 2019/05/19
- [Qemu-devel] [PATCH v7 22/74] linux-user: Split out unlink, unlinkat, rmdir, Richard Henderson, 2019/05/19
- [Qemu-devel] [PATCH v7 21/74] linux-user: Split out link, linkat, Richard Henderson, 2019/05/19