linux-user: fix timerfd read endianness conversion
When reading the expiration count from a timerfd, the endianness of the 64bit value read is the one of the host, just as for eventfds. Signed-off-by: Mathis Marion <mathis.marion@silabs.com> Reviewed-by: Laurent Vivier <laurent@vivier.eu> Message-Id: <20230220085822.626798-2-Mathis.Marion@silabs.com> Signed-off-by: Laurent Vivier <laurent@vivier.eu>
This commit is contained in:
		
				
					committed by
					
						
						Laurent Vivier
					
				
			
			
				
	
			
			
			
						parent
						
							258bec39f3
						
					
				
				
					commit
					d759a62b12
				
			@@ -1622,7 +1622,7 @@ TargetFdTrans target_signalfd_trans = {
 | 
			
		||||
    .host_to_target_data = host_to_target_data_signalfd,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
static abi_long swap_data_eventfd(void *buf, size_t len)
 | 
			
		||||
static abi_long swap_data_u64(void *buf, size_t len)
 | 
			
		||||
{
 | 
			
		||||
    uint64_t *counter = buf;
 | 
			
		||||
    int i;
 | 
			
		||||
@@ -1640,8 +1640,12 @@ static abi_long swap_data_eventfd(void *buf, size_t len)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
TargetFdTrans target_eventfd_trans = {
 | 
			
		||||
    .host_to_target_data = swap_data_eventfd,
 | 
			
		||||
    .target_to_host_data = swap_data_eventfd,
 | 
			
		||||
    .host_to_target_data = swap_data_u64,
 | 
			
		||||
    .target_to_host_data = swap_data_u64,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
TargetFdTrans target_timerfd_trans = {
 | 
			
		||||
    .host_to_target_data = swap_data_u64,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
#if defined(CONFIG_INOTIFY) && (defined(TARGET_NR_inotify_init) || \
 | 
			
		||||
 
 | 
			
		||||
@@ -130,6 +130,7 @@ extern TargetFdTrans target_netlink_route_trans;
 | 
			
		||||
extern TargetFdTrans target_netlink_audit_trans;
 | 
			
		||||
extern TargetFdTrans target_signalfd_trans;
 | 
			
		||||
extern TargetFdTrans target_eventfd_trans;
 | 
			
		||||
extern TargetFdTrans target_timerfd_trans;
 | 
			
		||||
#if (defined(TARGET_NR_inotify_init) && defined(__NR_inotify_init)) || \
 | 
			
		||||
    (defined(CONFIG_INOTIFY1) && defined(TARGET_NR_inotify_init1) && \
 | 
			
		||||
     defined(__NR_inotify_init1))
 | 
			
		||||
 
 | 
			
		||||
@@ -13108,8 +13108,12 @@ static abi_long do_syscall1(CPUArchState *cpu_env, int num, abi_long arg1,
 | 
			
		||||
 | 
			
		||||
#if defined(TARGET_NR_timerfd_create) && defined(CONFIG_TIMERFD)
 | 
			
		||||
    case TARGET_NR_timerfd_create:
 | 
			
		||||
        return get_errno(timerfd_create(arg1,
 | 
			
		||||
        ret = get_errno(timerfd_create(arg1,
 | 
			
		||||
                        target_to_host_bitmask(arg2, fcntl_flags_tbl)));
 | 
			
		||||
        if (ret >= 0) {
 | 
			
		||||
            fd_trans_register(ret, &target_timerfd_trans);
 | 
			
		||||
        }
 | 
			
		||||
        return ret;
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if defined(TARGET_NR_timerfd_gettime) && defined(CONFIG_TIMERFD)
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user