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 34/40] bsd-user/signal.c: process_pending_signals
Date: Fri, 28 Jan 2022 16:27:59 -0700 [thread overview]
Message-ID: <20220128232805.86191-35-imp@bsdimp.com> (raw)
In-Reply-To: <20220128232805.86191-1-imp@bsdimp.com>
Process the currently queued signals.
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: Richard Henderson <richard.henderson@linaro.org>
---
bsd-user/signal.c | 56 ++++++++++++++++++++++++++++++++++++++++++++++-
1 file changed, 55 insertions(+), 1 deletion(-)
diff --git a/bsd-user/signal.c b/bsd-user/signal.c
index 34e8c811ad6..4b398745f45 100644
--- a/bsd-user/signal.c
+++ b/bsd-user/signal.c
@@ -756,8 +756,62 @@ static void handle_pending_signal(CPUArchState *env, int sig,
}
}
-void process_pending_signals(CPUArchState *cpu_env)
+void process_pending_signals(CPUArchState *env)
{
+ CPUState *cpu = env_cpu(env);
+ int sig;
+ sigset_t *blocked_set, set;
+ struct emulated_sigtable *k;
+ TaskState *ts = cpu->opaque;
+
+ while (qatomic_read(&ts->signal_pending)) {
+ sigfillset(&set);
+ sigprocmask(SIG_SETMASK, &set, 0);
+
+ restart_scan:
+ sig = ts->sync_signal.pending;
+ if (sig) {
+ /*
+ * Synchronous signals are forced by the emulated CPU in some way.
+ * If they are set to ignore, restore the default handler (see
+ * sys/kern_sig.c trapsignal() and execsigs() for this behavior)
+ * though maybe this is done only when forcing exit for non SIGCHLD.
+ */
+ if (sigismember(&ts->signal_mask, target_to_host_signal(sig)) ||
+ sigact_table[sig - 1]._sa_handler == TARGET_SIG_IGN) {
+ sigdelset(&ts->signal_mask, target_to_host_signal(sig));
+ sigact_table[sig - 1]._sa_handler = TARGET_SIG_DFL;
+ }
+ handle_pending_signal(env, sig, &ts->sync_signal);
+ }
+
+ k = ts->sigtab;
+ for (sig = 1; sig <= TARGET_NSIG; sig++, k++) {
+ blocked_set = ts->in_sigsuspend ?
+ &ts->sigsuspend_mask : &ts->signal_mask;
+ if (k->pending &&
+ !sigismember(blocked_set, target_to_host_signal(sig))) {
+ handle_pending_signal(env, sig, k);
+ /*
+ * Restart scan from the beginning, as handle_pending_signal
+ * might have resulted in a new synchronous signal (eg SIGSEGV).
+ */
+ goto restart_scan;
+ }
+ }
+
+ /*
+ * Unblock signals and check one more time. Unblocking signals may cause
+ * us to take another host signal, which will set signal_pending again.
+ */
+ qatomic_set(&ts->signal_pending, 0);
+ ts->in_sigsuspend = false;
+ set = ts->signal_mask;
+ sigdelset(&set, SIGSEGV);
+ sigdelset(&set, SIGBUS);
+ sigprocmask(SIG_SETMASK, &set, 0);
+ }
+ ts->in_sigsuspend = false;
}
void cpu_loop_exit_sigsegv(CPUState *cpu, target_ulong addr,
--
2.33.1
next prev parent reply other threads:[~2022-01-28 23:54 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 ` [PATCH v3 17/40] bsd-user/signal.c: Implement signal_init() Warner Losh
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 ` Warner Losh [this message]
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-35-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).