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:
Mathis Marion 2023-02-20 09:58:19 +01:00 committed by Laurent Vivier
parent 258bec39f3
commit d759a62b12
3 changed files with 14 additions and 5 deletions

View File

@ -1622,7 +1622,7 @@ TargetFdTrans target_signalfd_trans = {
.host_to_target_data = host_to_target_data_signalfd, .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; uint64_t *counter = buf;
int i; int i;
@ -1640,8 +1640,12 @@ static abi_long swap_data_eventfd(void *buf, size_t len)
} }
TargetFdTrans target_eventfd_trans = { TargetFdTrans target_eventfd_trans = {
.host_to_target_data = swap_data_eventfd, .host_to_target_data = swap_data_u64,
.target_to_host_data = swap_data_eventfd, .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) || \ #if defined(CONFIG_INOTIFY) && (defined(TARGET_NR_inotify_init) || \

View File

@ -130,6 +130,7 @@ extern TargetFdTrans target_netlink_route_trans;
extern TargetFdTrans target_netlink_audit_trans; extern TargetFdTrans target_netlink_audit_trans;
extern TargetFdTrans target_signalfd_trans; extern TargetFdTrans target_signalfd_trans;
extern TargetFdTrans target_eventfd_trans; extern TargetFdTrans target_eventfd_trans;
extern TargetFdTrans target_timerfd_trans;
#if (defined(TARGET_NR_inotify_init) && defined(__NR_inotify_init)) || \ #if (defined(TARGET_NR_inotify_init) && defined(__NR_inotify_init)) || \
(defined(CONFIG_INOTIFY1) && defined(TARGET_NR_inotify_init1) && \ (defined(CONFIG_INOTIFY1) && defined(TARGET_NR_inotify_init1) && \
defined(__NR_inotify_init1)) defined(__NR_inotify_init1))

View File

@ -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) #if defined(TARGET_NR_timerfd_create) && defined(CONFIG_TIMERFD)
case TARGET_NR_timerfd_create: 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))); target_to_host_bitmask(arg2, fcntl_flags_tbl)));
if (ret >= 0) {
fd_trans_register(ret, &target_timerfd_trans);
}
return ret;
#endif #endif
#if defined(TARGET_NR_timerfd_gettime) && defined(CONFIG_TIMERFD) #if defined(TARGET_NR_timerfd_gettime) && defined(CONFIG_TIMERFD)