@@ -415,42 +415,6 @@ extern long safe_syscall_base(int *pending, long number, ...);
/* syscall.c */
int host_to_target_waitstatus(int status);
-/* signal.c */
-void process_pending_signals(CPUArchState *cpu_env);
-void signal_init(void);
-int queue_signal(CPUArchState *env, int sig, int si_type,
- target_siginfo_t *info);
-void host_to_target_siginfo(target_siginfo_t *tinfo, const siginfo_t *info);
-void target_to_host_siginfo(siginfo_t *info, const target_siginfo_t *tinfo);
-int target_to_host_signal(int sig);
-int host_to_target_signal(int sig);
-long do_sigreturn(CPUArchState *env);
-long do_rt_sigreturn(CPUArchState *env);
-abi_long do_sigaltstack(abi_ulong uss_addr, abi_ulong uoss_addr,
- CPUArchState *env);
-int do_sigprocmask(int how, const sigset_t *set, sigset_t *oldset);
-abi_long do_swapcontext(CPUArchState *env, abi_ulong uold_ctx,
- abi_ulong unew_ctx, abi_long ctx_size);
-/**
- * block_signals: block all signals while handling this guest syscall
- *
- * Block all signals, and arrange that the signal mask is returned to
- * its correct value for the guest before we resume execution of guest code.
- * If this function returns non-zero, then the caller should immediately
- * return -TARGET_ERESTARTSYS to the main loop, which will take the pending
- * signal and restart execution of the syscall.
- * If block_signals() returns zero, then the caller can continue with
- * emulation of the system call knowing that no signals can be taken
- * (and therefore that no race conditions will result).
- * This should only be called once, because if it is called a second time
- * it will always return non-zero. (Think of it like a mutex that can't
- * be recursively locked.)
- * Signals will be unblocked again by process_pending_signals().
- *
- * Return value: non-zero if there was a pending signal, zero if not.
- */
-int block_signals(void); /* Returns non zero if signal pending */
-
#ifdef TARGET_I386
/* vm86.c */
void save_v86_state(CPUX86State *env);
new file mode 100644
@@ -0,0 +1,56 @@
+/*
+ * sighandling.h: prototypes for linux-user signal handling
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, see <http://www.gnu.org/licenses/>.
+ */
+#ifndef LINUX_USER_SIGHANDLING_H
+#define LINUX_USER_SIGHANDLING_H
+
+/* signal.c */
+void process_pending_signals(CPUArchState *cpu_env);
+void signal_init(void);
+int queue_signal(CPUArchState *env, int sig, int si_type,
+ target_siginfo_t *info);
+void host_to_target_siginfo(target_siginfo_t *tinfo, const siginfo_t *info);
+void target_to_host_siginfo(siginfo_t *info, const target_siginfo_t *tinfo);
+int target_to_host_signal(int sig);
+int host_to_target_signal(int sig);
+long do_sigreturn(CPUArchState *env);
+long do_rt_sigreturn(CPUArchState *env);
+abi_long do_sigaltstack(abi_ulong uss_addr, abi_ulong uoss_addr,
+ CPUArchState *env);
+int do_sigprocmask(int how, const sigset_t *set, sigset_t *oldset);
+abi_long do_swapcontext(CPUArchState *env, abi_ulong uold_ctx,
+ abi_ulong unew_ctx, abi_long ctx_size);
+/**
+ * block_signals: block all signals while handling this guest syscall
+ *
+ * Block all signals, and arrange that the signal mask is returned to
+ * its correct value for the guest before we resume execution of guest code.
+ * If this function returns non-zero, then the caller should immediately
+ * return -TARGET_ERESTARTSYS to the main loop, which will take the pending
+ * signal and restart execution of the syscall.
+ * If block_signals() returns zero, then the caller can continue with
+ * emulation of the system call knowing that no signals can be taken
+ * (and therefore that no race conditions will result).
+ * This should only be called once, because if it is called a second time
+ * it will always return non-zero. (Think of it like a mutex that can't
+ * be recursively locked.)
+ * Signals will be unblocked again by process_pending_signals().
+ *
+ * Return value: non-zero if there was a pending signal, zero if not.
+ */
+int block_signals(void); /* Returns non zero if signal pending */
+
+#endif /* LINUX_USER_SIGHANDLING_H */
@@ -21,6 +21,7 @@
#include "qemu-common.h"
#include "qemu.h"
#include "cpu_loop-common.h"
+#include "sighandling.h"
#include "qemu/guest-random.h"
#include "semihosting/common-semi.h"
#include "target/arm/syndrome.h"
@@ -19,6 +19,7 @@
#include "qemu/osdep.h"
#include "qemu.h"
#include "signal-common.h"
+#include "sighandling.h"
#include "linux-user/trace.h"
struct target_sigcontext {
@@ -21,6 +21,7 @@
#include "qemu-common.h"
#include "qemu.h"
#include "cpu_loop-common.h"
+#include "sighandling.h"
void cpu_loop(CPUAlphaState *env)
{
@@ -19,6 +19,7 @@
#include "qemu/osdep.h"
#include "qemu.h"
#include "signal-common.h"
+#include "sighandling.h"
#include "linux-user/trace.h"
struct target_sigcontext {
@@ -22,6 +22,7 @@
#include "qemu.h"
#include "elf.h"
#include "cpu_loop-common.h"
+#include "sighandling.h"
#include "semihosting/common-semi.h"
#define get_user_code_u32(x, gaddr, env) \
@@ -19,6 +19,7 @@
#include "qemu/osdep.h"
#include "qemu.h"
#include "signal-common.h"
+#include "sighandling.h"
#include "linux-user/trace.h"
struct target_sigcontext {
@@ -21,6 +21,7 @@
#include "qemu-common.h"
#include "qemu.h"
#include "cpu_loop-common.h"
+#include "sighandling.h"
void cpu_loop(CPUCRISState *env)
{
@@ -19,6 +19,7 @@
#include "qemu/osdep.h"
#include "qemu.h"
#include "signal-common.h"
+#include "sighandling.h"
#include "linux-user/trace.h"
struct target_sigcontext {
@@ -28,6 +28,7 @@
#endif
#include "qemu.h"
#include "fd-trans.h"
+#include "sighandling.h"
enum {
QEMU_IFLA_BR_UNSPEC,
@@ -21,6 +21,7 @@
#include "qemu/osdep.h"
#include "qemu.h"
#include "cpu_loop-common.h"
+#include "sighandling.h"
#include "internal.h"
void cpu_loop(CPUHexagonState *env)
@@ -20,6 +20,7 @@
#include "qemu/osdep.h"
#include "qemu.h"
#include "signal-common.h"
+#include "sighandling.h"
#include "linux-user/trace.h"
struct target_sigcontext {
@@ -20,6 +20,7 @@
#include "qemu/osdep.h"
#include "qemu.h"
#include "cpu_loop-common.h"
+#include "sighandling.h"
static abi_ulong hppa_lws(CPUHPPAState *env)
{
@@ -19,6 +19,7 @@
#include "qemu/osdep.h"
#include "qemu.h"
#include "signal-common.h"
+#include "sighandling.h"
#include "linux-user/trace.h"
struct target_sigcontext {
@@ -21,6 +21,7 @@
#include "qemu-common.h"
#include "qemu.h"
#include "cpu_loop-common.h"
+#include "sighandling.h"
/***********************************************************/
/* CPUX86 core interface */
@@ -19,6 +19,7 @@
#include "qemu/osdep.h"
#include "qemu.h"
#include "signal-common.h"
+#include "sighandling.h"
#include "linux-user/trace.h"
/* from the Linux kernel - /arch/x86/include/uapi/asm/sigcontext.h */
@@ -21,6 +21,7 @@
#include "qemu-common.h"
#include "qemu.h"
#include "cpu_loop-common.h"
+#include "sighandling.h"
void cpu_loop(CPUM68KState *env)
{
@@ -19,6 +19,7 @@
#include "qemu/osdep.h"
#include "qemu.h"
#include "signal-common.h"
+#include "sighandling.h"
#include "linux-user/trace.h"
struct target_sigcontext {
@@ -49,6 +49,7 @@
#include "cpu_loop-common.h"
#include "crypto/init.h"
#include "fd-trans.h"
+#include "sighandling.h"
#ifndef AT_FLAGS_PRESERVE_ARGV0
#define AT_FLAGS_PRESERVE_ARGV0_BIT 0
@@ -21,6 +21,7 @@
#include "qemu-common.h"
#include "qemu.h"
#include "cpu_loop-common.h"
+#include "sighandling.h"
void cpu_loop(CPUMBState *env)
{
@@ -19,6 +19,7 @@
#include "qemu/osdep.h"
#include "qemu.h"
#include "signal-common.h"
+#include "sighandling.h"
#include "linux-user/trace.h"
struct target_sigcontext {
@@ -21,6 +21,7 @@
#include "qemu-common.h"
#include "qemu.h"
#include "cpu_loop-common.h"
+#include "sighandling.h"
#include "elf.h"
#include "internal.h"
#include "fpu_helper.h"
@@ -19,6 +19,7 @@
#include "qemu/osdep.h"
#include "qemu.h"
#include "signal-common.h"
+#include "sighandling.h"
#include "linux-user/trace.h"
# if defined(TARGET_ABI_MIPSO32)
@@ -20,6 +20,7 @@
#include "qemu/osdep.h"
#include "qemu.h"
#include "cpu_loop-common.h"
+#include "sighandling.h"
void cpu_loop(CPUNios2State *env)
{
@@ -19,6 +19,7 @@
#include "qemu/osdep.h"
#include "qemu.h"
#include "signal-common.h"
+#include "sighandling.h"
#include "linux-user/trace.h"
#define MCONTEXT_VERSION 2
@@ -21,6 +21,7 @@
#include "qemu-common.h"
#include "qemu.h"
#include "cpu_loop-common.h"
+#include "sighandling.h"
void cpu_loop(CPUOpenRISCState *env)
{
@@ -19,6 +19,7 @@
#include "qemu/osdep.h"
#include "qemu.h"
#include "signal-common.h"
+#include "sighandling.h"
#include "linux-user/trace.h"
typedef struct target_sigcontext {
@@ -21,6 +21,7 @@
#include "qemu-common.h"
#include "qemu.h"
#include "cpu_loop-common.h"
+#include "sighandling.h"
static inline uint64_t cpu_ppc_get_tb(CPUPPCState *env)
{
@@ -19,6 +19,7 @@
#include "qemu/osdep.h"
#include "qemu.h"
#include "signal-common.h"
+#include "sighandling.h"
#include "linux-user/trace.h"
/* Size of dummy stack frame allocated when calling signal handler.
@@ -22,6 +22,7 @@
#include "qemu/error-report.h"
#include "qemu.h"
#include "cpu_loop-common.h"
+#include "sighandling.h"
#include "elf.h"
#include "semihosting/common-semi.h"
@@ -19,6 +19,7 @@
#include "qemu/osdep.h"
#include "qemu.h"
#include "signal-common.h"
+#include "sighandling.h"
#include "linux-user/trace.h"
/* Signal handler invocation must be transparent for the code being
@@ -21,6 +21,7 @@
#include "qemu-common.h"
#include "qemu.h"
#include "cpu_loop-common.h"
+#include "sighandling.h"
/* s390x masks the fault address it reports in si_addr for SIGSEGV and SIGBUS */
#define S390X_FAIL_ADDR_MASK -4096LL
@@ -19,6 +19,7 @@
#include "qemu/osdep.h"
#include "qemu.h"
#include "signal-common.h"
+#include "sighandling.h"
#include "linux-user/trace.h"
#define __NUM_GPRS 16
@@ -21,6 +21,7 @@
#include "qemu-common.h"
#include "qemu.h"
#include "cpu_loop-common.h"
+#include "sighandling.h"
void cpu_loop(CPUSH4State *env)
{
@@ -19,6 +19,7 @@
#include "qemu/osdep.h"
#include "qemu.h"
#include "signal-common.h"
+#include "sighandling.h"
#include "linux-user/trace.h"
/*
@@ -23,6 +23,7 @@
#include "qemu.h"
#include "strace.h"
+#include "sighandling.h"
#include "trace.h"
#include "signal-common.h"
@@ -21,6 +21,7 @@
#include "qemu-common.h"
#include "qemu.h"
#include "cpu_loop-common.h"
+#include "sighandling.h"
#define SPARC64_STACK_BIAS 2047
@@ -19,6 +19,7 @@
#include "qemu/osdep.h"
#include "qemu.h"
#include "signal-common.h"
+#include "sighandling.h"
#include "linux-user/trace.h"
/* A Sparc register window */
@@ -128,6 +128,7 @@
#include "qemu.h"
#include "strace.h"
+#include "sighandling.h"
#include "qemu/guest-random.h"
#include "qemu/selfmap.h"
#include "user/syscall-trace.h"
@@ -20,6 +20,7 @@
#include "qemu/osdep.h"
#include "qemu.h"
#include "cpu_loop-common.h"
+#include "sighandling.h"
static void xtensa_rfw(CPUXtensaState *env)
{
@@ -19,6 +19,7 @@
#include "qemu/osdep.h"
#include "qemu.h"
#include "signal-common.h"
+#include "sighandling.h"
#include "linux-user/trace.h"
struct target_sigcontext {
Split the signal related prototypes into a new header file sighandling.h, and include it in those places that require it. Signed-off-by: Peter Maydell <peter.maydell@linaro.org> --- linux-user/qemu.h | 36 -------------------- linux-user/sighandling.h | 56 ++++++++++++++++++++++++++++++++ linux-user/aarch64/cpu_loop.c | 1 + linux-user/aarch64/signal.c | 1 + linux-user/alpha/cpu_loop.c | 1 + linux-user/alpha/signal.c | 1 + linux-user/arm/cpu_loop.c | 1 + linux-user/arm/signal.c | 1 + linux-user/cris/cpu_loop.c | 1 + linux-user/cris/signal.c | 1 + linux-user/fd-trans.c | 1 + linux-user/hexagon/cpu_loop.c | 1 + linux-user/hexagon/signal.c | 1 + linux-user/hppa/cpu_loop.c | 1 + linux-user/hppa/signal.c | 1 + linux-user/i386/cpu_loop.c | 1 + linux-user/i386/signal.c | 1 + linux-user/m68k/cpu_loop.c | 1 + linux-user/m68k/signal.c | 1 + linux-user/main.c | 1 + linux-user/microblaze/cpu_loop.c | 1 + linux-user/microblaze/signal.c | 1 + linux-user/mips/cpu_loop.c | 1 + linux-user/mips/signal.c | 1 + linux-user/nios2/cpu_loop.c | 1 + linux-user/nios2/signal.c | 1 + linux-user/openrisc/cpu_loop.c | 1 + linux-user/openrisc/signal.c | 1 + linux-user/ppc/cpu_loop.c | 1 + linux-user/ppc/signal.c | 1 + linux-user/riscv/cpu_loop.c | 1 + linux-user/riscv/signal.c | 1 + linux-user/s390x/cpu_loop.c | 1 + linux-user/s390x/signal.c | 1 + linux-user/sh4/cpu_loop.c | 1 + linux-user/sh4/signal.c | 1 + linux-user/signal.c | 1 + linux-user/sparc/cpu_loop.c | 1 + linux-user/sparc/signal.c | 1 + linux-user/syscall.c | 1 + linux-user/xtensa/cpu_loop.c | 1 + linux-user/xtensa/signal.c | 1 + 42 files changed, 96 insertions(+), 36 deletions(-) create mode 100644 linux-user/sighandling.h -- 2.20.1