qemu-e2k/linux-user
Timothy E Baldwin 4d330cee37 linux-user: Provide safe_syscall for fixing races between signals and syscalls
If a signal is delivered immediately before a blocking system call the
handler will only be called after the system call returns, which may be a
long time later or never.

This is fixed by using a function (safe_syscall) that checks if a guest
signal is pending prior to making a system call, and if so does not call the
system call and returns -TARGET_ERESTARTSYS. If a signal is received between
the check and the system call host_signal_handler() rewinds execution to
before the check. This rewinding has the effect of closing the race window
so that safe_syscall will reliably either (a) go into the host syscall
with no unprocessed guest signals pending or or (b) return
-TARGET_ERESTARTSYS so that the caller can deal with the signals.
Implementing this requires a per-host-architecture assembly language
fragment.

This will also resolve the mishandling of the SA_RESTART flag where
we would restart a host system call and not call the guest signal handler
until the syscall finally completed -- syscall restarting now always
happens at the guest syscall level so the guest signal handler will run.
(The host syscall will never be restarted because if the host kernel
rewinds the PC to point at the syscall insn for a restart then our
host_signal_handler() will see this and arrange the guest PC rewind.)

This commit contains the infrastructure for implementing safe_syscall
and the assembly language fragment for x86-64, but does not change any
syscalls to use it.

Signed-off-by: Timothy Edward Baldwin <T.E.Baldwin99@members.leeds.ac.uk>
Message-id: 1441497448-32489-14-git-send-email-T.E.Baldwin99@members.leeds.ac.uk
[PMM:
 * Avoid having an architecture if-ladder in configure by putting
   linux-user/host/$(ARCH) on the include path and including
   safe-syscall.inc.S from it
 * Avoid ifdef ladder in signal.c by creating new hostdep.h to hold
   host-architecture-specific things
 * Added copyright/license header to safe-syscall.inc.S
 * Rewrote commit message
 * Added comments to safe-syscall.inc.S
 * Changed calling convention of safe_syscall() to match syscall()
   (returns -1 and host error in errno on failure)
 * Added a long comment in qemu.h about how to use safe_syscall()
   to implement guest syscalls.
]
RV: squashed Peters "fixup! linux-user: compile on non-x86-64 hosts"
patch
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
2016-05-27 14:49:51 +03:00
..
aarch64 linux-user: remove unavailable syscalls from aarch64 2016-02-23 21:25:10 +02:00
alpha linux-user: Support for restarting system calls for Alpha targets 2016-05-27 14:49:50 +03:00
arm linux-user: Support for restarting system calls for ARM targets 2016-05-27 14:49:49 +03:00
cris linux-user: Support for restarting system calls for CRIS targets 2016-05-27 14:49:50 +03:00
host linux-user: Provide safe_syscall for fixing races between signals and syscalls 2016-05-27 14:49:51 +03:00
i386 linux-user: correct timerfd_create syscall numbers 2016-02-23 21:25:10 +02:00
m68k linux-user: Support for restarting system calls for M68K targets 2016-05-27 14:49:50 +03:00
microblaze linux-user: Support for restarting system calls for Microblaze targets 2016-05-27 14:49:51 +03:00
mips linux-user: Support for restarting system calls for MIPS targets 2016-05-27 14:49:49 +03:00
mips64 linux-user: Support for restarting system calls for MIPS targets 2016-05-27 14:49:49 +03:00
openrisc linux-user: Support for restarting system calls for OpenRISC targets 2016-05-27 14:49:50 +03:00
ppc linux-user: Support for restarting system calls for PPC targets 2016-05-27 14:49:49 +03:00
s390x linux-user: Support for restarting system calls for S390 targets 2016-05-27 14:49:50 +03:00
sh4 linux-user: Support for restarting system calls for SH4 targets 2016-05-27 14:49:49 +03:00
sparc linux-user: Support for restarting system calls for SPARC targets 2016-05-27 14:49:49 +03:00
sparc64 linux-user: Support for restarting system calls for SPARC targets 2016-05-27 14:49:49 +03:00
tilegx linux-user: Support for restarting system calls for tilegx targets 2016-05-27 14:49:50 +03:00
unicore32 build: [linux-user] Rename "syscall.h" to "target_syscall.h" in target directories 2016-02-23 21:25:09 +02:00
x86_64 linux-user: correct timerfd_create syscall numbers 2016-02-23 21:25:10 +02:00
elfload.c util: move declarations out of qemu-common.h 2016-03-22 22:20:17 +01:00
errno_defs.h linux-user: Renumber TARGET_QEMU_ESIGRETURN, make it not arch-specific 2016-05-27 14:49:49 +03:00
flat.h
flatload.c osdep: add wrappers for socket functions 2016-03-10 17:19:07 +00:00
ioctls.h
linux_loop.h
linuxload.c linux-user: Clean up includes 2016-01-29 15:07:22 +00:00
m68k-sim.c linux-user: Clean up includes 2016-01-29 15:07:22 +00:00
main.c linux-user: Support for restarting system calls for Microblaze targets 2016-05-27 14:49:51 +03:00
Makefile.objs linux-user: Provide safe_syscall for fixing races between signals and syscalls 2016-05-27 14:49:51 +03:00
mmap.c linux-user: Clean up includes 2016-01-29 15:07:22 +00:00
qemu.h linux-user: Provide safe_syscall for fixing races between signals and syscalls 2016-05-27 14:49:51 +03:00
safe-syscall.S linux-user: Provide safe_syscall for fixing races between signals and syscalls 2016-05-27 14:49:51 +03:00
signal.c linux-user: Provide safe_syscall for fixing races between signals and syscalls 2016-05-27 14:49:51 +03:00
socket.h
strace.c linux-user: Clean up includes 2016-01-29 15:07:22 +00:00
strace.list
syscall_defs.h linux-user: Add SOCKOP_sendmmsg and SOCKOP_recvmmsg socket call, wire them up. 2016-01-11 14:54:03 +02:00
syscall_types.h
syscall.c linux-user: Provide safe_syscall for fixing races between signals and syscalls 2016-05-27 14:49:51 +03:00
target_flat.h
uaccess.c util: move declarations out of qemu-common.h 2016-03-22 22:20:17 +01:00
uname.c linux-user: Clean up includes 2016-01-29 15:07:22 +00:00
uname.h
vm86.c linux-user: Clean up includes 2016-01-29 15:07:22 +00:00