[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH v2 28/28] linux-user: Use safe_syscall for futex sys
From: |
Peter Maydell |
Subject: |
[Qemu-devel] [PATCH v2 28/28] linux-user: Use safe_syscall for futex syscall |
Date: |
Thu, 12 May 2016 18:47:52 +0100 |
Use the safe_syscall wrapper for the futex syscall.
In particular, this fixes hangs when using programs that link
against the Boehm garbage collector, including the Mono runtime.
(We don't change the sys_futex() call in the implementation of
the exit syscall, because as the FIXME comment there notes
that should be handled by disabling signals, since we can't
easily back out if the futex were to return ERESTARTSYS.)
Signed-off-by: Peter Maydell <address@hidden>
---
linux-user/syscall.c | 18 ++++++++++--------
1 file changed, 10 insertions(+), 8 deletions(-)
diff --git a/linux-user/syscall.c b/linux-user/syscall.c
index c9c2ae9..4e419fb 100644
--- a/linux-user/syscall.c
+++ b/linux-user/syscall.c
@@ -697,6 +697,8 @@ safe_syscall5(int, waitid, idtype_t, idtype, id_t, id,
siginfo_t *, infop, \
safe_syscall3(int, execve, const char *, filename, char **, argv, char **,
envp)
safe_syscall6(int, pselect6, int, nfds, fd_set *, readfds, fd_set *, writefds,
\
fd_set *, exceptfds, struct timespec *, timeout, void *, sig)
+safe_syscall6(int,futex,int *,uaddr,int,op,int,val, \
+ const struct timespec *,timeout,int *,uaddr2,int,val3)
static inline int host_to_target_sock_type(int host_type)
{
@@ -5381,12 +5383,12 @@ static int do_futex(target_ulong uaddr, int op, int
val, target_ulong timeout,
} else {
pts = NULL;
}
- return get_errno(sys_futex(g2h(uaddr), op, tswap32(val),
+ return get_errno(safe_futex(g2h(uaddr), op, tswap32(val),
pts, NULL, val3));
case FUTEX_WAKE:
- return get_errno(sys_futex(g2h(uaddr), op, val, NULL, NULL, 0));
+ return get_errno(safe_futex(g2h(uaddr), op, val, NULL, NULL, 0));
case FUTEX_FD:
- return get_errno(sys_futex(g2h(uaddr), op, val, NULL, NULL, 0));
+ return get_errno(safe_futex(g2h(uaddr), op, val, NULL, NULL, 0));
case FUTEX_REQUEUE:
case FUTEX_CMP_REQUEUE:
case FUTEX_WAKE_OP:
@@ -5396,11 +5398,11 @@ static int do_futex(target_ulong uaddr, int op, int
val, target_ulong timeout,
to satisfy the compiler. We do not need to tswap TIMEOUT
since it's not compared to guest memory. */
pts = (struct timespec *)(uintptr_t) timeout;
- return get_errno(sys_futex(g2h(uaddr), op, val, pts,
- g2h(uaddr2),
- (base_op == FUTEX_CMP_REQUEUE
- ? tswap32(val3)
- : val3)));
+ return get_errno(safe_futex(g2h(uaddr), op, val, pts,
+ g2h(uaddr2),
+ (base_op == FUTEX_CMP_REQUEUE
+ ? tswap32(val3)
+ : val3)));
default:
return -TARGET_ENOSYS;
}
--
1.9.1
- [Qemu-devel] [PATCH v2 12/28] linux-user: Support for restarting system calls for Alpha targets, (continued)
- [Qemu-devel] [PATCH v2 12/28] linux-user: Support for restarting system calls for Alpha targets, Peter Maydell, 2016/05/12
- [Qemu-devel] [PATCH v2 23/28] linux-user: Use safe_syscall for read and write system calls, Peter Maydell, 2016/05/12
- [Qemu-devel] [PATCH v2 08/28] linux-user: Support for restarting system calls for MIPS targets, Peter Maydell, 2016/05/12
- [Qemu-devel] [PATCH v2 16/28] linux-user: Support for restarting system calls for S390 targets, Peter Maydell, 2016/05/12
- [Qemu-devel] [PATCH v2 03/28] linux-user: Reindent signal handling, Peter Maydell, 2016/05/12
- [Qemu-devel] [PATCH v2 10/28] linux-user: Support for restarting system calls for SPARC targets, Peter Maydell, 2016/05/12
- [Qemu-devel] [PATCH v2 26/28] linux-user: Use safe_syscall for execve syscall, Peter Maydell, 2016/05/12
- [Qemu-devel] [PATCH v2 28/28] linux-user: Use safe_syscall for futex syscall,
Peter Maydell <=
- [Qemu-devel] [PATCH v2 21/28] linux-user: Add debug code to exercise restarting system calls, Peter Maydell, 2016/05/12
- Re: [Qemu-devel] [PATCH v2 00/28] linux-user: fix race between signals and syscalls, Peter Maydell, 2016/05/23
- Re: [Qemu-devel] [PATCH v2 00/28] linux-user: fix race between signals and syscalls, Riku Voipio, 2016/05/24