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…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 Peter Maydell
						Peter Maydell