Message ID | 1464705911-28960-2-git-send-email-peter.maydell@linaro.org (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Le 31/05/2016 à 16:45, Peter Maydell a écrit : > 32-bit ARM has an odd variant of the fadvise syscall which has > rearranged arguments, which we try to implement. Unfortunately we got > the rearrangement wrong. > > This is a six-argument syscall whose arguments are: > * fd > * advise parameter > * offset high half > * offset low half > * len high half > * len low half > > Stop trying to share code with the standard fadvise syscalls, > and just implement the syscall with the correct argument order. > > Signed-off-by: Peter Maydell <peter.maydell@linaro.org> > --- > linux-user/syscall.c | 22 +++++++++++----------- > 1 file changed, 11 insertions(+), 11 deletions(-) > > diff --git a/linux-user/syscall.c b/linux-user/syscall.c > index 7d5f123..4894919 100644 > --- a/linux-user/syscall.c > +++ b/linux-user/syscall.c > @@ -9329,18 +9329,18 @@ abi_long do_syscall(void *cpu_env, int num, abi_long arg1, > #endif > #ifdef TARGET_NR_arm_fadvise64_64 > case TARGET_NR_arm_fadvise64_64: > - { > - /* > - * arm_fadvise64_64 looks like fadvise64_64 but > - * with different argument order > - */ > - abi_long temp; > - temp = arg3; > - arg3 = arg4; > - arg4 = temp; > - } > + /* arm_fadvise64_64 looks like fadvise64_64 but > + * with different argument order: fd, advice, offset, len > + * rather than the usual fd, offset, len, advice. > + * Note that offset and len are both 64-bit so appear as > + * pairs of 32-bit registers. > + */ > + ret = posix_fadvise(arg1, target_offset64(arg3, arg4), > + target_offset64(arg5, arg6), arg2); > + ret = -host_to_target_errno(ret); > + break; > #endif > -#if defined(TARGET_NR_fadvise64_64) || defined(TARGET_NR_arm_fadvise64_64) || defined(TARGET_NR_fadvise64) > +#if defined(TARGET_NR_fadvise64_64) || defined(TARGET_NR_fadvise64) > #ifdef TARGET_NR_fadvise64_64 > case TARGET_NR_fadvise64_64: > #endif > Reviewed-by: Laurent Vivier <laurent@vivier.eu>
diff --git a/linux-user/syscall.c b/linux-user/syscall.c index 7d5f123..4894919 100644 --- a/linux-user/syscall.c +++ b/linux-user/syscall.c @@ -9329,18 +9329,18 @@ abi_long do_syscall(void *cpu_env, int num, abi_long arg1, #endif #ifdef TARGET_NR_arm_fadvise64_64 case TARGET_NR_arm_fadvise64_64: - { - /* - * arm_fadvise64_64 looks like fadvise64_64 but - * with different argument order - */ - abi_long temp; - temp = arg3; - arg3 = arg4; - arg4 = temp; - } + /* arm_fadvise64_64 looks like fadvise64_64 but + * with different argument order: fd, advice, offset, len + * rather than the usual fd, offset, len, advice. + * Note that offset and len are both 64-bit so appear as + * pairs of 32-bit registers. + */ + ret = posix_fadvise(arg1, target_offset64(arg3, arg4), + target_offset64(arg5, arg6), arg2); + ret = -host_to_target_errno(ret); + break; #endif -#if defined(TARGET_NR_fadvise64_64) || defined(TARGET_NR_arm_fadvise64_64) || defined(TARGET_NR_fadvise64) +#if defined(TARGET_NR_fadvise64_64) || defined(TARGET_NR_fadvise64) #ifdef TARGET_NR_fadvise64_64 case TARGET_NR_fadvise64_64: #endif
32-bit ARM has an odd variant of the fadvise syscall which has rearranged arguments, which we try to implement. Unfortunately we got the rearrangement wrong. This is a six-argument syscall whose arguments are: * fd * advise parameter * offset high half * offset low half * len high half * len low half Stop trying to share code with the standard fadvise syscalls, and just implement the syscall with the correct argument order. Signed-off-by: Peter Maydell <peter.maydell@linaro.org> --- linux-user/syscall.c | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-)