linux-user: Fix handling of arm_fadvise64_64 syscall
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> Reviewed-by: Laurent Vivier <laurent@vivier.eu> Signed-off-by: Riku Voipio <riku.voipio@linaro.org>
This commit is contained in:
parent
9e024732f5
commit
e0156a9dc4
@ -9970,18 +9970,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
|
||||
|
Loading…
Reference in New Issue
Block a user