From patchwork Tue Aug 22 20:34:15 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Richard Henderson X-Patchwork-Id: 715786 Delivered-To: patch@linaro.org Received: by 2002:adf:f747:0:b0:317:ecd7:513f with SMTP id z7csp468171wrp; Tue, 22 Aug 2023 13:35:10 -0700 (PDT) X-Google-Smtp-Source: AGHT+IEvpC+9urb4FGBAS8iX9ZzwLtqbuyiuaNeRr7GnPuJCIzxEEfyIBZLElaulE/laq8r/pxUQ X-Received: by 2002:a67:fdda:0:b0:44d:5a92:ec43 with SMTP id l26-20020a67fdda000000b0044d5a92ec43mr3599600vsq.24.1692736510643; Tue, 22 Aug 2023 13:35:10 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1692736510; cv=none; d=google.com; s=arc-20160816; b=kNvBsPscXci0YcHuC6GLSH7eCQBxFDAjF+ykNqr+WhI9Ib85BqcqVL4wwUdujrmMUy IFMJJO13RtNniJXaZ/YcyVmL3oIlQZWZV1mMqFnGdmeUFCf2wEnsmgvDEz42P6/kIfMz Q8rQiJGJCeph6XKKAHcI9M4dsfYTP6wTgjOoaysxBhYkNDIsh9yk2iGiu0JNcgfEFdrB lfenhRQk2ZT3IaeGYas2uXkCmLVFl77o3kS5DjpKGM3e8hWnH9oPC7Y0xzyc/Xfs9a/n dHEVjT7K0UqLA2nSnqQaJ0qofOtYsS4MOIDlPiHN2cUDiZrJLH9j2SWXPZBgZeEmUTJR gUiw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:list-subscribe:list-help:list-post:list-archive :list-unsubscribe:list-id:precedence:content-transfer-encoding :mime-version:references:in-reply-to:message-id:date:subject:cc:to :from:dkim-signature; bh=WsaRliMGQZhQnMvBkKr3ovb5Yrpz1aO1dp2IimUflrE=; fh=uta8CuNdWwEUIsmWLQQIuZWY0GOyjYTd4DbN32nR8cE=; b=NZgQkvwho4rpoIr829SENI7BUIB90/8b3mWWAEw+/ANbrnG19LXgd7l1LW4Z6mUqFD B11b6+shvBm3LCKTYURnfM38bB1W++xpXgyZFc+NQeKvVSCc7cbN2ro5fMjSC9kBbkzK Xn+ElsoKfG/C7yqJY6Kn/VX5Uu9j5pOIPkSHic8gYIioSVnd8gcl7ofjF8mhasQBDRAI 57FIa2Mv+Zp9wYzl0y7FPPthWw5Zq3sCHlE/B1aLSayXv2syZVsFWNorch/fDL4c8Ctu D1sIVIBCCeljxSjyoPrUTVL3WqNFA6KFsfO5IgcCS8oHoSTcMoAGv0MqREYjgHckoXng HvFQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b=ndptI9Lt; spf=pass (google.com: domain of qemu-devel-bounces+patch=linaro.org@nongnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom="qemu-devel-bounces+patch=linaro.org@nongnu.org"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Return-Path: Received: from lists.gnu.org (lists.gnu.org. [209.51.188.17]) by mx.google.com with ESMTPS id z19-20020a05622a029300b00403a7a5820fsi1897330qtw.142.2023.08.22.13.35.10 for (version=TLS1_2 cipher=ECDHE-ECDSA-CHACHA20-POLY1305 bits=256/256); Tue, 22 Aug 2023 13:35:10 -0700 (PDT) Received-SPF: pass (google.com: domain of qemu-devel-bounces+patch=linaro.org@nongnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; Authentication-Results: mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b=ndptI9Lt; spf=pass (google.com: domain of qemu-devel-bounces+patch=linaro.org@nongnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom="qemu-devel-bounces+patch=linaro.org@nongnu.org"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1qYY53-0002eG-9X; Tue, 22 Aug 2023 16:34:25 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1qYY50-0002cm-VB for qemu-devel@nongnu.org; Tue, 22 Aug 2023 16:34:22 -0400 Received: from mail-pf1-x435.google.com ([2607:f8b0:4864:20::435]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1qYY4y-0005Ed-GV for qemu-devel@nongnu.org; Tue, 22 Aug 2023 16:34:22 -0400 Received: by mail-pf1-x435.google.com with SMTP id d2e1a72fcca58-68a6cd7c6a6so1003450b3a.1 for ; Tue, 22 Aug 2023 13:34:20 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1692736459; x=1693341259; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=WsaRliMGQZhQnMvBkKr3ovb5Yrpz1aO1dp2IimUflrE=; b=ndptI9LtTqvLHw/k9Ef+04SNc0KF1e4SqbSN4cAQcXHbknMIfPAeQDR/R/awh5ZoHi 9Yb8GN94vkZqm0BeJiKm4bjwUk1xJxueKVVZiFNbqGq2WWNikI0iSG+SAZYyOcTCYvI4 QKJmM4e7ByfEBkP9dopD0fdPbgOufHe7e3668mA/txIt2EjkixcWkp2b+oIQfSoSgHMw rsHKY4iOyGLj0f8yzTfNnQDk6aqMbSuSThVC1DSDryP7Y2iTDDnakhVN3Q2gXPp1bxqJ ePACBlOEmaPblnd5nPlfoxjipP5OiRM93NTgV5ae/wNuh6w0s1Cy/MWuMGPS40ygkfC+ df3A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1692736459; x=1693341259; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=WsaRliMGQZhQnMvBkKr3ovb5Yrpz1aO1dp2IimUflrE=; b=XJBqdYkQtJ0mSfzVN0Jh+sce0VQd06CvM8NiXiyCdtVYciJ8AbTHln7p8BC9pQANgE ZGDXwwX5UOtOt2XPjFnJf5RAqEXij06cHulGdXFAuouYdzt3USnJHb8xGPDjDctJQHo9 piOUsPJCjXfCEorgIuLp8635FpTSskfir76gI44vDKImFkrCThXjcYy9wHWNfZzZ0ZNM dNrS14+iG+Ve0E/zY/Isc6uzD9z5COFUQ+xO7SfAVBBHy8NmS81VEpYlxIOrFKnBI+uN aYqN4G8DuQ6uEDP9YbJIYkdUGafgyFrvVbDUi4No6llbGWNcQdDKD0uzFHO9MQOZ6mlb +IbA== X-Gm-Message-State: AOJu0YwEPdPYgEKN+FNBMBXtYzvfzxnOwJlXcAPKBANpouryFrFvFSjD P/tAhGDkfqW2mzoxBUtnOYSPrzkrA6N/2wxAD60= X-Received: by 2002:a05:6a20:8e12:b0:148:c3ea:fb6c with SMTP id y18-20020a056a208e1200b00148c3eafb6cmr7827464pzj.36.1692736458951; Tue, 22 Aug 2023 13:34:18 -0700 (PDT) Received: from stoup.. ([2602:47:d483:7301:4e3c:f4a4:b92a:b5ab]) by smtp.gmail.com with ESMTPSA id i25-20020a633c59000000b00564aee22f33sm8311823pgn.14.2023.08.22.13.34.18 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 22 Aug 2023 13:34:18 -0700 (PDT) From: Richard Henderson To: qemu-devel@nongnu.org Cc: deller@gmx.de Subject: [PATCH v3 3/3] linux-user: Detect and report host crashes Date: Tue, 22 Aug 2023 13:34:15 -0700 Message-Id: <20230822203415.1184491-4-richard.henderson@linaro.org> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20230822203415.1184491-1-richard.henderson@linaro.org> References: <20230822203415.1184491-1-richard.henderson@linaro.org> MIME-Version: 1.0 Received-SPF: pass client-ip=2607:f8b0:4864:20::435; envelope-from=richard.henderson@linaro.org; helo=mail-pf1-x435.google.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+patch=linaro.org@nongnu.org Sender: qemu-devel-bounces+patch=linaro.org@nongnu.org From: Helge Deller 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 {si_code=1, si_addr=(nil)} QEMU v8.1.50 target x86_64 running /usr/bin/cat QEMU backtrace: ./qemu-x86_64(+0xf83d9) [0x55c48587a3d9] ./qemu-x86_64(+0xf8663) [0x55c48587a663] /lib/x86_64-linux-gnu/libc.so.6(+0x42520) [0x7f39eee42520] ./qemu-x86_64(+0x1132fa) [0x55c4858952fa] ./qemu-x86_64(+0x11396f) [0x55c48589596f] ./qemu-x86_64(+0x1140ef) [0x55c4858960ef] ./qemu-x86_64(+0x115796) [0x55c485897796] ./qemu-x86_64(+0x11f9dd) [0x55c4858a19dd] ./qemu-x86_64(+0x3f8da) [0x55c4857c18da] ./qemu-x86_64(+0xf3bfb) [0x55c485875bfb] /lib/x86_64-linux-gnu/libc.so.6(+0x29d90) [0x7f39eee29d90] /lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0x80) [0x7f39eee29e40] ./qemu-x86_64(+0x39075) [0x55c4857bb075] Segmentation fault Signed-off-by: Helge Deller Message-Id: <20230812164314.352131-1-deller@gmx.de> [rth: Use in_code_gen_buffer and die_with_signal] Signed-off-by: Richard Henderson --- linux-user/signal.c | 54 ++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 48 insertions(+), 6 deletions(-) diff --git a/linux-user/signal.c b/linux-user/signal.c index 57fbf2f58b..1ffd1354c3 100644 --- a/linux-user/signal.c +++ b/linux-user/signal.c @@ -23,6 +23,7 @@ #include #include +#include #include "qemu.h" #include "user-internals.h" @@ -32,6 +33,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]; @@ -785,6 +787,34 @@ static inline void rewind_if_in_safe_syscall(void *puc) } } +static G_NORETURN +void die_with_backtrace(siginfo_t *info) +{ + void *array[20]; + int size; + + fprintf(stderr, + "QEMU internal SIG%s {si_code=%d, si_addr=%p}\n" + "QEMU v" QEMU_VERSION " target " UNAME_MACHINE " running %s\n", + sigabbrev_np(info->si_signo), info->si_code, info->si_addr, + exec_path); + + size = backtrace(array, ARRAY_SIZE(array)); + if (size) { + char **strings = backtrace_symbols(array, size); + if (strings) { + fprintf(stderr, "QEMU backtrace:\n"); + for (int i = 0; i < size; ++i) { + fprintf(stderr, " %s\n", strings[i]); + } + free(strings); + } + } + + preexit_cleanup(thread_cpu->env_ptr, TARGET_SIGKILL); + die_with_signal(info->si_signo); +} + static void host_signal_handler(int host_sig, siginfo_t *info, void *puc) { CPUArchState *env = thread_cpu->env_ptr; @@ -820,16 +850,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_with_backtrace(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.