mirror of
https://github.com/qemu/qemu.git
synced 2024-11-23 10:53:37 +08:00
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>
(cherry picked from commit d759a62b12
)
Signed-off-by: Michael Tokarev <mjt@tls.msk.ru>
This commit is contained in:
parent
b6abbe6250
commit
73a11e3723
@ -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))
|
||||
|
@ -13120,8 +13120,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,
|
||||
target_to_host_bitmask(arg2, fcntl_flags_tbl)));
|
||||
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)
|
||||
|
Loading…
Reference in New Issue
Block a user