From: Warner Losh <imp@bsdimp.com>
To: qemu-devel@nongnu.org
Cc: Peter Maydell <peter.maydell@linaro.org>,
Stacey Son <sson@FreeBSD.org>, Kyle Evans <kevans@freebsd.org>,
Richard Henderson <richard.henderson@linaro.org>,
def@FreeBSD.org, jrtc27@FreeBSD.org, Warner Losh <imp@bsdimp.com>
Subject: [PATCH v3 17/40] bsd-user/signal.c: Implement signal_init()
Date: Fri, 28 Jan 2022 16:27:42 -0700 [thread overview]
Message-ID: <20220128232805.86191-18-imp@bsdimp.com> (raw)
In-Reply-To: <20220128232805.86191-1-imp@bsdimp.com>
Initialize the signal state for the emulator. Setup a set of sane
default signal handlers, mirroring the host's signals. For fatal signals
(those that exit by default), establish our own set of signal
handlers. Stub out the actual signal handler we use for the moment.
Signed-off-by: Stacey Son <sson@FreeBSD.org>
Signed-off-by: Kyle Evans <kevans@freebsd.org>
Signed-off-by: Warner Losh <imp@bsdimp.com>
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
Reviewed-by: Richard Henderson <richard.henderson@linaro.org> XXX SIGPROF PENDING
---
bsd-user/qemu.h | 7 +++++
bsd-user/signal.c | 67 +++++++++++++++++++++++++++++++++++++++++++++++
2 files changed, 74 insertions(+)
diff --git a/bsd-user/qemu.h b/bsd-user/qemu.h
index 99c37fc9942..49f01932a53 100644
--- a/bsd-user/qemu.h
+++ b/bsd-user/qemu.h
@@ -94,6 +94,13 @@ typedef struct TaskState {
* from multiple threads.)
*/
int signal_pending;
+ /*
+ * This thread's signal mask, as requested by the guest program.
+ * The actual signal mask of this thread may differ:
+ * + we don't let SIGSEGV and SIGBUS be blocked while running guest code
+ * + sometimes we block all signals to avoid races
+ */
+ sigset_t signal_mask;
uint8_t stack[];
} __attribute__((aligned(16))) TaskState;
diff --git a/bsd-user/signal.c b/bsd-user/signal.c
index 1313baec96a..3ef7cf5e23c 100644
--- a/bsd-user/signal.c
+++ b/bsd-user/signal.c
@@ -28,6 +28,9 @@
* fork.
*/
+static struct target_sigaction sigact_table[TARGET_NSIG];
+static void host_signal_handler(int host_sig, siginfo_t *info, void *puc);
+
/*
* The BSD ABIs use the same singal numbers across all the CPU architectures, so
* (unlike Linux) these functions are just the identity mapping. This might not
@@ -52,6 +55,28 @@ void queue_signal(CPUArchState *env, int sig, target_siginfo_t *info)
qemu_log_mask(LOG_UNIMP, "No signal queueing, dropping signal %d\n", sig);
}
+static int fatal_signal(int sig)
+{
+
+ switch (sig) {
+ case TARGET_SIGCHLD:
+ case TARGET_SIGURG:
+ case TARGET_SIGWINCH:
+ case TARGET_SIGINFO:
+ /* Ignored by default. */
+ return 0;
+ case TARGET_SIGCONT:
+ case TARGET_SIGSTOP:
+ case TARGET_SIGTSTP:
+ case TARGET_SIGTTIN:
+ case TARGET_SIGTTOU:
+ /* Job control signals. */
+ return 0;
+ default:
+ return 1;
+ }
+}
+
/*
* Force a synchronously taken QEMU_SI_FAULT signal. For QEMU the
* 'force' part is handled in process_pending_signals().
@@ -69,8 +94,50 @@ void force_sig_fault(int sig, int code, abi_ulong addr)
queue_signal(env, sig, &info);
}
+static void host_signal_handler(int host_sig, siginfo_t *info, void *puc)
+{
+}
+
void signal_init(void)
{
+ TaskState *ts = (TaskState *)thread_cpu->opaque;
+ struct sigaction act;
+ struct sigaction oact;
+ int i;
+ int host_sig;
+
+ /* Set the signal mask from the host mask. */
+ sigprocmask(0, 0, &ts->signal_mask);
+
+ sigfillset(&act.sa_mask);
+ act.sa_sigaction = host_signal_handler;
+ act.sa_flags = SA_SIGINFO;
+
+ for (i = 1; i <= TARGET_NSIG; i++) {
+#ifdef CONFIG_GPROF
+ if (i == TARGET_SIGPROF) {
+ continue;
+ }
+#endif
+ host_sig = target_to_host_signal(i);
+ sigaction(host_sig, NULL, &oact);
+ if (oact.sa_sigaction == (void *)SIG_IGN) {
+ sigact_table[i - 1]._sa_handler = TARGET_SIG_IGN;
+ } else if (oact.sa_sigaction == (void *)SIG_DFL) {
+ sigact_table[i - 1]._sa_handler = TARGET_SIG_DFL;
+ }
+ /*
+ * If there's already a handler installed then something has
+ * gone horribly wrong, so don't even try to handle that case.
+ * Install some handlers for our own use. We need at least
+ * SIGSEGV and SIGBUS, to detect exceptions. We can not just
+ * trap all signals because it affects syscall interrupt
+ * behavior. But do trap all default-fatal signals.
+ */
+ if (fatal_signal(i)) {
+ sigaction(host_sig, &act, NULL);
+ }
+ }
}
void process_pending_signals(CPUArchState *cpu_env)
--
2.33.1
next prev parent reply other threads:[~2022-01-29 0:12 UTC|newest]
Thread overview: 44+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-01-28 23:27 [PATCH v3 00/40] bsd-user: upstream signal implementation Warner Losh
2022-01-28 23:27 ` [PATCH v3 01/40] bsd-user: Complete FreeBSD siginfo Warner Losh
2022-01-28 23:27 ` [PATCH v3 02/40] bsd-user: Create setup_sigframe_arch to setup sigframe context Warner Losh
2022-01-28 23:27 ` [PATCH v3 03/40] bsd-user/arm/signal.c: Implement setup_sigframe_arch for arm Warner Losh
2022-01-28 23:27 ` [PATCH v3 04/40] bsd-user/arm/signal.c: get_mcontext should zero vfp data Warner Losh
2022-01-28 23:27 ` [PATCH v3 05/40] bsd-user: Remove vestiges of signal queueing code Warner Losh
2022-01-28 23:27 ` [PATCH v3 06/40] bsd-user: Bring in docs from linux-user for signal_pending Warner Losh
2022-01-28 23:27 ` [PATCH v3 07/40] bsd-user/arm/target_arch_cpu.h: Move EXCP_ATOMIC to match linux-user Warner Losh
2022-01-28 23:27 ` [PATCH v3 08/40] bsd-user/signal.c: implement force_sig_fault Warner Losh
2022-01-28 23:27 ` [PATCH v3 09/40] bsd-user/signal-common.h: Move signal functions prototypes to here Warner Losh
2022-01-28 23:27 ` [PATCH v3 10/40] bsd-user/signal.c: Implement cpu_loop_exit_sigsegv Warner Losh
2022-01-28 23:27 ` [PATCH v3 11/40] bsd-user/signal.c: implement cpu_loop_exit_sigbus Warner Losh
2022-01-28 23:27 ` [PATCH v3 12/40] bsd-user/arm/arget_arch_cpu.h: Move EXCP_DEBUG and EXCP_BKPT together Warner Losh
2022-01-28 23:27 ` [PATCH v3 13/40] bsd-user/arm/target_arch_cpu.h: Correct code pointer Warner Losh
2022-01-28 23:27 ` [PATCH v3 14/40] bsd-user/arm/target_arch_cpu.h: Use force_sig_fault for EXCP_UDEF Warner Losh
2022-01-28 23:27 ` [PATCH v3 15/40] bsd-user/arm/target_arch_cpu.h: Implement data faults Warner Losh
2022-01-28 23:27 ` [PATCH v3 16/40] bsd-user/signal.c: implement abstract target / host signal translation Warner Losh
2022-01-28 23:27 ` Warner Losh [this message]
2022-01-28 23:27 ` [PATCH v3 18/40] bsd-user/signal.c: Add si_type argument to queue_signal Warner Losh
2022-01-28 23:27 ` [PATCH v3 19/40] bsd-user/host/arm/host-signal.h: Implement host_signal_* Warner Losh
2022-01-28 23:27 ` [PATCH v3 20/40] bsd-user/host/i386/host-signal.h: " Warner Losh
2022-01-28 23:27 ` [PATCH v3 21/40] bsd-user/host/x86_64/host-signal.h: " Warner Losh
2022-01-28 23:27 ` [PATCH v3 22/40] bsd-user: Add host signals to the build Warner Losh
2022-01-28 23:27 ` [PATCH v3 23/40] bsd-user: Add trace events for bsd-user Warner Losh
2022-01-28 23:27 ` [PATCH v3 24/40] bsd-user/signal.c: host_to_target_siginfo_noswap Warner Losh
2022-01-28 23:27 ` [PATCH v3 25/40] bsd-user/signal.c: Implement rewind_if_in_safe_syscall Warner Losh
2022-01-28 23:27 ` [PATCH v3 26/40] bsd-user/signal.c: Implement host_signal_handler Warner Losh
2022-01-28 23:27 ` [PATCH v3 27/40] bsd-user/strace.c: print_taken_signal Warner Losh
2022-01-28 23:27 ` [PATCH v3 28/40] bsd-user/signal.c: Implement dump_core_and_abort Warner Losh
2022-01-28 23:27 ` [PATCH v3 29/40] bsd-user/signal.c: Fill in queue_signal Warner Losh
2022-01-28 23:27 ` [PATCH v3 30/40] bsd-user/signal.c: sigset manipulation routines Warner Losh
2022-01-28 23:27 ` [PATCH v3 31/40] bsd-user/signal.c: setup_frame Warner Losh
2022-01-28 23:27 ` [PATCH v3 32/40] bsd-user/signal.c: handle_pending_signal Warner Losh
2022-01-28 23:27 ` [PATCH v3 33/40] bsd-user/signal.c: tswap_siginfo Warner Losh
2022-01-28 23:27 ` [PATCH v3 34/40] bsd-user/signal.c: process_pending_signals Warner Losh
2022-01-28 23:28 ` [PATCH v3 35/40] bsd-user/signal.c: implement do_sigreturn Warner Losh
2022-01-30 21:14 ` Richard Henderson
2022-01-28 23:28 ` [PATCH v3 36/40] bsd-user/signal.c: implement do_sigaction Warner Losh
2022-01-30 21:19 ` Richard Henderson
2022-01-30 21:34 ` Warner Losh
2022-01-28 23:28 ` [PATCH v3 37/40] bsd-user/signal.c: do_sigaltstack Warner Losh
2022-01-28 23:28 ` [PATCH v3 38/40] MAINTAINERS: Add tests/vm/*bsd to the list to get reviews on Warner Losh
2022-01-28 23:28 ` [PATCH v3 39/40] bsd-user: Rename arg name for target_cpu_reset to env Warner Losh
2022-01-28 23:28 ` [PATCH v3 40/40] bsd-user/freebsd/target_os_ucontext.h: Prefer env as arg name for CPUArchState args Warner Losh
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20220128232805.86191-18-imp@bsdimp.com \
--to=imp@bsdimp.com \
--cc=def@FreeBSD.org \
--cc=jrtc27@FreeBSD.org \
--cc=kevans@freebsd.org \
--cc=peter.maydell@linaro.org \
--cc=qemu-devel@nongnu.org \
--cc=richard.henderson@linaro.org \
--cc=sson@FreeBSD.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).