From nobody Sun Jul 26 12:31:36 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=nongnu.org ARC-Seal: i=1; a=rsa-sha256; t=1781864377; cv=none; d=zohomail.com; s=zohoarc; b=eWQxdS7kZdsERH9rETqm6ESsSMY+J9EpqeRtVYOmFZnWA9uodLNt6ny7GoTjupNQeCXdj9/WtQpTx3bscVbYDOLrG7UbA0b9UdXK++zoto3GxD65NedkYZmUJ1/hv1y4G/lRRfIt42q2qoYNC87DqIAvzBIHVjXfY2kfiGoDzzM= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1781864377; h=Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:Reply-To:Reply-To:References:Sender:Subject:Subject:To:To:Message-Id; bh=z0+VW17wfJS3shuNYwL5tr2zZ2QgOCrT0q6hQjfLvuU=; b=RcXl8VCW89R296VXtXDr2FZyIVbpZFSdzQ5cn7OhOOfsF4kDuUWNuL9S+nm97e+2svMrTHJ5lc7oVBiBr+iACnPdf0HM8+cSGDIWV896uC6o254eitPqErFRmcJ5AWrDFiMp6ADgI2cxST83NMv1BLRN0vMELVypHQdw+oD8lOQ= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1781864377635791.0049322051948; Fri, 19 Jun 2026 03:19:37 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1waWJ9-0006Ip-1d; Fri, 19 Jun 2026 06:18:43 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1waWJ6-0006Hu-Qe for qemu-devel@nongnu.org; Fri, 19 Jun 2026 06:18:40 -0400 Received: from relay.virtuozzo.com ([130.117.225.111]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1waWJ5-0000ex-8N for qemu-devel@nongnu.org; Fri, 19 Jun 2026 06:18:40 -0400 Received: from ch-demo-asa.virtuozzo.com ([130.117.225.8] helo=athena.sw.ru) by relay.virtuozzo.com with esmtp (Exim 4.96) (envelope-from ) id 1waWIS-006QLJ-2q; Fri, 19 Jun 2026 12:18:32 +0200 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=virtuozzo.com; s=relay; h=MIME-Version:Message-ID:Date:Subject:From: Content-Type; bh=z0+VW17wfJS3shuNYwL5tr2zZ2QgOCrT0q6hQjfLvuU=; b=q1dMBvR/kBfF uVeBVTh/ETQHx73+BEoAXaYAp5zZ25w/xLcfMMFncdXoy122gBWuSQoYdVG4ruW43eURuIEwdynZy X6/q4BO99grG7w3N3uQo44vKsf0jqu4MKgPikkK8WzoOuiPCP8RAYPYsEfBz7qrsTfWjYsGLpW1xT jRH45lzNXUS67lcH9BCfCcKg0mWMTBJJ25C3eTatZqqXabzTEyCd7i+0V2fKFrSEwoBuufCyRlGnp PI8OYK+90ssAy9pIdGML1kn5y7GtcYk58pi5JXOtYjQlyd59YWNkSx2JVrxMTNJjkV9pv4sFeQB+3 09MfOgmsNR4FHWgEjh7MfQ==; To: qemu-devel@nongnu.org Cc: marcandre.lureau@redhat.com, anisinha@redhat.com, berrange@redhat.com, peterx@redhat.com, farosas@suse.de, "Denis V. Lunev" Subject: [PATCH v5 1/7] migration: add migration_guest_ram_loading() helper Date: Fri, 19 Jun 2026 12:18:28 +0200 Message-ID: <20260619101834.228432-2-den@openvz.org> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260619101834.228432-1-den@openvz.org> References: <20260619101834.228432-1-den@openvz.org> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists1p.gnu.org; Received-SPF: softfail client-ip=130.117.225.111; envelope-from=den@openvz.org; helo=relay.virtuozzo.com X-Spam_score_int: -34 X-Spam_score: -3.5 X-Spam_bar: --- X-Spam_report: (-3.5 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, RCVD_IN_DNSWL_MED=-2.3, SPF_HELO_NONE=0.001, SPF_SOFTFAIL=0.665 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: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-to: "Denis V. Lunev" From: "Denis V. Lunev" via qemu development Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZM-MESSAGEID: 1781864380003158500 Content-Type: text/plain; charset="utf-8" Operations that read guest RAM (dump-guest-memory, memsave, pmemsave) must refuse to run while the destination of a migration is still receiving that RAM: during precopy it is incomplete, and during postcopy a read faults the page in from the source. Provide a single predicate they can share instead of open-coding the runstate and postcopy checks. Signed-off-by: Denis V. Lunev --- include/migration/misc.h | 3 +++ migration/migration.c | 6 ++++++ 2 files changed, 9 insertions(+) diff --git a/include/migration/misc.h b/include/migration/misc.h index 3159a5e53c..d3d6e1f50d 100644 --- a/include/migration/misc.h +++ b/include/migration/misc.h @@ -117,6 +117,9 @@ void migration_file_set_error(int ret, Error *err); /* True if incoming migration entered POSTCOPY_INCOMING_DISCARD */ bool migration_in_incoming_postcopy(void); =20 +/* True while the destination still receives guest RAM (precopy or postcop= y) */ +bool migration_guest_ram_loading(void); + /* True if incoming migration entered POSTCOPY_INCOMING_ADVISE */ bool migration_incoming_postcopy_advised(void); =20 diff --git a/migration/migration.c b/migration/migration.c index 074d3f2c69..095c55fdae 100644 --- a/migration/migration.c +++ b/migration/migration.c @@ -1643,6 +1643,12 @@ bool migration_in_incoming_postcopy(void) return ps >=3D POSTCOPY_INCOMING_DISCARD && ps < POSTCOPY_INCOMING_END; } =20 +bool migration_guest_ram_loading(void) +{ + return runstate_check(RUN_STATE_INMIGRATE) || + migration_in_incoming_postcopy(); +} + bool migration_incoming_postcopy_advised(void) { PostcopyState ps =3D postcopy_state_get(); --=20 2.53.0 From nobody Sun Jul 26 12:31:36 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=nongnu.org ARC-Seal: i=1; a=rsa-sha256; t=1781864377; cv=none; d=zohomail.com; s=zohoarc; b=b+YNMWVhYa0MUuJaRE3jWNLGIjHkQJWvAXkfXwvELay3ztAIUmeX0XLvuP3WT3LFCVayOEvKGgvFRD+wnEY5mPJeMAGyRLOKx1dKQIiDaI9C6vAVu93qio7eWF3h9HBUSzGQliNmUugr/jWWH2BAQp2nqCtfYSXy/GUw2SS35gE= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1781864377; h=Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:Reply-To:Reply-To:References:Sender:Subject:Subject:To:To:Message-Id; bh=vmcI1yCY/hkP/Riq4PLX8+i18bQHuqsqu1lFUgZj4/w=; b=Ag8BDnxNwjs6ek3n6SZDm66LLu3EwgX+cFfBmfWrJfT713a+8N8qUW8vzoKHuCWgY8a4+EVDKQNJImHbijsGsf0dw6YApj1fXJD8zkzy3Pd90QvImuw6JDdcm/CsPY2YXIL0geN5cQZcG1FWflpXZ8V9G2dvvJPMPjW22VQyat0= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1781864377716747.7314967435118; Fri, 19 Jun 2026 03:19:37 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1waWJ8-0006Ik-Pt; Fri, 19 Jun 2026 06:18:42 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1waWJ6-0006Ht-P4 for qemu-devel@nongnu.org; Fri, 19 Jun 2026 06:18:40 -0400 Received: from relay.virtuozzo.com ([130.117.225.111]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1waWJ5-0000ev-8J for qemu-devel@nongnu.org; Fri, 19 Jun 2026 06:18:40 -0400 Received: from ch-demo-asa.virtuozzo.com ([130.117.225.8] helo=athena.sw.ru) by relay.virtuozzo.com with esmtp (Exim 4.96) (envelope-from ) id 1waWIT-006QLJ-1M; Fri, 19 Jun 2026 12:18:33 +0200 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=virtuozzo.com; s=relay; h=MIME-Version:Message-ID:Date:Subject:From: Content-Type; bh=vmcI1yCY/hkP/Riq4PLX8+i18bQHuqsqu1lFUgZj4/w=; b=rmUyYue+pxAY HMOHzMjcBStFALywTqNQMaSFIoK38VDeWOlNWqFbAvO1eePv6Dn90f+HqBDUmHssaBNQl2s1RTbPP xA7xzp0AIhJorEyg8XdNySDaeIl82Y3wvhgY5ysXuTttfGuXLlNglBfCDJ+sFakcFa7G6W68elLMJ rx2IpI7i7DgCOG0ZRZ2p6URdPhX0URVLZ6P3a3g017qcFiZlAzDoo0XZwtvPsg9sFsggL0spvZUBV H0ljuVrzgQ0/U4lhfBtlZJwECD9OtgBI2u4KSBt1al1ZGkEuS7EhaQm04GLNB71rOIz61G1ppncBT pf+jctjXcIiyQQI8ClXPVg==; To: qemu-devel@nongnu.org Cc: marcandre.lureau@redhat.com, anisinha@redhat.com, berrange@redhat.com, peterx@redhat.com, farosas@suse.de, "Denis V. Lunev" Subject: [PATCH v5 2/7] dump: refuse dump-guest-memory while guest RAM is being migrated Date: Fri, 19 Jun 2026 12:18:29 +0200 Message-ID: <20260619101834.228432-3-den@openvz.org> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260619101834.228432-1-den@openvz.org> References: <20260619101834.228432-1-den@openvz.org> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists1p.gnu.org; Received-SPF: softfail client-ip=130.117.225.111; envelope-from=den@openvz.org; helo=relay.virtuozzo.com X-Spam_score_int: -34 X-Spam_score: -3.5 X-Spam_bar: --- X-Spam_report: (-3.5 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, RCVD_IN_DNSWL_MED=-2.3, SPF_HELO_NONE=0.001, SPF_SOFTFAIL=0.665 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: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-to: "Denis V. Lunev" From: "Denis V. Lunev" via qemu development Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZM-MESSAGEID: 1781864380023158500 Content-Type: text/plain; charset="utf-8" dump-guest-memory reads all of guest RAM. The existing guard only rejects the dump in RUN_STATE_INMIGRATE, i.e. the precopy load phase. On a postcopy destination the guest already runs (RUN_STATE_RUNNING) while its pages are pulled from the source on demand. A non-detached dump reads that RAM on the main thread with the BQL held. Touching a not-yet-received page blocks on the userfault, and because the postcopy incoming path itself takes the BQL to install pages, the transfer that would satisfy the fault cannot progress: the VM deadlocks. Use migration_guest_ram_loading(), which also covers postcopy, so the dump is refused for the whole time the destination is still receiving guest RAM. Signed-off-by: Denis V. Lunev --- dump/dump.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/dump/dump.c b/dump/dump.c index 1f216e74f5..47ea27f716 100644 --- a/dump/dump.c +++ b/dump/dump.c @@ -29,6 +29,7 @@ #include "qemu/main-loop.h" #include "hw/misc/vmcoreinfo.h" #include "migration/blocker.h" +#include "migration/misc.h" #include "hw/core/cpu.h" #include "win_dump.h" #include "qemu/range.h" @@ -2079,8 +2080,8 @@ void qmp_dump_guest_memory(bool paging, const char *p= rotocol, bool detach_p =3D false; bool kdump_raw =3D false; =20 - if (runstate_check(RUN_STATE_INMIGRATE)) { - error_setg(errp, "Dump not allowed during incoming migration."); + if (migration_guest_ram_loading()) { + error_setg(errp, "Dump not allowed during migration."); return; } =20 --=20 2.53.0 From nobody Sun Jul 26 12:31:36 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=nongnu.org ARC-Seal: i=1; a=rsa-sha256; t=1781864390; cv=none; d=zohomail.com; s=zohoarc; b=NloUd9+GAUNMWUc4XVo/7rMvdKVSlSTNDr4EZsxre8/yf80B/DV1YaK86nDEQoUyAMwmBuW4YAQmk5oFAFg+XQDZcWPpPG92baK41tBIDPHhNWDsH3jan6i33FIlh6Bc2TUWm/QA87IZfjOnF/6G/CVlBqFgLn6H6kRitCyoJNQ= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1781864390; h=Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:Reply-To:Reply-To:References:Sender:Subject:Subject:To:To:Message-Id; bh=wBrE6v3lVOCEPIWG8+1Ll7UvgIVXe4mtnOov3hTw8o4=; b=M04QwX04v7sPJwSBu3OZEHTBcCZQ0zYAP9BwOa+kCoilE49YDu/pbkNAtpXfNU21FaSMFSTAupdObRQIvBbow4oodnQ4umCzAIy+Gv68iN565zK7H449T5aLt+6zrijp+OSgg3XI6PeKd+93HwfLBmQ818Ibhd0qm+iMb8AjE6o= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1781864390981415.4082657072787; Fri, 19 Jun 2026 03:19:50 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1waWJ9-0006JB-My; Fri, 19 Jun 2026 06:18:43 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1waWJ8-0006I9-0H for qemu-devel@nongnu.org; Fri, 19 Jun 2026 06:18:42 -0400 Received: from relay.virtuozzo.com ([130.117.225.111]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1waWJ5-0000ew-E6 for qemu-devel@nongnu.org; Fri, 19 Jun 2026 06:18:41 -0400 Received: from ch-demo-asa.virtuozzo.com ([130.117.225.8] helo=athena.sw.ru) by relay.virtuozzo.com with esmtp (Exim 4.96) (envelope-from ) id 1waWIT-006QLJ-39; Fri, 19 Jun 2026 12:18:33 +0200 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=virtuozzo.com; s=relay; h=MIME-Version:Message-ID:Date:Subject:From: Content-Type; bh=wBrE6v3lVOCEPIWG8+1Ll7UvgIVXe4mtnOov3hTw8o4=; b=H8RXn7yqXEU9 be4SEGfn6lmKXpOojIK1KB2MEWqV+TPb+XueD8qvSbCz+3zhw4zr0PZQUxyQLrC8zVw9GVqeRnOis yeDAmH+bpXUq31fh76UNkJ07nsvBA/qoNYEjxeHJ5z7EAlNyQjBFRnZwIUwGUpHOlhfh2atqy25DX HdYLJMMo/+3CNmsybiJCWTsM/U1sDLdPxm8plI5D9tyyluLekLlQIwjAQmsd6Y0g5g+F/1RB318AJ dGS+Uuhg0Sl9RwCXBJLaVAWneBFxN2msbCJAQwle4Lv1hV5ae8tcVtKzf+EfgncJgUWxbJCK09U4W vWYCU++GeOqf3LMZE6e7Wg==; To: qemu-devel@nongnu.org Cc: marcandre.lureau@redhat.com, anisinha@redhat.com, berrange@redhat.com, peterx@redhat.com, farosas@suse.de, "Denis V. Lunev" Subject: [PATCH v5 3/7] system/cpus: refuse memsave/pmemsave while guest RAM is being migrated Date: Fri, 19 Jun 2026 12:18:30 +0200 Message-ID: <20260619101834.228432-4-den@openvz.org> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260619101834.228432-1-den@openvz.org> References: <20260619101834.228432-1-den@openvz.org> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists1p.gnu.org; Received-SPF: softfail client-ip=130.117.225.111; envelope-from=den@openvz.org; helo=relay.virtuozzo.com X-Spam_score_int: -34 X-Spam_score: -3.5 X-Spam_bar: --- X-Spam_report: (-3.5 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, RCVD_IN_DNSWL_MED=-2.3, SPF_HELO_NONE=0.001, SPF_SOFTFAIL=0.665 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: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-to: "Denis V. Lunev" From: "Denis V. Lunev" via qemu development Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZM-MESSAGEID: 1781864391551158500 Content-Type: text/plain; charset="utf-8" memsave and pmemsave read guest memory and write it to a file, with no guard at all. They run on the main thread with the BQL held, so on a postcopy destination touching a not-yet-received page deadlocks: the thread blocks on the userfault while the postcopy incoming path waits for the BQL to install that page. During precopy the read returns incomplete state instead. Refuse both while guest RAM is still being received, using the same migration_guest_ram_loading() check as dump-guest-memory. Signed-off-by: Denis V. Lunev --- system/cpus.c | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/system/cpus.c b/system/cpus.c index bded87feb1..ba9da4ee06 100644 --- a/system/cpus.c +++ b/system/cpus.c @@ -42,6 +42,7 @@ #include "hw/core/nmi.h" #include "system/replay.h" #include "system/runstate.h" +#include "migration/misc.h" #include "system/cpu-timers.h" #include "system/whpx.h" #include "hw/core/boards.h" @@ -841,6 +842,11 @@ void qmp_memsave(uint64_t addr, uint64_t size, const c= har *filename, uint8_t buf[1024]; uint64_t orig_addr =3D addr, orig_size =3D size; =20 + if (migration_guest_ram_loading()) { + error_setg(errp, "Guest memory access not allowed during migration= "); + return; + } + if (!has_cpu) { cpu_index =3D 0; } @@ -887,6 +893,11 @@ void qmp_pmemsave(uint64_t addr, uint64_t size, const = char *filename, uint64_t l; uint8_t buf[1024]; =20 + if (migration_guest_ram_loading()) { + error_setg(errp, "Guest memory access not allowed during migration= "); + return; + } + f =3D fopen(filename, "wb"); if (!f) { error_setg_file_open(errp, errno, filename); --=20 2.53.0 From nobody Sun Jul 26 12:31:36 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=nongnu.org ARC-Seal: i=1; a=rsa-sha256; t=1781864377; cv=none; d=zohomail.com; s=zohoarc; b=iqzQnB5pfRW20y7hTKf8zidoQEArAc2fMGtvsEVHcvRU2E+G1ERYmK0pLjylwOdK8o5/AAiafH6GWJ5DNYnk4yvPDcmppQLCcdTzq5z/Wf5ABwV90ghWOHN5qBN7O3OFmodMDHPIWh+ytTjMJtvMKWglag8S+8v1vcHRA/cuyDg= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1781864377; h=Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:Reply-To:Reply-To:References:Sender:Subject:Subject:To:To:Message-Id; bh=Bpp0HI+A8jbUgs575HuTkfMJX5RZ+rbTsXttqYd67is=; b=kX323Nk2js4pDQOQX5klx9KzKHKEyBgNWLBzwPEcEEfKv+kqakGiTQkxW3qmiDRojT2zWugS3n0Q9+wiJmfGW5MJMYsUz2DvxNUkzOnRMDMG2mLtf9yMBoDvDUWd+dkrScMmog/zA1H3ILkPG+V5MBhWb9BPHoUAVFGLiTOVVM0= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1781864377670832.713394023849; Fri, 19 Jun 2026 03:19:37 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1waWJB-0006KA-As; Fri, 19 Jun 2026 06:18:45 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1waWJ8-0006ID-6B for qemu-devel@nongnu.org; Fri, 19 Jun 2026 06:18:42 -0400 Received: from relay.virtuozzo.com ([130.117.225.111]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1waWJ5-0000f3-Ec for qemu-devel@nongnu.org; Fri, 19 Jun 2026 06:18:41 -0400 Received: from ch-demo-asa.virtuozzo.com ([130.117.225.8] helo=athena.sw.ru) by relay.virtuozzo.com with esmtp (Exim 4.96) (envelope-from ) id 1waWIU-006QLJ-1Y; Fri, 19 Jun 2026 12:18:34 +0200 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=virtuozzo.com; s=relay; h=MIME-Version:Message-ID:Date:Subject:From: Content-Type; bh=Bpp0HI+A8jbUgs575HuTkfMJX5RZ+rbTsXttqYd67is=; b=QNGCRcaWMcME Gds0aw8u3xnZiDBI6QU/OtcCcr2cGCbmOp2acz2w3vh8s85/xRKb1Lkzxw+GjpgDfnJcr3dRvoZif E/phA8pMRy5Ip4yhiID4kF8LkVaOa2HLntT16tFX3CuSxmRHhgXjrVtCUuVW2EdLH7MCEPZhL9sar Op9n7eNwiu2HdC/mspZfV1lehNFwYYuGFn8XnORaU7URSRzMG9wlcscgVPmy7IUYWumQV0An3Qr8I QmAq3SLj5AxNWPwfLiIy78V6+ALao+S4wQOhNxkr6uyRQQcHUfdY2khZ7UEep8K88vunzoM6GP+An f5KcxSsEEdQLecqEAaq+Dg==; To: qemu-devel@nongnu.org Cc: marcandre.lureau@redhat.com, anisinha@redhat.com, berrange@redhat.com, peterx@redhat.com, farosas@suse.de, "Denis V. Lunev" Subject: [PATCH v5 4/7] dump: make win_dump_available() check vmcoreinfo for a Windows dump header Date: Fri, 19 Jun 2026 12:18:31 +0200 Message-ID: <20260619101834.228432-5-den@openvz.org> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260619101834.228432-1-den@openvz.org> References: <20260619101834.228432-1-den@openvz.org> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists1p.gnu.org; Received-SPF: softfail client-ip=130.117.225.111; envelope-from=den@openvz.org; helo=relay.virtuozzo.com X-Spam_score_int: -34 X-Spam_score: -3.5 X-Spam_bar: --- X-Spam_report: (-3.5 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, RCVD_IN_DNSWL_MED=-2.3, SPF_HELO_NONE=0.001, SPF_SOFTFAIL=0.665 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: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-to: "Denis V. Lunev" From: "Denis V. Lunev" via qemu development Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZM-MESSAGEID: 1781864380039158500 Content-Type: text/plain; charset="utf-8" QMP query-dump-guest-memory-capability reports win-dmp as available for any x86 VM, and dump-guest-memory accepts the win-dmp format unconditionally. Both are wrong: win-dmp only works when the guest has published a Windows dump header through vmcoreinfo. The guest registers that note with the vmcoreinfo device (its physical address and size), so win_dump_available() can read it back directly and validate the note size and the Windows dump header signature. This needs no other guest state, so it does not stop the vCPUs. The capability query reads the note on the main thread with the BQL held and has no migration guard of its own, so it is skipped while a migration destination is still receiving guest RAM: there the read would deadlock against the postcopy load (which needs the BQL) or, in precopy, see incomplete pages. Based on the original work of Nikolai Barybin. Signed-off-by: Denis V. Lunev --- dump/win_dump-x86.c | 49 ++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 44 insertions(+), 5 deletions(-) diff --git a/dump/win_dump-x86.c b/dump/win_dump-x86.c index d893dea7f1..6a8b2b71a7 100644 --- a/dump/win_dump-x86.c +++ b/dump/win_dump-x86.c @@ -17,11 +17,10 @@ #include "qemu/win_dump_defs.h" #include "win_dump.h" #include "cpu.h" - -bool win_dump_available(Error **errp) -{ - return true; -} +#include "qemu/bswap.h" +#include "hw/misc/vmcoreinfo.h" +#include "migration/misc.h" +#include "standard-headers/linux/qemu_fw_cfg.h" =20 static size_t win_dump_ptr_size(bool x64) { @@ -403,6 +402,46 @@ static void restore_context(WinDumpHeader *h, bool x64, } } =20 +bool win_dump_available(Error **errp) +{ + VMCoreInfoState *vmci =3D vmcoreinfo_find(); + g_autofree uint8_t *note =3D NULL; + Error *local_err =3D NULL; + WinDumpHeader *h; + uint32_t size; + bool x64 =3D true; + + if (migration_guest_ram_loading()) { + error_setg(errp, "win-dump: not available during migration"); + return false; + } + + if (!vmci || !vmci->has_vmcoreinfo || + le16_to_cpu(vmci->vmcoreinfo.guest_format) !=3D + FW_CFG_VMCOREINFO_FORMAT_ELF) { + error_setg(errp, "win-dump: no vmcoreinfo note from the guest"); + return false; + } + + size =3D le32_to_cpu(vmci->vmcoreinfo.size); + if (size !=3D VMCOREINFO_WIN_DUMP_NOTE_SIZE32 && + size !=3D VMCOREINFO_WIN_DUMP_NOTE_SIZE64) { + error_setg(errp, "win-dump: invalid vmcoreinfo note size"); + return false; + } + + note =3D g_malloc(size); + cpu_physical_memory_read(le64_to_cpu(vmci->vmcoreinfo.paddr), note, si= ze); + + h =3D (void *)(note + VMCOREINFO_ELF_NOTE_HDR_SIZE); + if (!check_header(h, &x64, &local_err)) { + error_propagate(errp, local_err); + return false; + } + + return true; +} + void create_win_dump(DumpState *s, Error **errp) { WinDumpHeader *h =3D (void *)(s->guest_note + VMCOREINFO_ELF_NOTE_HDR_= SIZE); --=20 2.53.0 From nobody Sun Jul 26 12:31:36 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=nongnu.org ARC-Seal: i=1; a=rsa-sha256; t=1781864380; cv=none; d=zohomail.com; s=zohoarc; b=OzCGNFCsYFUxO//+YEef+S7jReSHSZ8EkGr/q8kSGQ3dfcEdym+R+KQJm0J4mmEYAEh5l9FNl/0gkes2S0g0xkpoXwwEgsOKoiHjUrDmpFZly9FWu+2mZmzlu1LWywIPZX+vUx9DZAKIAol9tEz8JXRybyc9RkUUj9MVQ+Pl2mQ= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1781864380; h=Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:Reply-To:Reply-To:References:Sender:Subject:Subject:To:To:Message-Id; bh=VqKwkk7u2inZp7I1hV1QM8bMKlNwJuV7mZi0Y5eyqBY=; b=dnuzc6MnWc68MTuy9lnGvytMV+3xnTzCd5AcMnqR4+E8kTaBTUWF3vF0XgiiKYxx46EvavClszuLQHlv8nb07gEZ3QMh7lNqP8MbJkuLhnJD8+GMpDO8WZ1F2k67wVTlD7Zo4CGgnvPO6kSpy23CKNUsqCRcC00NKkioCyogkno= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1781864380127128.26685379431558; Fri, 19 Jun 2026 03:19:40 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1waWJC-0006KL-6n; Fri, 19 Jun 2026 06:18:46 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1waWJ9-0006JE-NM for qemu-devel@nongnu.org; Fri, 19 Jun 2026 06:18:43 -0400 Received: from relay.virtuozzo.com ([130.117.225.111]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1waWJ5-0000f7-JY for qemu-devel@nongnu.org; Fri, 19 Jun 2026 06:18:43 -0400 Received: from ch-demo-asa.virtuozzo.com ([130.117.225.8] helo=athena.sw.ru) by relay.virtuozzo.com with esmtp (Exim 4.96) (envelope-from ) id 1waWIU-006QLJ-3A; Fri, 19 Jun 2026 12:18:34 +0200 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=virtuozzo.com; s=relay; h=MIME-Version:Message-ID:Date:Subject:From: Content-Type; bh=VqKwkk7u2inZp7I1hV1QM8bMKlNwJuV7mZi0Y5eyqBY=; b=YQePrXUTCKoX b6xq6GiKWe6OmKGbqPN7/lVsd28NK2P4FysWw4n51xLZ8ZK1GnR/nM5GDA8qRf41l/ucxzTQHOAv1 5KWA69/232LQxhJutcs/7QOIQzDF+Z2P/2zCenH4aCfoOyi5F8r68YzbG8K6h/MR5843pWNEXnLwe HROJ80tyeco3SnebANkroPFtSrerY2Chk6NTT6lgJSUKZYKyBK3Kc0TY2O5zhM79AQz+KtPUS0EZi if9YdAClM94xJptuUDo+Z3NAtnttSvyJ7J0NcgQ+2ewu4+dQVPOiiprFz15cogf6dAmhBhlJm2KIa cZaWHcJybqoT2C526fUunA==; To: qemu-devel@nongnu.org Cc: marcandre.lureau@redhat.com, anisinha@redhat.com, berrange@redhat.com, peterx@redhat.com, farosas@suse.de, "Denis V. Lunev" Subject: [PATCH v5 5/7] tests/qtest: add dump-guest-memory test Date: Fri, 19 Jun 2026 12:18:32 +0200 Message-ID: <20260619101834.228432-6-den@openvz.org> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260619101834.228432-1-den@openvz.org> References: <20260619101834.228432-1-den@openvz.org> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists1p.gnu.org; Received-SPF: softfail client-ip=130.117.225.111; envelope-from=den@openvz.org; helo=relay.virtuozzo.com X-Spam_score_int: -34 X-Spam_score: -3.5 X-Spam_bar: --- X-Spam_report: (-3.5 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, RCVD_IN_DNSWL_MED=-2.3, SPF_HELO_NONE=0.001, SPF_SOFTFAIL=0.665 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: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-to: "Denis V. Lunev" From: "Denis V. Lunev" via qemu development Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZM-MESSAGEID: 1781864381505158500 Content-Type: text/plain; charset="utf-8" There is currently almost no coverage for the dump-guest-memory QMP command beyond the test-hmp smoke test. Add a qtest that runs on a bare machine (no guest OS) and checks: - query-dump-guest-memory-capability always advertises 'elf'; - an ELF dump is produced and starts with the ELF magic; - a non-raw kdump dump is emitted in makedumpfile flattened format; - a raw kdump dump starts with the on-disk KDUMP header; - an unknown protocol is rejected without killing the VM, and dumping still works afterwards. Signed-off-by: Denis V. Lunev --- MAINTAINERS | 1 + tests/qtest/dump-test.c | 188 ++++++++++++++++++++++++++++++++++++++++ tests/qtest/meson.build | 1 + 3 files changed, 190 insertions(+) create mode 100644 tests/qtest/dump-test.c diff --git a/MAINTAINERS b/MAINTAINERS index 93df53d87f..f82412443c 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -3291,6 +3291,7 @@ F: scripts/dump-guest-memory.py F: stubs/dump.c F: docs/specs/vmcoreinfo.rst F: tests/qtest/vmcoreinfo-test.c +F: tests/qtest/dump-test.c =20 Error reporting M: Markus Armbruster diff --git a/tests/qtest/dump-test.c b/tests/qtest/dump-test.c new file mode 100644 index 0000000000..eb188c9ccb --- /dev/null +++ b/tests/qtest/dump-test.c @@ -0,0 +1,188 @@ +/* + * QTest testcase for dump-guest-memory + * + * Generic coverage for the dump-guest-memory QMP command and the + * query-dump-guest-memory-capability reporting, exercised on a bare + * machine (no guest OS required). + * + * Copyright (c) 2026 Virtuozzo International GmbH + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#include "qemu/osdep.h" +#include "libqtest.h" +#include "qobject/qdict.h" +#include "qobject/qlist.h" +#include "qobject/qstring.h" +#include "qemu/bswap.h" +#include "elf.h" + +#define KDUMP_RAW_MAGIC "KDUMP " +#define KDUMP_FLAT_MAGIC "makedumpfile" + +static QTestState *dump_test_start(void) +{ + return qtest_initf("-machine q35 -accel qtest -m 16"); +} + +static void assert_file_magic(const char *path, const char *magic, size_t = len) +{ + g_autofree char *buf =3D g_malloc0(len); + FILE *f =3D fopen(path, "rb"); + + g_assert_nonnull(f); + g_assert_cmpint(fread(buf, 1, len, f), =3D=3D, len); + fclose(f); + g_assert_cmpint(memcmp(buf, magic, len), =3D=3D, 0); +} + +/* validate that the file is a sane x86 ELF core, not just the leading mag= ic */ +static void assert_valid_elf_core(const char *path) +{ + unsigned char e[64]; + FILE *f =3D fopen(path, "rb"); + uint16_t e_type, e_machine, e_phnum; + + g_assert_nonnull(f); + g_assert_cmpint(fread(e, 1, sizeof(e), f), =3D=3D, sizeof(e)); + fclose(f); + + g_assert_cmpint(memcmp(e, ELFMAG, SELFMAG), =3D=3D, 0); + + /* e_type and e_machine sit at the same offset for ELF32 and ELF64 */ + e_type =3D lduw_le_p(e + 16); + e_machine =3D lduw_le_p(e + 18); + g_assert_cmpint(e_type, =3D=3D, ET_CORE); + g_assert(e_machine =3D=3D EM_386 || e_machine =3D=3D EM_X86_64); + + /* e_phnum lives at a class-dependent offset */ + if (e[EI_CLASS] =3D=3D ELFCLASS64) { + e_phnum =3D lduw_le_p(e + 56); + } else { + e_phnum =3D lduw_le_p(e + 44); + } + g_assert_cmpint(e_phnum, >, 0); +} + +/* dump-guest-memory to a fresh temp file; returns the path (caller frees)= */ +static char *do_dump(QTestState *qts, const char *format) +{ + g_autofree char *tmp =3D NULL; + g_autofree char *proto =3D NULL; + GError *err =3D NULL; + int fd; + + fd =3D g_file_open_tmp("dump-test-XXXXXX", &tmp, &err); + g_assert_no_error(err); + close(fd); + proto =3D g_strdup_printf("file:%s", tmp); + + if (format) { + qtest_qmp_assert_success(qts, + "{ 'execute': 'dump-guest-memory'," + " 'arguments': { 'paging': false, 'protocol': %s," + " 'format': %s } }", proto, format); + } else { + qtest_qmp_assert_success(qts, + "{ 'execute': 'dump-guest-memory'," + " 'arguments': { 'paging': false, 'protocol': %s } }", proto); + } + + return g_steal_pointer(&tmp); +} + +/* query-dump-guest-memory-capability must always advertise at least 'elf'= */ +static void test_query_capability(void) +{ + QTestState *qts =3D dump_test_start(); + QDict *resp, *ret; + QList *formats; + QListEntry *e; + bool has_elf =3D false; + + resp =3D qtest_qmp(qts, + "{ 'execute': 'query-dump-guest-memory-capability' }"); + g_assert(qdict_haskey(resp, "return")); + ret =3D qdict_get_qdict(resp, "return"); + formats =3D qdict_get_qlist(ret, "formats"); + g_assert_nonnull(formats); + + QLIST_FOREACH_ENTRY(formats, e) { + QString *qs =3D qobject_to(QString, qlist_entry_obj(e)); + + if (g_str_equal(qstring_get_str(qs), "elf")) { + has_elf =3D true; + } + } + g_assert_true(has_elf); + + qobject_unref(resp); + qtest_quit(qts); +} + +static void test_dump_elf(void) +{ + QTestState *qts =3D dump_test_start(); + g_autofree char *path =3D do_dump(qts, NULL); + + assert_valid_elf_core(path); + unlink(path); + qtest_quit(qts); +} + +/* non-raw kdump is emitted in makedumpfile flattened format */ +static void test_dump_kdump_zlib(void) +{ + QTestState *qts =3D dump_test_start(); + g_autofree char *path =3D do_dump(qts, "kdump-zlib"); + + assert_file_magic(path, KDUMP_FLAT_MAGIC, strlen(KDUMP_FLAT_MAGIC)); + unlink(path); + qtest_quit(qts); +} + +/* raw kdump starts with the on-disk KDUMP header */ +static void test_dump_kdump_raw_zlib(void) +{ + QTestState *qts =3D dump_test_start(); + g_autofree char *path =3D do_dump(qts, "kdump-raw-zlib"); + + assert_file_magic(path, KDUMP_RAW_MAGIC, strlen(KDUMP_RAW_MAGIC)); + unlink(path); + qtest_quit(qts); +} + +/* an unknown protocol must be rejected, not crash the VM */ +static void test_dump_invalid_protocol(void) +{ + QTestState *qts =3D dump_test_start(); + g_autofree char *path =3D NULL; + QDict *resp; + + resp =3D qtest_qmp(qts, + "{ 'execute': 'dump-guest-memory'," + " 'arguments': { 'paging': false, 'protocol': 'bogus:/x' } }"); + g_assert(qdict_haskey(resp, "error")); + qobject_unref(resp); + + /* VM is still alive and dumping still works afterwards */ + path =3D do_dump(qts, NULL); + assert_valid_elf_core(path); + unlink(path); + + qtest_quit(qts); +} + +int main(int argc, char **argv) +{ + g_test_init(&argc, &argv, NULL); + + qtest_add_func("/dump/query-capability", test_query_capability); + qtest_add_func("/dump/elf", test_dump_elf); + qtest_add_func("/dump/kdump-zlib", test_dump_kdump_zlib); + qtest_add_func("/dump/kdump-raw-zlib", test_dump_kdump_raw_zlib); + qtest_add_func("/dump/invalid-protocol", test_dump_invalid_protocol); + + return g_test_run(); +} diff --git a/tests/qtest/meson.build b/tests/qtest/meson.build index 4897325d84..e5266bc1eb 100644 --- a/tests/qtest/meson.build +++ b/tests/qtest/meson.build @@ -59,6 +59,7 @@ qtests_i386 =3D \ (config_all_devices.has_key('CONFIG_FDC_ISA') ? ['fdc-test'] : []) + = \ (config_all_devices.has_key('CONFIG_I440FX') ? ['fw_cfg-test'] : []) + = \ (config_all_devices.has_key('CONFIG_FW_CFG_DMA') ? ['vmcoreinfo-test'] := []) + \ + ['dump-test'] + = \ (config_all_devices.has_key('CONFIG_I440FX') ? ['i440fx-test'] : []) + = \ (config_all_devices.has_key('CONFIG_I440FX') ? ['ide-test'] : []) + = \ (config_all_devices.has_key('CONFIG_I440FX') ? ['numa-test'] : []) + = \ --=20 2.53.0 From nobody Sun Jul 26 12:31:36 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=nongnu.org ARC-Seal: i=1; a=rsa-sha256; t=1781864377; cv=none; d=zohomail.com; s=zohoarc; b=c3+6cUXEqW6n02ck2R9QvnG5OyS1krM4Vpk0OI0SWmBvbQ4Mzgyvq5uERO6NX1Pdtdko5fBXFcmCjy+NwESxYZzm1LH2bXRjpWF7znVtsR924KUhywwBUxYDKNQYpSr/lWI4C3fmHIGQs+X3Z6ZvpssfZiX1Bg9rjE/1QUd8kg4= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1781864377; h=Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:Reply-To:Reply-To:References:Sender:Subject:Subject:To:To:Message-Id; bh=dZVtOxE/JVhOT97T/jzFqUWxYYdVhLADxvY1qb5kBMg=; b=gzZOjBCNYlEXRcJ4zQJUPAyUt24DgVZknJpv9Eska6EVFigWFPkWxEv/itkcobV0r4/aNEjBahrdTQMuRt4CucDVxWsLtjs6nkOoNL3/RRiR6h4i/Jqq15bFC07bXdQgjbYJbh3iFupPJRv0aUkuqk1LR4fR1ewjjKip7kLCflI= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1781864377339330.1913936615696; Fri, 19 Jun 2026 03:19:37 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1waWJB-0006K6-6o; Fri, 19 Jun 2026 06:18:45 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1waWJ9-0006J2-Bb for qemu-devel@nongnu.org; Fri, 19 Jun 2026 06:18:43 -0400 Received: from relay.virtuozzo.com ([130.117.225.111]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1waWJ6-0000fH-6V for qemu-devel@nongnu.org; Fri, 19 Jun 2026 06:18:43 -0400 Received: from ch-demo-asa.virtuozzo.com ([130.117.225.8] helo=athena.sw.ru) by relay.virtuozzo.com with esmtp (Exim 4.96) (envelope-from ) id 1waWIV-006QLJ-1W; Fri, 19 Jun 2026 12:18:35 +0200 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=virtuozzo.com; s=relay; h=MIME-Version:Message-ID:Date:Subject:From: Content-Type; bh=dZVtOxE/JVhOT97T/jzFqUWxYYdVhLADxvY1qb5kBMg=; b=g3Xb2rV2l5LR FqRkQu3wR3pN+gL3EZzWdrhdrH3NQ5UAuX1h5I0vl+KhmmXfX22+F1pX5cbB1cWhCONqXjq69NmaU xaB4nF7qdAOQLXPrj/tvq+whvxf7tWYsKnITRlMIMpRU/SBOrwh6aLtjNcA2qT1R3Z1Sa8bs7RLXk b1KYFgqQtLsD4ScFmM92lCt7iovoos58sL4h2SxER5sUumZP3ea3kVAj5yWJsTvOyvMbFVHBneXU5 DuDU987wfQHKeWVQZJUw11xlug/Cfyq/J61Yq9Tv1l0MvVg9VHZmi1RRF6hS4umWqybPE29PHvWLa wEUzelkXFPmCOWTaTJx1gQ==; To: qemu-devel@nongnu.org Cc: marcandre.lureau@redhat.com, anisinha@redhat.com, berrange@redhat.com, peterx@redhat.com, farosas@suse.de, "Denis V. Lunev" Subject: [PATCH v5 6/7] tests/qtest/dump: reject win-dmp without vmcoreinfo Date: Fri, 19 Jun 2026 12:18:33 +0200 Message-ID: <20260619101834.228432-7-den@openvz.org> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260619101834.228432-1-den@openvz.org> References: <20260619101834.228432-1-den@openvz.org> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists1p.gnu.org; Received-SPF: softfail client-ip=130.117.225.111; envelope-from=den@openvz.org; helo=relay.virtuozzo.com X-Spam_score_int: -34 X-Spam_score: -3.5 X-Spam_bar: --- X-Spam_report: (-3.5 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, RCVD_IN_DNSWL_MED=-2.3, SPF_HELO_NONE=0.001, SPF_SOFTFAIL=0.665 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: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-to: "Denis V. Lunev" From: "Denis V. Lunev" via qemu development Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZM-MESSAGEID: 1781864380034158500 Content-Type: text/plain; charset="utf-8" Requesting the Windows crashdump format (win-dmp) on a guest that does not expose a Windows dump header through vmcoreinfo must be rejected, not silently turned into a bogus dump. Add a test that asks for win-dmp on a plain VM and checks the request fails with "invalid vmcoreinfo note size" and that the VM stays usable afterwards (a subsequent ELF dump succeeds). The test is x86_64 only, where win_dump_available() performs this check. Signed-off-by: Denis V. Lunev --- tests/qtest/dump-test.c | 49 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 49 insertions(+) diff --git a/tests/qtest/dump-test.c b/tests/qtest/dump-test.c index eb188c9ccb..6afaa2c2ea 100644 --- a/tests/qtest/dump-test.c +++ b/tests/qtest/dump-test.c @@ -174,8 +174,51 @@ static void test_dump_invalid_protocol(void) qtest_quit(qts); } =20 +/* + * Requesting win-dmp without a Windows dump header in vmcoreinfo must be + * rejected with a clear error -- and must leave the VM usable, rather than + * produce a bogus dump. + */ +static void test_dump_win_dmp_unavailable(void) +{ + QTestState *qts =3D dump_test_start(); + g_autofree char *tmp =3D NULL; + g_autofree char *proto =3D NULL; + g_autofree char *path =3D NULL; + GError *err =3D NULL; + QDict *resp, *error; + const char *desc; + int fd; + + fd =3D g_file_open_tmp("dump-test-XXXXXX", &tmp, &err); + g_assert_no_error(err); + close(fd); + proto =3D g_strdup_printf("file:%s", tmp); + + resp =3D qtest_qmp(qts, + "{ 'execute': 'dump-guest-memory'," + " 'arguments': { 'paging': false, 'protocol': %s," + " 'format': 'win-dmp' } }", proto); + error =3D qdict_get_qdict(resp, "error"); + g_assert_nonnull(error); + desc =3D qdict_get_try_str(error, "desc"); + g_assert_nonnull(desc); + g_assert_nonnull(strstr(desc, "vmcoreinfo")); + qobject_unref(resp); + unlink(tmp); + + /* the failed request must not wedge the VM: a plain dump still works = */ + path =3D do_dump(qts, NULL); + assert_valid_elf_core(path); + unlink(path); + + qtest_quit(qts); +} + int main(int argc, char **argv) { + const char *arch =3D qtest_get_arch(); + g_test_init(&argc, &argv, NULL); =20 qtest_add_func("/dump/query-capability", test_query_capability); @@ -184,5 +227,11 @@ int main(int argc, char **argv) qtest_add_func("/dump/kdump-raw-zlib", test_dump_kdump_raw_zlib); qtest_add_func("/dump/invalid-protocol", test_dump_invalid_protocol); =20 + /* win-dmp is an x86_64-only format */ + if (g_str_equal(arch, "x86_64")) { + qtest_add_func("/dump/win-dmp-unavailable", + test_dump_win_dmp_unavailable); + } + return g_test_run(); } --=20 2.53.0 From nobody Sun Jul 26 12:31:36 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=nongnu.org ARC-Seal: i=1; a=rsa-sha256; t=1781864405; cv=none; d=zohomail.com; s=zohoarc; b=F1EgGmCN45nrljLBMfwUBd/Tg2rQsk0tVI1TI8NlYLMy0sQDueg9FPqmngOFViTnxsz+oOlvDbtqpHyr+gFJZXVG3jmXFlV7pK5BY44qdnV4lY7Q+N4G0b8lLlfhlBvfHAA0J8m/0ZDikgaSffuBtUCn/5uzmnDBfSoko/GAfVY= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1781864405; h=Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:Reply-To:Reply-To:References:Sender:Subject:Subject:To:To:Message-Id; bh=54rkZq3cOprcVyaQqOh5pL1E1/jpIGYTKwNBB9XxI7A=; b=Mdhlevd+vBAya/dll1YHkH01WRUu4vm3O4+Ens4yJ35m70GwJ5s63ymf9Y/nozYNQtzDNCaJvoOZCHWPSz92vLWqMdQMUEcXLEkPODYs54gQ5jM6FY9tHxfSkKZXUoVbdCdRMAxTk/AmCljKkYlozG3MOSHhUasv1XQINKp5GKQ= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1781864404944607.0185220140683; Fri, 19 Jun 2026 03:20:04 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1waWJC-0006KK-39; Fri, 19 Jun 2026 06:18:46 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1waWJ9-0006J7-Is for qemu-devel@nongnu.org; Fri, 19 Jun 2026 06:18:43 -0400 Received: from relay.virtuozzo.com ([130.117.225.111]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1waWJ6-0000fL-Jr for qemu-devel@nongnu.org; Fri, 19 Jun 2026 06:18:43 -0400 Received: from ch-demo-asa.virtuozzo.com ([130.117.225.8] helo=athena.sw.ru) by relay.virtuozzo.com with esmtp (Exim 4.96) (envelope-from ) id 1waWIV-006QLJ-34; Fri, 19 Jun 2026 12:18:35 +0200 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=virtuozzo.com; s=relay; h=MIME-Version:Message-ID:Date:Subject:From: Content-Type; bh=54rkZq3cOprcVyaQqOh5pL1E1/jpIGYTKwNBB9XxI7A=; b=mcH/0Ah7hJnz l5EkW7CX/Hkl8NAMXW6CPLPFrpJQXXC8aq4hGkV4bHslaAFn6DGknje/PKaaSCz0HRSGkAqW9/m61 mn9bZm/WPEerL99fi0DxkiN1m3N2Qdpct+ZajasQTJ9RSCG4BaEFc0q27YWKh4fPwdhAqUdQ9UZoY h21fg0x3O5FhyrlsGDmcPzbpkpx8fpFx5MT22xqdKpK5FDlmJ8j2ydzYi4tKKgw04n+s96fcOAkm3 k/PcBAVUfKzfshOjSZIXzfmXdnuXMFKdrd27LB09xB8XkvGZDDR8AA/u2FHM2tZvSTmyB45xzhywe YNpCVzD4tLCLaEl1I3ueXg==; To: qemu-devel@nongnu.org Cc: marcandre.lureau@redhat.com, anisinha@redhat.com, berrange@redhat.com, peterx@redhat.com, farosas@suse.de, "Denis V. Lunev" Subject: [PATCH v5 7/7] tests/qtest/dump: cover win-dmp availability via vmcoreinfo Date: Fri, 19 Jun 2026 12:18:34 +0200 Message-ID: <20260619101834.228432-8-den@openvz.org> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260619101834.228432-1-den@openvz.org> References: <20260619101834.228432-1-den@openvz.org> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists1p.gnu.org; Received-SPF: softfail client-ip=130.117.225.111; envelope-from=den@openvz.org; helo=relay.virtuozzo.com X-Spam_score_int: -34 X-Spam_score: -3.5 X-Spam_bar: --- X-Spam_report: (-3.5 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, RCVD_IN_DNSWL_MED=-2.3, SPF_HELO_NONE=0.001, SPF_SOFTFAIL=0.665 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: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-to: "Denis V. Lunev" From: "Denis V. Lunev" via qemu development Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZM-MESSAGEID: 1781864405640158500 Content-Type: text/plain; charset="utf-8" win-dmp becomes available only once the guest exposes a Windows dump header through vmcoreinfo. Forge exactly such a note (an ELF note header followed by a WinDumpHeader64 carrying the PAGE/DU64 signatures, the layout a Windows guest with the QEMU vmcoreinfo writer produces), place it in guest RAM, point the vmcoreinfo device at it via fw_cfg, and check that win-dmp flips from unavailable to available. This exercises win_dump_available()'s positive path without a real Windows guest. It only covers availability reporting; the actual win-dmp generation (create_win_dump()) needs real Windows kernel structures and is not exercised here. The test is registered only on x86_64 with a vmcoreinfo device present. Signed-off-by: Denis V. Lunev --- tests/qtest/dump-test.c | 94 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 94 insertions(+) diff --git a/tests/qtest/dump-test.c b/tests/qtest/dump-test.c index 6afaa2c2ea..30c95a3528 100644 --- a/tests/qtest/dump-test.c +++ b/tests/qtest/dump-test.c @@ -12,10 +12,15 @@ =20 #include "qemu/osdep.h" #include "libqtest.h" +#include "libqos/libqos-pc.h" +#include "libqos/fw_cfg.h" #include "qobject/qdict.h" #include "qobject/qlist.h" #include "qobject/qstring.h" #include "qemu/bswap.h" +#include "qemu/win_dump_defs.h" +#include "standard-headers/linux/qemu_fw_cfg.h" +#include "hw/misc/vmcoreinfo.h" #include "elf.h" =20 #define KDUMP_RAW_MAGIC "KDUMP " @@ -215,6 +220,90 @@ static void test_dump_win_dmp_unavailable(void) qtest_quit(qts); } =20 +static bool capability_has_format(QTestState *qts, const char *want) +{ + QDict *resp, *ret; + QList *formats; + QListEntry *e; + bool found =3D false; + + resp =3D qtest_qmp(qts, + "{ 'execute': 'query-dump-guest-memory-capability' }"); + g_assert(qdict_haskey(resp, "return")); + ret =3D qdict_get_qdict(resp, "return"); + formats =3D qdict_get_qlist(ret, "formats"); + g_assert_nonnull(formats); + + QLIST_FOREACH_ENTRY(formats, e) { + QString *qs =3D qobject_to(QString, qlist_entry_obj(e)); + + if (g_str_equal(qstring_get_str(qs), want)) { + found =3D true; + } + } + qobject_unref(resp); + return found; +} + +/* + * win-dmp becomes available only once the guest exposes a Windows dump + * header through vmcoreinfo. Forge exactly such a note -- the layout a + * Windows guest with the QEMU vmcoreinfo writer produces: a fixed-size ELF + * note header followed by a WinDumpHeader64 carrying the PAGE/DU64 + * signatures -- place it in guest RAM, point the vmcoreinfo device at it + * via fw_cfg, and check that win-dmp flips from unavailable to available. + * + * This only covers availability *reporting*; the actual win-dmp generation + * (create_win_dump()) needs real Windows kernel structures and is not + * exercised here. + */ +static void test_dump_win_dmp_available(void) +{ + const uint64_t paddr =3D 0x800000; /* 8 MiB, inside guest RAM */ + size_t notesz =3D VMCOREINFO_WIN_DUMP_NOTE_SIZE64; + g_autofree uint8_t *note =3D g_malloc0(notesz); + Elf64_Nhdr *nhdr =3D (Elf64_Nhdr *)note; + WinDumpHeader64 *hdr; + FWCfgVMCoreInfo info; + QFWCFG *fw_cfg; + QOSState *qs; + + /* the WinDumpHeader64 must sit right after the fixed ELF note header = */ + g_assert_cmpint(sizeof(WinDumpHeader64) % 4, =3D=3D, 0); + + nhdr->n_namesz =3D cpu_to_le32(sizeof("VMCOREINFO")); /* 11 -> padded = 12 */ + nhdr->n_descsz =3D cpu_to_le32(sizeof(WinDumpHeader64)); + nhdr->n_type =3D 0; + memcpy(note + sizeof(Elf64_Nhdr), "VMCOREINFO", sizeof("VMCOREINFO") -= 1); + + hdr =3D (WinDumpHeader64 *)(note + VMCOREINFO_ELF_NOTE_HDR_SIZE); + memcpy(hdr->Signature, "PAGE", sizeof(hdr->Signature)); + memcpy(hdr->ValidDump, "DU64", sizeof(hdr->ValidDump)); + + qs =3D qtest_pc_boot("-device vmcoreinfo -m 16"); + fw_cfg =3D pc_fw_cfg_init(qs->qts); + + /* with no guest note yet, win-dmp must not be advertised */ + g_assert_false(capability_has_format(qs->qts, "win-dmp")); + + /* place the forged note in guest RAM and point vmcoreinfo at it */ + qtest_memwrite(qs->qts, paddr, note, notesz); + + memset(&info, 0, sizeof(info)); + info.host_format =3D cpu_to_le16(FW_CFG_VMCOREINFO_FORMAT_ELF); + info.guest_format =3D cpu_to_le16(FW_CFG_VMCOREINFO_FORMAT_ELF); + info.size =3D cpu_to_le32(notesz); + info.paddr =3D cpu_to_le64(paddr); + qfw_cfg_write_file(fw_cfg, qs, FW_CFG_VMCOREINFO_FILENAME, + &info, sizeof(info)); + + /* now win-dmp must be reported as available */ + g_assert_true(capability_has_format(qs->qts, "win-dmp")); + + pc_fw_cfg_uninit(fw_cfg); + qtest_shutdown(qs); +} + int main(int argc, char **argv) { const char *arch =3D qtest_get_arch(); @@ -231,6 +320,11 @@ int main(int argc, char **argv) if (g_str_equal(arch, "x86_64")) { qtest_add_func("/dump/win-dmp-unavailable", test_dump_win_dmp_unavailable); + + if (qtest_has_device("vmcoreinfo")) { + qtest_add_func("/dump/win-dmp-available", + test_dump_win_dmp_available); + } } =20 return g_test_run(); --=20 2.53.0