[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PULL 14/14] linux-user: Remap guest SIGABRT
|
From: |
Richard Henderson |
|
Subject: |
[PULL 14/14] linux-user: Remap guest SIGABRT |
|
Date: |
Wed, 18 Oct 2023 16:31:34 -0700 |
Distinguish host SIGABRT from guest SIGABRT by mapping
the guest signal onto one of the host RT signals.
This prevents a cycle by which a host assertion failure
is caught and handled by host_signal_handler, queued for
the guest, and then we attempt to continue past the
host abort. What happens next depends on the host libc,
but is neither good nor helpful.
Acked-by: Helge Deller <deller@gmx.de>
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
---
linux-user/signal.c | 42 +++++++++++++++++++++++++++++++++++-------
1 file changed, 35 insertions(+), 7 deletions(-)
diff --git a/linux-user/signal.c b/linux-user/signal.c
index b67077f320..3b8efec89f 100644
--- a/linux-user/signal.c
+++ b/linux-user/signal.c
@@ -522,8 +522,21 @@ static void signal_table_init(void)
* multiplexed over a single host signal.
* Attempts for configure "missing" signals via sigaction will be
* silently ignored.
+ *
+ * Remap the target SIGABRT, so that we can distinguish host abort
+ * from guest abort. When the guest registers a signal handler or
+ * calls raise(SIGABRT), the host will raise SIG_RTn. If the guest
+ * arrives at dump_core_and_abort(), we will map back to host SIGABRT
+ * so that the parent (native or emulated) sees the correct signal.
+ * Finally, also map host to guest SIGABRT so that the emulated
+ * parent sees the correct mapping from wait status.
*/
- for (hsig = SIGRTMIN; hsig <= SIGRTMAX; hsig++) {
+
+ hsig = SIGRTMIN;
+ host_to_target_signal_table[SIGABRT] = 0;
+ host_to_target_signal_table[hsig++] = TARGET_SIGABRT;
+
+ for (; hsig <= SIGRTMAX; hsig++) {
tsig = hsig - SIGRTMIN + TARGET_SIGRTMIN;
if (tsig <= TARGET_NSIG) {
host_to_target_signal_table[hsig] = tsig;
@@ -539,6 +552,8 @@ static void signal_table_init(void)
}
}
+ host_to_target_signal_table[SIGABRT] = TARGET_SIGABRT;
+
/* Map everything else out-of-bounds. */
for (hsig = 1; hsig < _NSIG; hsig++) {
if (host_to_target_signal_table[hsig] == 0) {
@@ -582,13 +597,21 @@ void signal_init(void)
int hsig = target_to_host_signal(tsig);
abi_ptr thand = TARGET_SIG_IGN;
- if (hsig < _NSIG) {
- struct sigaction *iact = core_dump_signal(tsig) ? &act : NULL;
+ if (hsig >= _NSIG) {
+ continue;
+ }
+ /* As we force remap SIGABRT, cannot probe and install in one step. */
+ if (tsig == TARGET_SIGABRT) {
+ sigaction(SIGABRT, NULL, &oact);
+ sigaction(hsig, &act, NULL);
+ } else {
+ struct sigaction *iact = core_dump_signal(tsig) ? &act : NULL;
sigaction(hsig, iact, &oact);
- if (oact.sa_sigaction != (void *)SIG_IGN) {
- thand = TARGET_SIG_DFL;
- }
+ }
+
+ if (oact.sa_sigaction != (void *)SIG_IGN) {
+ thand = TARGET_SIG_DFL;
}
sigact_table[tsig - 1]._sa_handler = thand;
}
@@ -711,7 +734,12 @@ void dump_core_and_abort(CPUArchState *env, int target_sig)
TaskState *ts = (TaskState *)cpu->opaque;
int host_sig, core_dumped = 0;
- host_sig = target_to_host_signal(target_sig);
+ /* On exit, undo the remapping of SIGABRT. */
+ if (target_sig == TARGET_SIGABRT) {
+ host_sig = SIGABRT;
+ } else {
+ host_sig = target_to_host_signal(target_sig);
+ }
trace_user_dump_core_and_abort(env, target_sig, host_sig);
gdb_signalled(env, target_sig);
--
2.34.1
- [PULL 03/14] linux-user/sh4: Fix crashes on signal delivery, (continued)
- [PULL 03/14] linux-user/sh4: Fix crashes on signal delivery, Richard Henderson, 2023/10/18
- [PULL 04/14] linux-user/elfload: Enable LSX/LASX in HWCAP for LoongArch, Richard Henderson, 2023/10/18
- [PULL 07/14] linux-user: Exit not abort in die_with_backtrace, Richard Henderson, 2023/10/18
- [PULL 08/14] linux-user: Detect and report host crashes, Richard Henderson, 2023/10/18
- [PULL 09/14] linux-user: Only register handlers for core_dump_signal by default, Richard Henderson, 2023/10/18
- [PULL 05/14] linux-user: Propagate failure in mmap_reserve_or_unmap back to target_munmap, Richard Henderson, 2023/10/18
- [PULL 06/14] linux-user: Split out die_with_signal, Richard Henderson, 2023/10/18
- [PULL 10/14] linux-user: Map unsupported signals to an out-of-bounds value, Richard Henderson, 2023/10/18
- [PULL 11/14] linux-user: Simplify signal_init, Richard Henderson, 2023/10/18
- [PULL 13/14] linux-user: Detect and report host SIGILL, SIGFPE, SIGTRAP, Richard Henderson, 2023/10/18
- [PULL 14/14] linux-user: Remap guest SIGABRT,
Richard Henderson <=
- [PULL 12/14] linux-user: Split out host_sig{segv,bus}_handler, Richard Henderson, 2023/10/18
- Re: [PULL 00/14] linux-user patch queue, Stefan Hajnoczi, 2023/10/20