[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH v3 28/40] bsd-user/signal.c: Implement dump_core_and_abort
From: |
Warner Losh |
Subject: |
[PATCH v3 28/40] bsd-user/signal.c: Implement dump_core_and_abort |
Date: |
Fri, 28 Jan 2022 16:27:53 -0700 |
Force delivering a signal and generating a core file. It's a global
function 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: Richard Henderson <richard.henderson@linaro.org>
---
bsd-user/signal.c | 76 +++++++++++++++++++++++++++++++++++++++++
bsd-user/syscall_defs.h | 1 +
2 files changed, 77 insertions(+)
diff --git a/bsd-user/signal.c b/bsd-user/signal.c
index 24cf4b1120b..ccda7adbeef 100644
--- a/bsd-user/signal.c
+++ b/bsd-user/signal.c
@@ -172,6 +172,82 @@ static inline void
host_to_target_siginfo_noswap(target_siginfo_t *tinfo,
tinfo->si_code = deposit32(si_code, 24, 8, si_type);
}
+/* Returns 1 if given signal should dump core if not handled. */
+static int core_dump_signal(int sig)
+{
+ switch (sig) {
+ case TARGET_SIGABRT:
+ case TARGET_SIGFPE:
+ case TARGET_SIGILL:
+ case TARGET_SIGQUIT:
+ case TARGET_SIGSEGV:
+ case TARGET_SIGTRAP:
+ case TARGET_SIGBUS:
+ return 1;
+ default:
+ return 0;
+ }
+}
+
+/* Abort execution with signal. */
+static void QEMU_NORETURN dump_core_and_abort(int target_sig)
+{
+ CPUArchState *env = thread_cpu->env_ptr;
+ CPUState *cpu = env_cpu(env);
+ TaskState *ts = cpu->opaque;
+ int core_dumped = 0;
+ int host_sig;
+ struct sigaction act;
+
+ host_sig = target_to_host_signal(target_sig);
+ gdb_signalled(env, target_sig);
+
+ /* Dump core if supported by target binary format */
+ if (core_dump_signal(target_sig) && (ts->bprm->core_dump != NULL)) {
+ stop_all_tasks();
+ core_dumped =
+ ((*ts->bprm->core_dump)(target_sig, env) == 0);
+ }
+ if (core_dumped) {
+ struct rlimit nodump;
+
+ /*
+ * We already dumped the core of target process, we don't want
+ * a coredump of qemu itself.
+ */
+ getrlimit(RLIMIT_CORE, &nodump);
+ nodump.rlim_cur = 0;
+ setrlimit(RLIMIT_CORE, &nodump);
+ (void) fprintf(stderr, "qemu: uncaught target signal %d (%s) "
+ "- %s\n", target_sig, strsignal(host_sig), "core dumped");
+ }
+
+ /*
+ * The proper exit code for dying from an uncaught signal is
+ * -<signal>. The kernel doesn't allow exit() or _exit() to pass
+ * a negative value. To get the proper exit code we need to
+ * actually die from an uncaught signal. Here the default signal
+ * handler is installed, we send ourself a signal and we wait for
+ * it to arrive.
+ */
+ memset(&act, 0, sizeof(act));
+ sigfillset(&act.sa_mask);
+ act.sa_handler = SIG_DFL;
+ sigaction(host_sig, &act, NULL);
+
+ kill(getpid(), host_sig);
+
+ /*
+ * Make sure the signal isn't masked (just reuse the mask inside
+ * of act).
+ */
+ sigdelset(&act.sa_mask, host_sig);
+ sigsuspend(&act.sa_mask);
+
+ /* unreachable */
+ abort();
+}
+
/*
* Queue a signal so that it will be send to the virtual CPU as soon as
* possible.
diff --git a/bsd-user/syscall_defs.h b/bsd-user/syscall_defs.h
index 04a1a886d7b..62b472b990b 100644
--- a/bsd-user/syscall_defs.h
+++ b/bsd-user/syscall_defs.h
@@ -21,6 +21,7 @@
#define _SYSCALL_DEFS_H_
#include <sys/syscall.h>
+#include <sys/resource.h>
#include "errno_defs.h"
--
2.33.1
- [PATCH v3 20/40] bsd-user/host/i386/host-signal.h: Implement host_signal_*, (continued)
- [PATCH v3 20/40] bsd-user/host/i386/host-signal.h: Implement host_signal_*, Warner Losh, 2022/01/28
- [PATCH v3 18/40] bsd-user/signal.c: Add si_type argument to queue_signal, Warner Losh, 2022/01/28
- [PATCH v3 35/40] bsd-user/signal.c: implement do_sigreturn, Warner Losh, 2022/01/28
- [PATCH v3 36/40] bsd-user/signal.c: implement do_sigaction, Warner Losh, 2022/01/28
- [PATCH v3 26/40] bsd-user/signal.c: Implement host_signal_handler, Warner Losh, 2022/01/28
- [PATCH v3 24/40] bsd-user/signal.c: host_to_target_siginfo_noswap, Warner Losh, 2022/01/28
- [PATCH v3 25/40] bsd-user/signal.c: Implement rewind_if_in_safe_syscall, Warner Losh, 2022/01/28
- [PATCH v3 17/40] bsd-user/signal.c: Implement signal_init(), Warner Losh, 2022/01/28
- [PATCH v3 22/40] bsd-user: Add host signals to the build, Warner Losh, 2022/01/28
- [PATCH v3 23/40] bsd-user: Add trace events for bsd-user, Warner Losh, 2022/01/28
- [PATCH v3 28/40] bsd-user/signal.c: Implement dump_core_and_abort,
Warner Losh <=
- [PATCH v3 32/40] bsd-user/signal.c: handle_pending_signal, Warner Losh, 2022/01/28
- [PATCH v3 40/40] bsd-user/freebsd/target_os_ucontext.h: Prefer env as arg name for CPUArchState args, Warner Losh, 2022/01/28
- [PATCH v3 39/40] bsd-user: Rename arg name for target_cpu_reset to env, Warner Losh, 2022/01/28
- [PATCH v3 30/40] bsd-user/signal.c: sigset manipulation routines., Warner Losh, 2022/01/28
- [PATCH v3 37/40] bsd-user/signal.c: do_sigaltstack, Warner Losh, 2022/01/28
- [PATCH v3 19/40] bsd-user/host/arm/host-signal.h: Implement host_signal_*, Warner Losh, 2022/01/28
- [PATCH v3 29/40] bsd-user/signal.c: Fill in queue_signal, Warner Losh, 2022/01/28
- [PATCH v3 31/40] bsd-user/signal.c: setup_frame, Warner Losh, 2022/01/28
- [PATCH v3 27/40] bsd-user/strace.c: print_taken_signal, Warner Losh, 2022/01/28
- [PATCH v3 33/40] bsd-user/signal.c: tswap_siginfo, Warner Losh, 2022/01/28