No attempt is made to emulate it on the host.
Signed-off-by: Andreas Schwab <schwab@suse.de>
---
linux-user/syscall.c | 39 +++++++++++++++++++++++++++++++++++++++
1 file changed, 39 insertions(+)
diff --git a/linux-user/syscall.c b/linux-user/syscall.c
index 07fb8de921..ff89016adc 100644
--- a/linux-user/syscall.c
+++ b/linux-user/syscall.c
@@ -1033,6 +1033,12 @@ safe_syscall5(int, mq_timedsend, int, mqdes, const char *, msg_ptr,
safe_syscall5(int, mq_timedreceive, int, mqdes, char *, msg_ptr,
size_t, len, unsigned *, prio, const struct timespec *, timeout)
#endif
+#if defined(TARGET_NR_copy_file_range) && defined(__NR_copy_file_range)
+safe_syscall6(ssize_t, copy_file_range, int, infd, loff_t *, pinoff,
+ int, outfd, loff_t *, poutoff, size_t, length,
+ unsigned int, flags)
+#endif
+
/* We do ioctl like this rather than via safe_syscall3 to preserve the
* "third argument might be integer or pointer or not present" behaviour of
* the libc function.
@@ -12578,6 +12584,39 @@ abi_long do_syscall(void *cpu_env, int num, abi_long arg1,
ret = get_errno(kcmp(arg1, arg2, arg3, arg4, arg5));
break;
#endif
+#if defined(TARGET_NR_copy_file_range) && defined(__NR_copy_file_range)
+ case TARGET_NR_copy_file_range:
+ {
+ loff_t inoff, outoff;
+ loff_t *pinoff = NULL, *poutoff = NULL;
+
+ if (arg2) {
+ if (get_user_u64(inoff, arg2)) {
+ goto efault;
+ }
+ pinoff = &inoff;
+ }
+ if (arg4) {
+ if (get_user_u64(outoff, arg4)) {
+ goto efault;
+ }
+ poutoff = &outoff;
+ }
+ ret = get_errno (safe_copy_file_range (arg1, pinoff, arg3, poutoff,
+ arg5, arg6));
+ if (arg2) {
+ if (put_user_u64(inoff, arg2)) {
+ goto efault;
+ }
+ }
+ if (arg4) {
+ if (put_user_u64(outoff, arg4)) {
+ goto efault;
+ }
+ }
+ }
+ break;
+#endif
default:
unimplemented:
--
2.16.1
--
Andreas Schwab, SUSE Labs, schwab@suse.de
GPG Key fingerprint = 0196 BAD8 1CE9 1970 F4BE 1748 E4D4 88E3 0EEA B9D7
"And now for something completely different."
Hi, This series seems to have some coding style problems. See output below for more information: Type: series Message-id: mvmmv0nk6g7.fsf@suse.de Subject: [Qemu-devel] [PATCH] linux-user: Implement copy_file_range === TEST SCRIPT BEGIN === #!/bin/bash BASE=base n=1 total=$(git log --oneline $BASE.. | wc -l) failed=0 git config --local diff.renamelimit 0 git config --local diff.renames True commits="$(git log --format=%H --reverse $BASE..)" for c in $commits; do echo "Checking PATCH $n/$total: $(git log -n 1 --format=%s $c)..." if ! git show $c --format=email | ./scripts/checkpatch.pl --mailback -; then failed=1 echo fi n=$((n+1)) done exit $failed === TEST SCRIPT END === Updating 3c8cf5a9c21ff8782164d1def7f44bd888713384 Switched to a new branch 'test' 5741abe09e linux-user: Implement copy_file_range === OUTPUT BEGIN === Checking PATCH 1/1: linux-user: Implement copy_file_range... WARNING: architecture specific defines should be avoided #19: FILE: linux-user/syscall.c:1036: +#if defined(TARGET_NR_copy_file_range) && defined(__NR_copy_file_range) WARNING: architecture specific defines should be avoided #32: FILE: linux-user/syscall.c:12578: +#if defined(TARGET_NR_copy_file_range) && defined(__NR_copy_file_range) ERROR: space prohibited between function name and open parenthesis '(' #50: FILE: linux-user/syscall.c:12596: + ret = get_errno (safe_copy_file_range (arg1, pinoff, arg3, poutoff, ERROR: space prohibited between function name and open parenthesis '(' #50: FILE: linux-user/syscall.c:12596: + ret = get_errno (safe_copy_file_range (arg1, pinoff, arg3, poutoff, total: 2 errors, 2 warnings, 51 lines checked Your patch has style problems, please review. If any of these errors are false positives report them to the maintainer, see CHECKPATCH in MAINTAINERS. === OUTPUT END === Test command exited with code: 1 --- Email generated automatically by Patchew [http://patchew.org/]. Please send your feedback to patchew-devel@freelists.org
No attempt is made to emulate it on the host.
Signed-off-by: Andreas Schwab <schwab@suse.de>
---
v2: fix spacing
---
linux-user/syscall.c | 39 +++++++++++++++++++++++++++++++++++++++
1 file changed, 39 insertions(+)
diff --git a/linux-user/syscall.c b/linux-user/syscall.c
index bed154139e..92b4f59c05 100644
--- a/linux-user/syscall.c
+++ b/linux-user/syscall.c
@@ -1033,6 +1033,12 @@ safe_syscall5(int, mq_timedsend, int, mqdes, const char *, msg_ptr,
safe_syscall5(int, mq_timedreceive, int, mqdes, char *, msg_ptr,
size_t, len, unsigned *, prio, const struct timespec *, timeout)
#endif
+#if defined(TARGET_NR_copy_file_range) && defined(__NR_copy_file_range)
+safe_syscall6(ssize_t, copy_file_range, int, infd, loff_t *, pinoff,
+ int, outfd, loff_t *, poutoff, size_t, length,
+ unsigned int, flags)
+#endif
+
/* We do ioctl like this rather than via safe_syscall3 to preserve the
* "third argument might be integer or pointer or not present" behaviour of
* the libc function.
@@ -12601,6 +12607,39 @@ abi_long do_syscall(void *cpu_env, int num, abi_long arg1,
ret = get_errno(kcmp(arg1, arg2, arg3, arg4, arg5));
break;
#endif
+#if defined(TARGET_NR_copy_file_range) && defined(__NR_copy_file_range)
+ case TARGET_NR_copy_file_range:
+ {
+ loff_t inoff, outoff;
+ loff_t *pinoff = NULL, *poutoff = NULL;
+
+ if (arg2) {
+ if (get_user_u64(inoff, arg2)) {
+ goto efault;
+ }
+ pinoff = &inoff;
+ }
+ if (arg4) {
+ if (get_user_u64(outoff, arg4)) {
+ goto efault;
+ }
+ poutoff = &outoff;
+ }
+ ret = get_errno(safe_copy_file_range(arg1, pinoff, arg3, poutoff,
+ arg5, arg6));
+ if (arg2) {
+ if (put_user_u64(inoff, arg2)) {
+ goto efault;
+ }
+ }
+ if (arg4) {
+ if (put_user_u64(outoff, arg4)) {
+ goto efault;
+ }
+ }
+ }
+ break;
+#endif
default:
unimplemented:
--
2.16.1
--
Andreas Schwab, SUSE Labs, schwab@suse.de
GPG Key fingerprint = 0196 BAD8 1CE9 1970 F4BE 1748 E4D4 88E3 0EEA B9D7
"And now for something completely different."
Le 06/02/2018 à 11:31, Andreas Schwab a écrit : > No attempt is made to emulate it on the host. I don't understand what you mean here... > Signed-off-by: Andreas Schwab <schwab@suse.de> > --- > v2: fix spacing > --- > linux-user/syscall.c | 39 +++++++++++++++++++++++++++++++++++++++ > 1 file changed, 39 insertions(+) > > diff --git a/linux-user/syscall.c b/linux-user/syscall.c > index bed154139e..92b4f59c05 100644 > --- a/linux-user/syscall.c > +++ b/linux-user/syscall.c ... > +#if defined(TARGET_NR_copy_file_range) && defined(__NR_copy_file_range) > + case TARGET_NR_copy_file_range: > + { > + loff_t inoff, outoff; > + loff_t *pinoff = NULL, *poutoff = NULL; > + > + if (arg2) { > + if (get_user_u64(inoff, arg2)) { > + goto efault; > + } > + pinoff = &inoff; > + } > + if (arg4) { > + if (get_user_u64(outoff, arg4)) { > + goto efault; > + } > + poutoff = &outoff; > + } > + ret = get_errno(safe_copy_file_range(arg1, pinoff, arg3, poutoff, > + arg5, arg6)); > + if (arg2) { > + if (put_user_u64(inoff, arg2)) { > + goto efault; > + } > + } > + if (arg4) { > + if (put_user_u64(outoff, arg4)) { > + goto efault; > + } > + } According to the linux implementation, this should be something like: if (ret > 0) { if (arg2) { if (put_user_u64(inoff, arg2)) { ret = -TARGET_EFAULT; } } if (arg4) { if (put_user_u64(outoff, arg4)) { ret = -TARGET_EFAULT; } } } [TARGET_NR_splice should do this the same way] Thanks, Laurent
On Feb 15 2018, Laurent Vivier <laurent@vivier.eu> wrote: > Le 06/02/2018 à 11:31, Andreas Schwab a écrit : >> No attempt is made to emulate it on the host. > > I don't understand what you mean here... If your host doesn't have it, neither will the emulation. Andreas. -- Andreas Schwab, SUSE Labs, schwab@suse.de GPG Key fingerprint = 0196 BAD8 1CE9 1970 F4BE 1748 E4D4 88E3 0EEA B9D7 "And now for something completely different."
© 2016 - 2024 Red Hat, Inc.