From: Richard Henderson <richard.henderson@linaro.org>
To: qemu-devel@nongnu.org
Cc: Helge Deller <deller@gmx.de>
Subject: [PULL 08/14] linux-user: Detect and report host crashes
Date: Wed, 18 Oct 2023 16:31:28 -0700 [thread overview]
Message-ID: <20231018233134.1594292-9-richard.henderson@linaro.org> (raw)
In-Reply-To: <20231018233134.1594292-1-richard.henderson@linaro.org>
From: Helge Deller <deller@gmx.de>
If there is an internal program error in the qemu source code which
raises SIGSEGV or SIGBUS, we currently assume the signal belongs to
the guest. With an artificial error introduced, we will now print
QEMU internal SIGSEGV {code=MAPERR, addr=(nil)}
Signed-off-by: Helge Deller <deller@gmx.de>
Message-Id: <20230812164314.352131-1-deller@gmx.de>
[rth: Use in_code_gen_buffer and die_with_signal; drop backtrace]
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
---
linux-user/signal.c | 69 +++++++++++++++++++++++++++++++++++++++++----
1 file changed, 63 insertions(+), 6 deletions(-)
diff --git a/linux-user/signal.c b/linux-user/signal.c
index 84a56b76cc..9fadc51347 100644
--- a/linux-user/signal.c
+++ b/linux-user/signal.c
@@ -32,6 +32,7 @@
#include "signal-common.h"
#include "host-signal.h"
#include "user/safe-syscall.h"
+#include "tcg/tcg.h"
static struct target_sigaction sigact_table[TARGET_NSIG];
@@ -779,6 +780,50 @@ static inline void rewind_if_in_safe_syscall(void *puc)
}
}
+static G_NORETURN
+void die_from_signal(siginfo_t *info)
+{
+ char sigbuf[4], codebuf[12];
+ const char *sig, *code = NULL;
+
+ switch (info->si_signo) {
+ case SIGSEGV:
+ sig = "SEGV";
+ switch (info->si_code) {
+ case SEGV_MAPERR:
+ code = "MAPERR";
+ break;
+ case SEGV_ACCERR:
+ code = "ACCERR";
+ break;
+ }
+ break;
+ case SIGBUS:
+ sig = "BUS";
+ switch (info->si_code) {
+ case BUS_ADRALN:
+ code = "ADRALN";
+ break;
+ case BUS_ADRERR:
+ code = "ADRERR";
+ break;
+ }
+ break;
+ default:
+ snprintf(sigbuf, sizeof(sigbuf), "%d", info->si_signo);
+ sig = sigbuf;
+ break;
+ }
+ if (code == NULL) {
+ snprintf(codebuf, sizeof(sigbuf), "%d", info->si_code);
+ code = codebuf;
+ }
+
+ error_report("QEMU internal SIG%s {code=%s, addr=%p}",
+ sig, code, info->si_addr);
+ die_with_signal(info->si_signo);
+}
+
static void host_signal_handler(int host_sig, siginfo_t *info, void *puc)
{
CPUState *cpu = thread_cpu;
@@ -814,16 +859,28 @@ static void host_signal_handler(int host_sig, siginfo_t *info, void *puc)
is_write = host_signal_write(info, uc);
access_type = adjust_signal_pc(&pc, is_write);
+ /* If this was a write to a TB protected page, restart. */
+ if (is_write
+ && host_sig == SIGSEGV
+ && info->si_code == SEGV_ACCERR
+ && h2g_valid(host_addr)
+ && handle_sigsegv_accerr_write(cpu, sigmask, pc, guest_addr)) {
+ return;
+ }
+
+ /*
+ * If the access was not on behalf of the guest, within the executable
+ * mapping of the generated code buffer, then it is a host bug.
+ */
+ if (access_type != MMU_INST_FETCH
+ && !in_code_gen_buffer((void *)(pc - tcg_splitwx_diff))) {
+ die_from_signal(info);
+ }
+
if (host_sig == SIGSEGV) {
bool maperr = true;
if (info->si_code == SEGV_ACCERR && h2g_valid(host_addr)) {
- /* If this was a write to a TB protected page, restart. */
- if (is_write &&
- handle_sigsegv_accerr_write(cpu, sigmask, pc, guest_addr)) {
- return;
- }
-
/*
* With reserved_va, the whole address space is PROT_NONE,
* which means that we may get ACCERR when we want MAPERR.
--
2.34.1
next prev parent reply other threads:[~2023-10-18 23:33 UTC|newest]
Thread overview: 16+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-10-18 23:31 [PULL 00/14] linux-user patch queue Richard Henderson
2023-10-18 23:31 ` [PULL 01/14] linux-user: Fixes for zero_bss Richard Henderson
2023-10-18 23:31 ` [PULL 02/14] linux-user/mips: fix abort on integer overflow Richard Henderson
2023-10-18 23:31 ` [PULL 03/14] linux-user/sh4: Fix crashes on signal delivery Richard Henderson
2023-10-18 23:31 ` [PULL 04/14] linux-user/elfload: Enable LSX/LASX in HWCAP for LoongArch Richard Henderson
2023-10-18 23:31 ` [PULL 05/14] linux-user: Propagate failure in mmap_reserve_or_unmap back to target_munmap Richard Henderson
2023-10-18 23:31 ` [PULL 06/14] linux-user: Split out die_with_signal Richard Henderson
2023-10-18 23:31 ` [PULL 07/14] linux-user: Exit not abort in die_with_backtrace Richard Henderson
2023-10-18 23:31 ` Richard Henderson [this message]
2023-10-18 23:31 ` [PULL 09/14] linux-user: Only register handlers for core_dump_signal by default Richard Henderson
2023-10-18 23:31 ` [PULL 10/14] linux-user: Map unsupported signals to an out-of-bounds value Richard Henderson
2023-10-18 23:31 ` [PULL 11/14] linux-user: Simplify signal_init Richard Henderson
2023-10-18 23:31 ` [PULL 12/14] linux-user: Split out host_sig{segv,bus}_handler Richard Henderson
2023-10-18 23:31 ` [PULL 13/14] linux-user: Detect and report host SIGILL, SIGFPE, SIGTRAP Richard Henderson
2023-10-18 23:31 ` [PULL 14/14] linux-user: Remap guest SIGABRT Richard Henderson
2023-10-19 18:51 ` [PULL 00/14] linux-user patch queue Stefan Hajnoczi
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=20231018233134.1594292-9-richard.henderson@linaro.org \
--to=richard.henderson@linaro.org \
--cc=deller@gmx.de \
--cc=qemu-devel@nongnu.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).