linux-user: Implement sync_file_range{,2} syscalls
Implement the missing syscalls sync_file_range and sync_file_range2. The latter in particular is used by newer versions of apt on Ubuntu for ARM. Signed-off-by: Peter Maydell <peter.maydell@linaro.org> Signed-off-by: Riku Voipio <riku.voipio@iki.fi>
This commit is contained in:
parent
2a704b137f
commit
c727f47d59
18
configure
vendored
18
configure
vendored
@ -2075,6 +2075,21 @@ if compile_prog "$ARCH_CFLAGS" "" ; then
|
||||
fallocate=yes
|
||||
fi
|
||||
|
||||
# check for sync_file_range
|
||||
sync_file_range=no
|
||||
cat > $TMPC << EOF
|
||||
#include <fcntl.h>
|
||||
|
||||
int main(void)
|
||||
{
|
||||
sync_file_range(0, 0, 0, 0);
|
||||
return 0;
|
||||
}
|
||||
EOF
|
||||
if compile_prog "$ARCH_CFLAGS" "" ; then
|
||||
sync_file_range=yes
|
||||
fi
|
||||
|
||||
# check for dup3
|
||||
dup3=no
|
||||
cat > $TMPC << EOF
|
||||
@ -2613,6 +2628,9 @@ fi
|
||||
if test "$fallocate" = "yes" ; then
|
||||
echo "CONFIG_FALLOCATE=y" >> $config_host_mak
|
||||
fi
|
||||
if test "$sync_file_range" = "yes" ; then
|
||||
echo "CONFIG_SYNC_FILE_RANGE=y" >> $config_host_mak
|
||||
fi
|
||||
if test "$dup3" = "yes" ; then
|
||||
echo "CONFIG_DUP3=y" >> $config_host_mak
|
||||
fi
|
||||
|
@ -1518,3 +1518,9 @@
|
||||
#ifdef TARGET_NR_utimensat
|
||||
{ TARGET_NR_utimensat, "utimensat", NULL, print_utimensat, NULL },
|
||||
#endif
|
||||
#ifdef TARGET_NR_sync_file_range
|
||||
{ TARGET_NR_sync_file_range, "sync_file_range", NULL, NULL, NULL },
|
||||
#endif
|
||||
#ifdef TARGET_NR_sync_file_range2
|
||||
{ TARGET_NR_sync_file_range2, "sync_file_range2", NULL, NULL, NULL },
|
||||
#endif
|
||||
|
@ -7364,6 +7364,29 @@ abi_long do_syscall(void *cpu_env, int num, abi_long arg1,
|
||||
case TARGET_NR_fallocate:
|
||||
ret = get_errno(fallocate(arg1, arg2, arg3, arg4));
|
||||
break;
|
||||
#endif
|
||||
#if defined(CONFIG_SYNC_FILE_RANGE)
|
||||
#if defined(TARGET_NR_sync_file_range)
|
||||
case TARGET_NR_sync_file_range:
|
||||
#if TARGET_ABI_BITS == 32
|
||||
ret = get_errno(sync_file_range(arg1, target_offset64(arg2, arg3),
|
||||
target_offset64(arg4, arg5), arg6));
|
||||
#else
|
||||
ret = get_errno(sync_file_range(arg1, arg2, arg3, arg4));
|
||||
#endif
|
||||
break;
|
||||
#endif
|
||||
#if defined(TARGET_NR_sync_file_range2)
|
||||
case TARGET_NR_sync_file_range2:
|
||||
/* This is like sync_file_range but the arguments are reordered */
|
||||
#if TARGET_ABI_BITS == 32
|
||||
ret = get_errno(sync_file_range(arg1, target_offset64(arg3, arg4),
|
||||
target_offset64(arg5, arg6), arg2));
|
||||
#else
|
||||
ret = get_errno(sync_file_range(arg1, arg3, arg4, arg2));
|
||||
#endif
|
||||
break;
|
||||
#endif
|
||||
#endif
|
||||
default:
|
||||
unimplemented:
|
||||
|
Loading…
Reference in New Issue
Block a user