From nobody Sat May 4 07:59:06 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zoho.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1493321046771556.2784062407275; Thu, 27 Apr 2017 12:24:06 -0700 (PDT) Received: from localhost ([::1]:33878 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1d3p1J-0004up-E0 for importer@patchew.org; Thu, 27 Apr 2017 15:24:05 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:36473) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1d3ozp-0003pR-FG for qemu-devel@nongnu.org; Thu, 27 Apr 2017 15:22:34 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1d3ozl-0006gX-FP for qemu-devel@nongnu.org; Thu, 27 Apr 2017 15:22:33 -0400 Received: from mx1.redhat.com ([209.132.183.28]:38552) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1d3ozl-0006g7-8s for qemu-devel@nongnu.org; Thu, 27 Apr 2017 15:22:29 -0400 Received: from smtp.corp.redhat.com (int-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.12]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 45D817E9DC; Thu, 27 Apr 2017 19:22:28 +0000 (UTC) Received: from red.redhat.com (ovpn-123-177.rdu2.redhat.com [10.10.123.177]) by smtp.corp.redhat.com (Postfix) with ESMTP id 9D648785C1; Thu, 27 Apr 2017 19:22:20 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mx1.redhat.com 45D817E9DC Authentication-Results: ext-mx02.extmail.prod.ext.phx2.redhat.com; dmarc=none (p=none dis=none) header.from=redhat.com Authentication-Results: ext-mx02.extmail.prod.ext.phx2.redhat.com; spf=pass smtp.mailfrom=eblake@redhat.com DKIM-Filter: OpenDKIM Filter v2.11.0 mx1.redhat.com 45D817E9DC From: Eric Blake To: qemu-devel@nongnu.org Date: Thu, 27 Apr 2017 14:22:08 -0500 Message-Id: <20170427192211.30640-2-eblake@redhat.com> In-Reply-To: <20170427192211.30640-1-eblake@redhat.com> References: <20170427192211.30640-1-eblake@redhat.com> X-Scanned-By: MIMEDefang 2.79 on 10.5.11.12 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.26]); Thu, 27 Apr 2017 19:22:28 +0000 (UTC) X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [PATCH v3 1/4] shutdown: Simplify shutdown_signal X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Paolo Bonzini , armbru@redhat.com, alistair.francis@xilinx.com Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" There is no signal 0 (kill(pid, 0) has special semantics to probe whether a process is alive), rather than actually sending a signal 0). So we can use the simpler 0, instead of -1, for our sentinel of whether a shutdown request due to a signal has happened. Suggested-by: Markus Armbruster Signed-off-by: Eric Blake --- v3: new patch --- vl.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/vl.c b/vl.c index f46e070..879786a 100644 --- a/vl.c +++ b/vl.c @@ -1598,7 +1598,7 @@ void vm_state_notify(int running, RunState state) } static int reset_requested; -static int shutdown_requested, shutdown_signal =3D -1; +static int shutdown_requested, shutdown_signal; static pid_t shutdown_pid; static int powerdown_requested; static int debug_requested; @@ -1629,7 +1629,7 @@ static int qemu_shutdown_requested(void) static void qemu_kill_report(void) { - if (!qtest_driver() && shutdown_signal !=3D -1) { + if (!qtest_driver() && shutdown_signal) { if (shutdown_pid =3D=3D 0) { /* This happens for eg ^C at the terminal, so it's worth * avoiding printing an odd message in that case. @@ -1643,7 +1643,7 @@ static void qemu_kill_report(void) shutdown_cmd ? shutdown_cmd : ""= ); g_free(shutdown_cmd); } - shutdown_signal =3D -1; + shutdown_signal =3D 0; } } --=20 2.9.3 From nobody Sat May 4 07:59:06 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zoho.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1493321153583353.89583719235134; Thu, 27 Apr 2017 12:25:53 -0700 (PDT) Received: from localhost ([::1]:33890 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1d3p31-0006Az-UR for importer@patchew.org; Thu, 27 Apr 2017 15:25:51 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:36525) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1d3p03-0003vW-7d for qemu-devel@nongnu.org; Thu, 27 Apr 2017 15:22:48 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1d3ozz-0006pM-66 for qemu-devel@nongnu.org; Thu, 27 Apr 2017 15:22:47 -0400 Received: from mx1.redhat.com ([209.132.183.28]:55806) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1d3ozy-0006oR-SJ for qemu-devel@nongnu.org; Thu, 27 Apr 2017 15:22:43 -0400 Received: from smtp.corp.redhat.com (int-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.12]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id B268BC04BD53; Thu, 27 Apr 2017 19:22:41 +0000 (UTC) Received: from red.redhat.com (ovpn-123-177.rdu2.redhat.com [10.10.123.177]) by smtp.corp.redhat.com (Postfix) with ESMTP id 6E45E784C6; Thu, 27 Apr 2017 19:22:28 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mx1.redhat.com B268BC04BD53 Authentication-Results: ext-mx07.extmail.prod.ext.phx2.redhat.com; dmarc=none (p=none dis=none) header.from=redhat.com Authentication-Results: ext-mx07.extmail.prod.ext.phx2.redhat.com; spf=pass smtp.mailfrom=eblake@redhat.com DKIM-Filter: OpenDKIM Filter v2.11.0 mx1.redhat.com B268BC04BD53 From: Eric Blake To: qemu-devel@nongnu.org Date: Thu, 27 Apr 2017 14:22:09 -0500 Message-Id: <20170427192211.30640-3-eblake@redhat.com> In-Reply-To: <20170427192211.30640-1-eblake@redhat.com> References: <20170427192211.30640-1-eblake@redhat.com> X-Scanned-By: MIMEDefang 2.79 on 10.5.11.12 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.31]); Thu, 27 Apr 2017 19:22:42 +0000 (UTC) X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [PATCH v3 2/4] shutdown: Prepare for use of an enum in reset/shutdown_request X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Stefano Stabellini , Eduardo Habkost , "Michael S. Tsirkin" , Juan Quintela , armbru@redhat.com, alistair.francis@xilinx.com, zhanghailiang , "open list:X86" , Anthony Perard , Paolo Bonzini , "Dr. David Alan Gilbert" , Richard Henderson Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" We want to track why a guest was shutdown; in particular, being able to tell the difference between a guest request (such as ACPI request) and host request (such as SIGINT) will prove useful to libvirt. Since all requests eventually end up changing shutdown_requested in vl.c, the logical change is to make that value track the reason, rather than its current 0/1 contents. Since command-line options control whether a reset request is turned into a shutdown request instead, the same treatment is given to reset_requested. This patch adds a QAPI enum ShutdownType that describes reasons that a shutdown can be requested, and changes qemu_system_reset() to pass the reason through, although for now it is not reported. The next patch will actually wire things up to modify events to report data based on the reason, and to pass the correct enum value in from various call-sites that can trigger a reset/shutdown. Since QAPI generates enums starting at 0, it's easier if we use a different number as our sentinel that no request has happened yet. Most of the changes are in vl.c, but xen was using things externally. Signed-off-by: Eric Blake --- v3: new patch --- qapi-schema.json | 23 +++++++++++++++++++++++ include/sysemu/sysemu.h | 2 +- vl.c | 44 ++++++++++++++++++++++++++++---------------- hw/i386/xen/xen-hvm.c | 9 ++++++--- migration/colo.c | 2 +- migration/savevm.c | 2 +- 6 files changed, 60 insertions(+), 22 deletions(-) diff --git a/qapi-schema.json b/qapi-schema.json index 01b087f..8b9819f 100644 --- a/qapi-schema.json +++ b/qapi-schema.json @@ -2304,6 +2304,29 @@ { 'command': 'system_powerdown' } ## +# @ShutdownType: +# +# Enumeration of various causes for shutdown. +# +# @host-qmp: Reaction to a QMP command, such as 'quit' +# @host-signal: Reaction to a signal, such as SIGINT +# @host-ui: Reaction to a UI event, such as closing the window +# @host-replay: The host is replaying an earlier shutdown event +# @host-error: Qemu encountered an error that prevents further use of the = guest +# @guest-shutdown: The guest requested a shutdown, such as via ACPI or +# other hardware-specific action +# @guest-reset: The guest requested a reset, and the command line +# response to a reset is to instead trigger a shutdown +# @guest-panic: The guest panicked, and the command line response to +# a panic is to trigger a shutdown +# +# Since: 2.10 +## +{ 'enum': 'ShutdownType', + 'data': [ 'host-qmp', 'host-signal', 'host-ui', 'host-replay', 'host-err= or', + 'guest-shutdown', 'guest-reset', 'guest-panic' ] } + +## # @cpu: # # This command is a nop that is only provided for the purposes of compatib= ility. diff --git a/include/sysemu/sysemu.h b/include/sysemu/sysemu.h index 16175f7..00a907f 100644 --- a/include/sysemu/sysemu.h +++ b/include/sysemu/sysemu.h @@ -65,7 +65,7 @@ bool qemu_vmstop_requested(RunState *r); int qemu_shutdown_requested_get(void); int qemu_reset_requested_get(void); void qemu_system_killed(int signal, pid_t pid); -void qemu_system_reset(bool report); +void qemu_system_reset(bool report, int reason); void qemu_system_guest_panicked(GuestPanicInformation *info); size_t qemu_target_page_size(void); diff --git a/vl.c b/vl.c index 879786a..608cc82 100644 --- a/vl.c +++ b/vl.c @@ -1597,8 +1597,8 @@ void vm_state_notify(int running, RunState state) } } -static int reset_requested; -static int shutdown_requested, shutdown_signal; +static int reset_requested =3D -1; +static int shutdown_requested =3D -1, shutdown_signal; static pid_t shutdown_pid; static int powerdown_requested; static int debug_requested; @@ -1624,7 +1624,7 @@ int qemu_reset_requested_get(void) static int qemu_shutdown_requested(void) { - return atomic_xchg(&shutdown_requested, 0); + return atomic_xchg(&shutdown_requested, -1); } static void qemu_kill_report(void) @@ -1650,11 +1650,11 @@ static void qemu_kill_report(void) static int qemu_reset_requested(void) { int r =3D reset_requested; - if (r && replay_checkpoint(CHECKPOINT_RESET_REQUESTED)) { - reset_requested =3D 0; + if (r >=3D 0 && replay_checkpoint(CHECKPOINT_RESET_REQUESTED)) { + reset_requested =3D -1; return r; } - return false; + return -1; } static int qemu_suspend_requested(void) @@ -1686,7 +1686,12 @@ static int qemu_debug_requested(void) return r; } -void qemu_system_reset(bool report) +/* + * Reset the VM. If @report is VMRESET_REPORT, issue an event, using + * the @reason interpreted as ShutdownType for details. Otherwise, + * @report is VMRESET_SILENT and @reason is ignored. + */ +void qemu_system_reset(bool report, int reason) { MachineClass *mc; @@ -1700,6 +1705,7 @@ void qemu_system_reset(bool report) qemu_devices_reset(); } if (report) { + assert(reason >=3D 0); qapi_event_send_reset(&error_abort); } cpu_synchronize_all_post_reset(); @@ -1738,9 +1744,10 @@ void qemu_system_guest_panicked(GuestPanicInformatio= n *info) void qemu_system_reset_request(void) { if (no_reboot) { - shutdown_requested =3D 1; + /* FIXME - add a parameter to allow callers to specify reason */ + shutdown_requested =3D SHUTDOWN_TYPE_GUEST_RESET; } else { - reset_requested =3D 1; + reset_requested =3D SHUTDOWN_TYPE_GUEST_RESET; } cpu_stop_current(); qemu_notify_event(); @@ -1807,7 +1814,7 @@ void qemu_system_killed(int signal, pid_t pid) /* Cannot call qemu_system_shutdown_request directly because * we are in a signal handler. */ - shutdown_requested =3D 1; + shutdown_requested =3D SHUTDOWN_TYPE_HOST_SIGNAL; qemu_notify_event(); } @@ -1815,7 +1822,8 @@ void qemu_system_shutdown_request(void) { trace_qemu_system_shutdown_request(); replay_shutdown_request(); - shutdown_requested =3D 1; + /* FIXME - add a parameter to allow callers to specify reason */ + shutdown_requested =3D SHUTDOWN_TYPE_GUEST_SHUTDOWN; qemu_notify_event(); } @@ -1846,13 +1854,16 @@ void qemu_system_debug_request(void) static bool main_loop_should_exit(void) { RunState r; + int request; + if (qemu_debug_requested()) { vm_stop(RUN_STATE_DEBUG); } if (qemu_suspend_requested()) { qemu_system_suspend(); } - if (qemu_shutdown_requested()) { + request =3D qemu_shutdown_requested(); + if (request >=3D 0) { qemu_kill_report(); qapi_event_send_shutdown(&error_abort); if (no_shutdown) { @@ -1861,9 +1872,10 @@ static bool main_loop_should_exit(void) return true; } } - if (qemu_reset_requested()) { + request =3D qemu_reset_requested(); + if (request >=3D 0) { pause_all_vcpus(); - qemu_system_reset(VMRESET_REPORT); + qemu_system_reset(VMRESET_REPORT, request); resume_all_vcpus(); if (!runstate_check(RUN_STATE_RUNNING) && !runstate_check(RUN_STATE_INMIGRATE)) { @@ -1872,7 +1884,7 @@ static bool main_loop_should_exit(void) } if (qemu_wakeup_requested()) { pause_all_vcpus(); - qemu_system_reset(VMRESET_SILENT); + qemu_system_reset(VMRESET_SILENT, -1); notifier_list_notify(&wakeup_notifiers, &wakeup_reason); wakeup_reason =3D QEMU_WAKEUP_REASON_NONE; resume_all_vcpus(); @@ -4684,7 +4696,7 @@ int main(int argc, char **argv, char **envp) reading from the other reads, because timer polling functions query clock values from the log. */ replay_checkpoint(CHECKPOINT_RESET); - qemu_system_reset(VMRESET_SILENT); + qemu_system_reset(VMRESET_SILENT, -1); register_global_state(); if (replay_mode !=3D REPLAY_MODE_NONE) { replay_vmstate_init(); diff --git a/hw/i386/xen/xen-hvm.c b/hw/i386/xen/xen-hvm.c index b1c05ff..3a6484c 100644 --- a/hw/i386/xen/xen-hvm.c +++ b/hw/i386/xen/xen-hvm.c @@ -1089,11 +1089,14 @@ static void cpu_handle_ioreq(void *opaque) * causes Xen to powerdown the domain. */ if (runstate_is_running()) { - if (qemu_shutdown_requested_get()) { + int request; + + if (qemu_shutdown_requested_get() >=3D 0) { destroy_hvm_domain(false); } - if (qemu_reset_requested_get()) { - qemu_system_reset(VMRESET_REPORT); + request =3D qemu_reset_requested_get(); + if (request >=3D 0) { + qemu_system_reset(VMRESET_REPORT, request); destroy_hvm_domain(true); } } diff --git a/migration/colo.c b/migration/colo.c index c19eb3f..17a5482 100644 --- a/migration/colo.c +++ b/migration/colo.c @@ -611,7 +611,7 @@ void *colo_process_incoming_thread(void *opaque) } qemu_mutex_lock_iothread(); - qemu_system_reset(VMRESET_SILENT); + qemu_system_reset(VMRESET_SILENT, -1); vmstate_loading =3D true; if (qemu_loadvm_state(fb) < 0) { error_report("COLO: loadvm failed"); diff --git a/migration/savevm.c b/migration/savevm.c index 03ae1bd..dcbaf00 100644 --- a/migration/savevm.c +++ b/migration/savevm.c @@ -2292,7 +2292,7 @@ int load_vmstate(const char *name) return -EINVAL; } - qemu_system_reset(VMRESET_SILENT); + qemu_system_reset(VMRESET_SILENT, -1); mis->from_src_file =3D f; aio_context_acquire(aio_context); --=20 2.9.3 From nobody Sat May 4 07:59:06 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zoho.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1493321110631835.5870057664625; Thu, 27 Apr 2017 12:25:10 -0700 (PDT) Received: from localhost ([::1]:33883 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1d3p2L-0005fJ-2d for importer@patchew.org; Thu, 27 Apr 2017 15:25:09 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:36751) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1d3p0n-0004nD-Qw for qemu-devel@nongnu.org; Thu, 27 Apr 2017 15:23:38 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1d3p0i-00077G-2E for qemu-devel@nongnu.org; Thu, 27 Apr 2017 15:23:33 -0400 Received: from mx1.redhat.com ([209.132.183.28]:36414) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1d3p0N-0006t0-1j; Thu, 27 Apr 2017 15:23:07 -0400 Received: from smtp.corp.redhat.com (int-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.12]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 8B8A1A08F9; Thu, 27 Apr 2017 19:23:04 +0000 (UTC) Received: from red.redhat.com (ovpn-123-177.rdu2.redhat.com [10.10.123.177]) by smtp.corp.redhat.com (Postfix) with ESMTP id 42A4C784C3; Thu, 27 Apr 2017 19:22:42 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mx1.redhat.com 8B8A1A08F9 Authentication-Results: ext-mx10.extmail.prod.ext.phx2.redhat.com; dmarc=none (p=none dis=none) header.from=redhat.com Authentication-Results: ext-mx10.extmail.prod.ext.phx2.redhat.com; spf=pass smtp.mailfrom=eblake@redhat.com DKIM-Filter: OpenDKIM Filter v2.11.0 mx1.redhat.com 8B8A1A08F9 From: Eric Blake To: qemu-devel@nongnu.org Date: Thu, 27 Apr 2017 14:22:10 -0500 Message-Id: <20170427192211.30640-4-eblake@redhat.com> In-Reply-To: <20170427192211.30640-1-eblake@redhat.com> References: <20170427192211.30640-1-eblake@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.12 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.39]); Thu, 27 Apr 2017 19:23:06 +0000 (UTC) Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [PATCH v3 3/4] shutdown: Add source information to SHUTDOWN and RESET X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Peter Maydell , "open list:Overall" , "Michael S. Tsirkin" , Mark Cave-Ayland , Alexander Graf , Yongbok Kim , Gerd Hoffmann , "Edgar E. Iglesias" , Rob Herring , Stefano Stabellini , "open list:Block layer core" , Magnus Damm , armbru@redhat.com, Christian Borntraeger , Anthony Perard , "open list:X86" , Richard Henderson , Artyom Tarasenko , Eduardo Habkost , Stefan Weil , alistair.francis@xilinx.com, "open list:Calxeda Highbank" , Jan Kiszka , Igor Mammedov , Cornelia Huck , David Gibson , Kevin Wolf , Paul Burton , Max Filippov , Marcelo Tosatti , Max Reitz , Michael Walle , "open list:New World" , Paolo Bonzini , Aurelien Jarno Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Type: text/plain; charset="utf-8" Libvirt would like to be able to distinguish between a SHUTDOWN event triggered solely by guest request and one triggered by a SIGTERM or other action on the host. While qemu_kill_report() is already able to tell whether a shutdown was triggered by a host signal (but NOT by a host UI event, such as clicking the X on the window), that information was then lost after being printed to stderr. The previous patch prepped things to use an enum internally; now it's time to wire it up through all callers, and to extend the SHUTDOWN and RESET events to report the details. Enhance the shutdown request path to take a parameter of which way it is being triggered, and update ALL callers. It would have been less churn to keep the common case with no arguments as meaning guest-triggered, and only modified the host-triggered code paths, via a wrapper function, but then we'd still have to audit that I didn't miss any host-triggered spots; changing the signature forces us to double-check that I correctly categorized all callers. Since command line options can change whether a guest reset request causes an actual reset vs. a shutdown, it's easy to also add the information to the RESET event, even though libvirt has not yet expressed a need to know that. For the moment, we keep the enum ShutdownType for internal use only, and merely expose a single boolean of 'guest':true|false to the QMP client; this is because we don't yet have evidence that the further distinctions will be useful, or whether the addition of new enum members would cause problems to clients coded to an older version of the enum. Update expected iotest outputs to match the new data. Here is output from 'virsh qemu-monitor-event --loop' with the patch installed: event SHUTDOWN at 1492639680.731251 for domain fedora_13: {"guest":true} event STOP at 1492639680.732116 for domain fedora_13: event SHUTDOWN at 1492639680.732830 for domain fedora_13: {"guest":false} Note that libvirt runs qemu with -no-quit: the first SHUTDOWN event was triggered by an action I took directly in the guest (shutdown -h), at which point qemu stops the vcpus and waits for libvirt to do any final cleanups; the second SHUTDOWN event is the result of libvirt sending SIGTERM now that it has completed cleanup. The replay driver needs a followup patch if we want to be able to faithfully replay the difference between a host- and guest-initiated shutdown (for now, the replayed event is always attributed to host). See also https://bugzilla.redhat.com/1384007 Signed-off-by: Eric Blake --- v3: retitle again, fix qemu-iotests, use enum rather than raw bool in all callers v2: retitle (was "event: Add signal information to SHUTDOWN"), completely rework to post bool based on whether it is guest-initiated v1: initial submission, exposing just Unix signals from host --- qapi/event.json | 17 +++++++++++++---- include/sysemu/sysemu.h | 4 ++-- vl.c | 20 ++++++++++---------- hw/acpi/core.c | 4 ++-- hw/arm/highbank.c | 4 ++-- hw/arm/integratorcp.c | 2 +- hw/arm/musicpal.c | 2 +- hw/arm/omap1.c | 6 +++--- hw/arm/omap2.c | 2 +- hw/arm/spitz.c | 2 +- hw/arm/stellaris.c | 2 +- hw/arm/tosa.c | 2 +- hw/i386/pc.c | 2 +- hw/i386/xen/xen-hvm.c | 2 +- hw/input/pckbd.c | 4 ++-- hw/ipmi/ipmi.c | 4 ++-- hw/isa/lpc_ich9.c | 2 +- hw/mips/boston.c | 2 +- hw/mips/mips_malta.c | 2 +- hw/mips/mips_r4k.c | 4 ++-- hw/misc/arm_sysctl.c | 8 ++++---- hw/misc/cbus.c | 2 +- hw/misc/macio/cuda.c | 4 ++-- hw/misc/slavio_misc.c | 4 ++-- hw/misc/zynq_slcr.c | 2 +- hw/pci-host/apb.c | 4 ++-- hw/pci-host/bonito.c | 2 +- hw/pci-host/piix.c | 2 +- hw/ppc/e500.c | 2 +- hw/ppc/mpc8544_guts.c | 2 +- hw/ppc/ppc.c | 2 +- hw/ppc/ppc405_uc.c | 2 +- hw/ppc/spapr_hcall.c | 2 +- hw/ppc/spapr_rtas.c | 4 ++-- hw/s390x/ipl.c | 2 +- hw/sh4/r2d.c | 2 +- hw/timer/etraxfs_timer.c | 2 +- hw/timer/m48t59.c | 4 ++-- hw/timer/milkymist-sysctl.c | 4 ++-- hw/timer/pxa2xx_timer.c | 2 +- hw/watchdog/watchdog.c | 2 +- hw/xenpv/xen_domainbuild.c | 2 +- hw/xtensa/xtfpga.c | 2 +- kvm-all.c | 6 +++--- os-win32.c | 2 +- qmp.c | 4 ++-- replay/replay.c | 5 ++++- target/alpha/sys_helper.c | 4 ++-- target/arm/psci.c | 4 ++-- target/i386/excp_helper.c | 2 +- target/i386/hax-all.c | 6 +++--- target/i386/helper.c | 2 +- target/i386/kvm.c | 2 +- target/s390x/helper.c | 2 +- target/s390x/kvm.c | 4 ++-- target/s390x/misc_helper.c | 4 ++-- target/sparc/int32_helper.c | 2 +- ui/sdl.c | 2 +- ui/sdl2.c | 4 ++-- tests/qemu-iotests/071.out | 4 ++-- tests/qemu-iotests/081.out | 2 +- tests/qemu-iotests/087.out | 12 ++++++------ tests/qemu-iotests/094.out | 2 +- tests/qemu-iotests/117.out | 2 +- tests/qemu-iotests/119.out | 2 +- tests/qemu-iotests/120.out | 2 +- tests/qemu-iotests/140.out | 2 +- tests/qemu-iotests/143.out | 2 +- tests/qemu-iotests/156.out | 2 +- trace-events | 2 +- ui/cocoa.m | 2 +- 71 files changed, 128 insertions(+), 116 deletions(-) diff --git a/qapi/event.json b/qapi/event.json index e80f3f4..6d22b02 100644 --- a/qapi/event.json +++ b/qapi/event.json @@ -10,6 +10,10 @@ # Emitted when the virtual machine has shut down, indicating that qemu is # about to exit. # +# @guest: If true, the shutdown was triggered by a guest request (such as +# a guest-initiated ACPI shutdown request or other hardware-specific actio= n) +# rather than a host request (such as sending qemu a SIGINT). (since 2.10) +# # Note: If the command-line option "-no-shutdown" has been specified, qemu= will # not exit, and a STOP event will eventually follow the SHUTDOWN event # @@ -17,11 +21,11 @@ # # Example: # -# <- { "event": "SHUTDOWN", +# <- { "event": "SHUTDOWN", "data": { "guest": true }, # "timestamp": { "seconds": 1267040730, "microseconds": 682951 } } # ## -{ 'event': 'SHUTDOWN' } +{ 'event': 'SHUTDOWN', 'data': { 'guest': 'bool' } } ## # @POWERDOWN: @@ -44,15 +48,20 @@ # # Emitted when the virtual machine is reset # +# @guest: If true, the reset was triggered by a guest request (such as +# a guest-initiated ACPI reboot request or other hardware-specific action) +# rather than a host request (such as the QMP command system_reset). +# (since 2.10) +# # Since: 0.12.0 # # Example: # -# <- { "event": "RESET", +# <- { "event": "RESET", "data": { "guest": false }, # "timestamp": { "seconds": 1267041653, "microseconds": 9518 } } # ## -{ 'event': 'RESET' } +{ 'event': 'RESET', 'data': { 'guest': 'bool' } } ## # @STOP: diff --git a/include/sysemu/sysemu.h b/include/sysemu/sysemu.h index 00a907f..597fb08 100644 --- a/include/sysemu/sysemu.h +++ b/include/sysemu/sysemu.h @@ -49,13 +49,13 @@ typedef enum WakeupReason { QEMU_WAKEUP_REASON_OTHER, } WakeupReason; -void qemu_system_reset_request(void); +void qemu_system_reset_request(ShutdownType reason); void qemu_system_suspend_request(void); void qemu_register_suspend_notifier(Notifier *notifier); void qemu_system_wakeup_request(WakeupReason reason); void qemu_system_wakeup_enable(WakeupReason reason, bool enabled); void qemu_register_wakeup_notifier(Notifier *notifier); -void qemu_system_shutdown_request(void); +void qemu_system_shutdown_request(ShutdownType reason); void qemu_system_powerdown_request(void); void qemu_register_powerdown_notifier(Notifier *notifier); void qemu_system_debug_request(void); diff --git a/vl.c b/vl.c index 608cc82..4f9c5bf 100644 --- a/vl.c +++ b/vl.c @@ -1706,7 +1706,8 @@ void qemu_system_reset(bool report, int reason) } if (report) { assert(reason >=3D 0); - qapi_event_send_reset(&error_abort); + qapi_event_send_reset(reason >=3D SHUTDOWN_TYPE_GUEST_SHUTDOWN, + &error_abort); } cpu_synchronize_all_post_reset(); } @@ -1724,7 +1725,7 @@ void qemu_system_guest_panicked(GuestPanicInformation= *info) if (!no_shutdown) { qapi_event_send_guest_panicked(GUEST_PANIC_ACTION_POWEROFF, !!info, info, &error_abort); - qemu_system_shutdown_request(); + qemu_system_shutdown_request(SHUTDOWN_TYPE_GUEST_PANIC); } if (info) { @@ -1741,11 +1742,10 @@ void qemu_system_guest_panicked(GuestPanicInformati= on *info) } } -void qemu_system_reset_request(void) +void qemu_system_reset_request(ShutdownType reason) { if (no_reboot) { - /* FIXME - add a parameter to allow callers to specify reason */ - shutdown_requested =3D SHUTDOWN_TYPE_GUEST_RESET; + shutdown_requested =3D reason; } else { reset_requested =3D SHUTDOWN_TYPE_GUEST_RESET; } @@ -1818,12 +1818,11 @@ void qemu_system_killed(int signal, pid_t pid) qemu_notify_event(); } -void qemu_system_shutdown_request(void) +void qemu_system_shutdown_request(ShutdownType reason) { - trace_qemu_system_shutdown_request(); + trace_qemu_system_shutdown_request(reason); replay_shutdown_request(); - /* FIXME - add a parameter to allow callers to specify reason */ - shutdown_requested =3D SHUTDOWN_TYPE_GUEST_SHUTDOWN; + shutdown_requested =3D reason; qemu_notify_event(); } @@ -1865,7 +1864,8 @@ static bool main_loop_should_exit(void) request =3D qemu_shutdown_requested(); if (request >=3D 0) { qemu_kill_report(); - qapi_event_send_shutdown(&error_abort); + qapi_event_send_shutdown(request >=3D SHUTDOWN_TYPE_GUEST_SHUTDOWN, + &error_abort); if (no_shutdown) { vm_stop(RUN_STATE_SHUTDOWN); } else { diff --git a/hw/acpi/core.c b/hw/acpi/core.c index e890a5d..9200d5e 100644 --- a/hw/acpi/core.c +++ b/hw/acpi/core.c @@ -561,7 +561,7 @@ static void acpi_pm1_cnt_write(ACPIREGS *ar, uint16_t v= al) uint16_t sus_typ =3D (val >> 10) & 7; switch(sus_typ) { case 0: /* soft power off */ - qemu_system_shutdown_request(); + qemu_system_shutdown_request(SHUTDOWN_TYPE_GUEST_SHUTDOWN); break; case 1: qemu_system_suspend_request(); @@ -569,7 +569,7 @@ static void acpi_pm1_cnt_write(ACPIREGS *ar, uint16_t v= al) default: if (sus_typ =3D=3D ar->pm1.cnt.s4_val) { /* S4 request */ qapi_event_send_suspend_disk(&error_abort); - qemu_system_shutdown_request(); + qemu_system_shutdown_request(SHUTDOWN_TYPE_GUEST_SHUTDOWN); } break; } diff --git a/hw/arm/highbank.c b/hw/arm/highbank.c index 0a4508c..de1c69a 100644 --- a/hw/arm/highbank.c +++ b/hw/arm/highbank.c @@ -108,9 +108,9 @@ static void hb_regs_write(void *opaque, hwaddr offset, if (offset =3D=3D 0xf00) { if (value =3D=3D 1 || value =3D=3D 2) { - qemu_system_reset_request(); + qemu_system_reset_request(SHUTDOWN_TYPE_GUEST_RESET); } else if (value =3D=3D 3) { - qemu_system_shutdown_request(); + qemu_system_shutdown_request(SHUTDOWN_TYPE_GUEST_SHUTDOWN); } } diff --git a/hw/arm/integratorcp.c b/hw/arm/integratorcp.c index 5610ffc..4022970 100644 --- a/hw/arm/integratorcp.c +++ b/hw/arm/integratorcp.c @@ -158,7 +158,7 @@ static void integratorcm_do_remap(IntegratorCMState *s) static void integratorcm_set_ctrl(IntegratorCMState *s, uint32_t value) { if (value & 8) { - qemu_system_reset_request(); + qemu_system_reset_request(SHUTDOWN_TYPE_GUEST_RESET); } if ((s->cm_ctrl ^ value) & 1) { /* (value & 1) !=3D 0 means the green "MISC LED" is lit. diff --git a/hw/arm/musicpal.c b/hw/arm/musicpal.c index cbbca4e..84434f9 100644 --- a/hw/arm/musicpal.c +++ b/hw/arm/musicpal.c @@ -898,7 +898,7 @@ static void mv88w8618_pit_write(void *opaque, hwaddr of= fset, case MP_BOARD_RESET: if (value =3D=3D MP_BOARD_RESET_MAGIC) { - qemu_system_reset_request(); + qemu_system_reset_request(SHUTDOWN_TYPE_GUEST_RESET); } break; } diff --git a/hw/arm/omap1.c b/hw/arm/omap1.c index b3cf0ec..0bb698e 100644 --- a/hw/arm/omap1.c +++ b/hw/arm/omap1.c @@ -355,7 +355,7 @@ static void omap_wd_timer_write(void *opaque, hwaddr ad= dr, /* XXX: on T|E hardware somehow this has no effect, * on Zire 71 it works as specified. */ s->reset =3D 1; - qemu_system_reset_request(); + qemu_system_reset_request(SHUTDOWN_TYPE_GUEST_RESET); } } s->last_wr =3D value & 0xff; @@ -1546,7 +1546,7 @@ static inline void omap_clkm_idlect1_update(struct om= ap_mpu_state_s *s, cpu_interrupt(CPU(s->cpu), CPU_INTERRUPT_HALT); } if (!(value & (1 << 10))) /* WKUP_MODE */ - qemu_system_shutdown_request(); /* XXX: disable wakeup from IRQ */ + qemu_system_shutdown_request(SHUTDOWN_TYPE_GUEST_SHUTDOWN); /* XXX= : disable wakeup from IRQ */ #define SET_CANIDLE(clock, bit) \ if (diff & (1 << bit)) { \ @@ -1693,7 +1693,7 @@ static void omap_clkm_write(void *opaque, hwaddr addr, diff =3D s->clkm.arm_rstct1 ^ value; s->clkm.arm_rstct1 =3D value & 0x0007; if (value & 9) { - qemu_system_reset_request(); + qemu_system_reset_request(SHUTDOWN_TYPE_GUEST_RESET); s->clkm.cold_start =3D 0xa; } if (diff & ~value & 4) { /* DSP_RST */ diff --git a/hw/arm/omap2.c b/hw/arm/omap2.c index cf1b4ba..0edc5ac 100644 --- a/hw/arm/omap2.c +++ b/hw/arm/omap2.c @@ -1610,7 +1610,7 @@ static void omap_prcm_write(void *opaque, hwaddr addr, case 0x450: /* RM_RSTCTRL_WKUP */ /* TODO: reset */ if (value & 2) - qemu_system_reset_request(); + qemu_system_reset_request(SHUTDOWN_TYPE_GUEST_RESET); break; case 0x454: /* RM_RSTTIME_WKUP */ s->rsttime_wkup =3D value & 0x1fff; diff --git a/hw/arm/spitz.c b/hw/arm/spitz.c index fe2d5a7..967e837 100644 --- a/hw/arm/spitz.c +++ b/hw/arm/spitz.c @@ -848,7 +848,7 @@ static void spitz_lcd_hsync_handler(void *opaque, int l= ine, int level) static void spitz_reset(void *opaque, int line, int level) { if (level) { - qemu_system_reset_request(); + qemu_system_reset_request(SHUTDOWN_TYPE_GUEST_RESET); } } diff --git a/hw/arm/stellaris.c b/hw/arm/stellaris.c index ea7a809..90de632 100644 --- a/hw/arm/stellaris.c +++ b/hw/arm/stellaris.c @@ -1197,7 +1197,7 @@ static void do_sys_reset(void *opaque, int n, int level) { if (level) { - qemu_system_reset_request(); + qemu_system_reset_request(SHUTDOWN_TYPE_GUEST_RESET); } } diff --git a/hw/arm/tosa.c b/hw/arm/tosa.c index 9f58a23..c82ef6f 100644 --- a/hw/arm/tosa.c +++ b/hw/arm/tosa.c @@ -90,7 +90,7 @@ static void tosa_out_switch(void *opaque, int line, int l= evel) static void tosa_reset(void *opaque, int line, int level) { if (level) { - qemu_system_reset_request(); + qemu_system_reset_request(SHUTDOWN_TYPE_GUEST_RESET); } } diff --git a/hw/i386/pc.c b/hw/i386/pc.c index f3b372a..d413efc 100644 --- a/hw/i386/pc.c +++ b/hw/i386/pc.c @@ -519,7 +519,7 @@ static void port92_write(void *opaque, hwaddr addr, uin= t64_t val, s->outport =3D val; qemu_set_irq(s->a20_out, (val >> 1) & 1); if ((val & 1) && !(oldval & 1)) { - qemu_system_reset_request(); + qemu_system_reset_request(SHUTDOWN_TYPE_GUEST_RESET); } } diff --git a/hw/i386/xen/xen-hvm.c b/hw/i386/xen/xen-hvm.c index 3a6484c..9723594 100644 --- a/hw/i386/xen/xen-hvm.c +++ b/hw/i386/xen/xen-hvm.c @@ -1398,7 +1398,7 @@ void xen_shutdown_fatal_error(const char *fmt, ...) va_end(ap); fprintf(stderr, "Will destroy the domain.\n"); /* destroy the domain */ - qemu_system_shutdown_request(); + qemu_system_shutdown_request(SHUTDOWN_TYPE_HOST_ERROR); } void xen_hvm_modified_memory(ram_addr_t start, ram_addr_t length) diff --git a/hw/input/pckbd.c b/hw/input/pckbd.c index d414288..471782c 100644 --- a/hw/input/pckbd.c +++ b/hw/input/pckbd.c @@ -226,7 +226,7 @@ static void outport_write(KBDState *s, uint32_t val) s->outport =3D val; qemu_set_irq(s->a20_out, (val >> 1) & 1); if (!(val & 1)) { - qemu_system_reset_request(); + qemu_system_reset_request(SHUTDOWN_TYPE_GUEST_RESET); } } @@ -301,7 +301,7 @@ static void kbd_write_command(void *opaque, hwaddr addr, s->outport &=3D ~KBD_OUT_A20; break; case KBD_CCMD_RESET: - qemu_system_reset_request(); + qemu_system_reset_request(SHUTDOWN_TYPE_GUEST_RESET); break; case KBD_CCMD_NO_OP: /* ignore that */ diff --git a/hw/ipmi/ipmi.c b/hw/ipmi/ipmi.c index 5cf1caa..b40c474 100644 --- a/hw/ipmi/ipmi.c +++ b/hw/ipmi/ipmi.c @@ -44,14 +44,14 @@ static int ipmi_do_hw_op(IPMIInterface *s, enum ipmi_op= op, int checkonly) if (checkonly) { return 0; } - qemu_system_reset_request(); + qemu_system_reset_request(SHUTDOWN_TYPE_GUEST_RESET); return 0; case IPMI_POWEROFF_CHASSIS: if (checkonly) { return 0; } - qemu_system_shutdown_request(); + qemu_system_shutdown_request(SHUTDOWN_TYPE_GUEST_SHUTDOWN); return 0; case IPMI_SEND_NMI: diff --git a/hw/isa/lpc_ich9.c b/hw/isa/lpc_ich9.c index a0866c3..2031f4f 100644 --- a/hw/isa/lpc_ich9.c +++ b/hw/isa/lpc_ich9.c @@ -606,7 +606,7 @@ static void ich9_rst_cnt_write(void *opaque, hwaddr add= r, uint64_t val, ICH9LPCState *lpc =3D opaque; if (val & 4) { - qemu_system_reset_request(); + qemu_system_reset_request(SHUTDOWN_TYPE_GUEST_RESET); return; } lpc->rst_cnt =3D val & 0xA; /* keep FULL_RST (bit 3) and SYS_RST (bit = 1) */ diff --git a/hw/mips/boston.c b/hw/mips/boston.c index 83f7b82..0f898ae 100644 --- a/hw/mips/boston.c +++ b/hw/mips/boston.c @@ -232,7 +232,7 @@ static void boston_platreg_write(void *opaque, hwaddr a= ddr, break; case PLAT_SOFTRST_CTL: if (val & PLAT_SOFTRST_CTL_SYSRESET) { - qemu_system_reset_request(); + qemu_system_reset_request(SHUTDOWN_TYPE_GUEST_RESET); } break; default: diff --git a/hw/mips/mips_malta.c b/hw/mips/mips_malta.c index 5dd177e..d50760e 100644 --- a/hw/mips/mips_malta.c +++ b/hw/mips/mips_malta.c @@ -470,7 +470,7 @@ static void malta_fpga_write(void *opaque, hwaddr addr, /* SOFTRES Register */ case 0x00500: if (val =3D=3D 0x42) - qemu_system_reset_request (); + qemu_system_reset_request(SHUTDOWN_TYPE_GUEST_RESET); break; /* BRKRES Register */ diff --git a/hw/mips/mips_r4k.c b/hw/mips/mips_r4k.c index 748586e..cb08a6a 100644 --- a/hw/mips/mips_r4k.c +++ b/hw/mips/mips_r4k.c @@ -53,9 +53,9 @@ static void mips_qemu_write (void *opaque, hwaddr addr, uint64_t val, unsigned size) { if ((addr & 0xffff) =3D=3D 0 && val =3D=3D 42) - qemu_system_reset_request (); + qemu_system_reset_request(SHUTDOWN_TYPE_GUEST_RESET); else if ((addr & 0xffff) =3D=3D 4 && val =3D=3D 42) - qemu_system_shutdown_request (); + qemu_system_shutdown_request(SHUTDOWN_TYPE_GUEST_SHUTDOWN); } static uint64_t mips_qemu_read (void *opaque, hwaddr addr, diff --git a/hw/misc/arm_sysctl.c b/hw/misc/arm_sysctl.c index 8524008..91f112c 100644 --- a/hw/misc/arm_sysctl.c +++ b/hw/misc/arm_sysctl.c @@ -351,13 +351,13 @@ static bool vexpress_cfgctrl_write(arm_sysctl_state *= s, unsigned int dcc, break; case SYS_CFG_SHUTDOWN: if (site =3D=3D SYS_CFG_SITE_MB && device =3D=3D 0) { - qemu_system_shutdown_request(); + qemu_system_shutdown_request(SHUTDOWN_TYPE_GUEST_SHUTDOWN); return true; } break; case SYS_CFG_REBOOT: if (site =3D=3D SYS_CFG_SITE_MB && device =3D=3D 0) { - qemu_system_reset_request(); + qemu_system_reset_request(SHUTDOWN_TYPE_GUEST_RESET); return true; } break; @@ -429,7 +429,7 @@ static void arm_sysctl_write(void *opaque, hwaddr offse= t, if (s->lockval =3D=3D LOCK_VALUE) { s->resetlevel =3D val; if (val & 0x100) { - qemu_system_reset_request(); + qemu_system_reset_request(SHUTDOWN_TYPE_GUEST_RESET); } } break; @@ -438,7 +438,7 @@ static void arm_sysctl_write(void *opaque, hwaddr offse= t, if (s->lockval =3D=3D LOCK_VALUE) { s->resetlevel =3D val; if (val & 0x04) { - qemu_system_reset_request(); + qemu_system_reset_request(SHUTDOWN_TYPE_GUEST_RESET); } } break; diff --git a/hw/misc/cbus.c b/hw/misc/cbus.c index 0c207e3..438b5fc 100644 --- a/hw/misc/cbus.c +++ b/hw/misc/cbus.c @@ -356,7 +356,7 @@ static inline void retu_write(CBusRetu *s, int reg, uin= t16_t val) case RETU_REG_WATCHDOG: if (val =3D=3D 0 && (s->cc[0] & 2)) - qemu_system_shutdown_request(); + qemu_system_shutdown_request(SHUTDOWN_TYPE_GUEST_SHUTDOWN); break; case RETU_REG_TXCR: diff --git a/hw/misc/macio/cuda.c b/hw/misc/macio/cuda.c index 05c02fb..8744caf 100644 --- a/hw/misc/macio/cuda.c +++ b/hw/misc/macio/cuda.c @@ -612,7 +612,7 @@ static bool cuda_cmd_powerdown(CUDAState *s, return false; } - qemu_system_shutdown_request(); + qemu_system_shutdown_request(SHUTDOWN_TYPE_GUEST_SHUTDOWN); return true; } @@ -624,7 +624,7 @@ static bool cuda_cmd_reset_system(CUDAState *s, return false; } - qemu_system_reset_request(); + qemu_system_reset_request(SHUTDOWN_TYPE_GUEST_RESET); return true; } diff --git a/hw/misc/slavio_misc.c b/hw/misc/slavio_misc.c index edd5de0..8614fcf 100644 --- a/hw/misc/slavio_misc.c +++ b/hw/misc/slavio_misc.c @@ -258,7 +258,7 @@ static void slavio_aux2_mem_writeb(void *opaque, hwaddr= addr, val &=3D AUX2_PWROFF; s->aux2 =3D val; if (val & AUX2_PWROFF) - qemu_system_shutdown_request(); + qemu_system_shutdown_request(SHUTDOWN_TYPE_GUEST_SHUTDOWN); slavio_misc_update_irq(s); } @@ -338,7 +338,7 @@ static void slavio_sysctrl_mem_writel(void *opaque, hwa= ddr addr, case 0: if (val & SYS_RESET) { s->sysctrl =3D SYS_RESETSTAT; - qemu_system_reset_request(); + qemu_system_reset_request(SHUTDOWN_TYPE_GUEST_RESET); } break; default: diff --git a/hw/misc/zynq_slcr.c b/hw/misc/zynq_slcr.c index 7891219..f1479c8 100644 --- a/hw/misc/zynq_slcr.c +++ b/hw/misc/zynq_slcr.c @@ -405,7 +405,7 @@ static void zynq_slcr_write(void *opaque, hwaddr offset, switch (offset) { case PSS_RST_CTRL: if (val & R_PSS_RST_CTRL_SOFT_RST) { - qemu_system_reset_request(); + qemu_system_reset_request(SHUTDOWN_TYPE_GUEST_RESET); } break; } diff --git a/hw/pci-host/apb.c b/hw/pci-host/apb.c index 653e711..e37d01a 100644 --- a/hw/pci-host/apb.c +++ b/hw/pci-host/apb.c @@ -482,9 +482,9 @@ static void apb_config_writel (void *opaque, hwaddr add= r, s->reset_control |=3D val & RESET_WMASK; if (val & SOFT_POR) { s->nr_resets =3D 0; - qemu_system_reset_request(); + qemu_system_reset_request(SHUTDOWN_TYPE_GUEST_RESET); } else if (val & SOFT_XIR) { - qemu_system_reset_request(); + qemu_system_reset_request(SHUTDOWN_TYPE_GUEST_RESET); } } break; diff --git a/hw/pci-host/bonito.c b/hw/pci-host/bonito.c index 1999ece..759b932 100644 --- a/hw/pci-host/bonito.c +++ b/hw/pci-host/bonito.c @@ -269,7 +269,7 @@ static void bonito_writel(void *opaque, hwaddr addr, } s->regs[saddr] =3D val; if (reset) { - qemu_system_reset_request(); + qemu_system_reset_request(SHUTDOWN_TYPE_GUEST_RESET); } break; case BONITO_INTENSET: diff --git a/hw/pci-host/piix.c b/hw/pci-host/piix.c index f9218aa..1e316e6 100644 --- a/hw/pci-host/piix.c +++ b/hw/pci-host/piix.c @@ -638,7 +638,7 @@ static void rcr_write(void *opaque, hwaddr addr, uint64= _t val, unsigned len) PIIX3State *d =3D opaque; if (val & 4) { - qemu_system_reset_request(); + qemu_system_reset_request(SHUTDOWN_TYPE_GUEST_RESET); return; } d->rcr =3D val & 2; /* keep System Reset type only */ diff --git a/hw/ppc/e500.c b/hw/ppc/e500.c index f7df238..97fe145 100644 --- a/hw/ppc/e500.c +++ b/hw/ppc/e500.c @@ -774,7 +774,7 @@ static qemu_irq *ppce500_init_mpic(MachineState *machin= e, PPCE500Params *params, static void ppce500_power_off(void *opaque, int line, int on) { if (on) { - qemu_system_shutdown_request(); + qemu_system_shutdown_request(SHUTDOWN_TYPE_GUEST_SHUTDOWN); } } diff --git a/hw/ppc/mpc8544_guts.c b/hw/ppc/mpc8544_guts.c index ba69178..6313f93 100644 --- a/hw/ppc/mpc8544_guts.c +++ b/hw/ppc/mpc8544_guts.c @@ -98,7 +98,7 @@ static void mpc8544_guts_write(void *opaque, hwaddr addr, switch (addr) { case MPC8544_GUTS_ADDR_RSTCR: if (value & MPC8544_GUTS_RSTCR_RESET) { - qemu_system_reset_request(); + qemu_system_reset_request(SHUTDOWN_TYPE_GUEST_RESET); } break; default: diff --git a/hw/ppc/ppc.c b/hw/ppc/ppc.c index 5f93083..51b8bae 100644 --- a/hw/ppc/ppc.c +++ b/hw/ppc/ppc.c @@ -412,7 +412,7 @@ static void ppce500_set_irq(void *opaque, int pin, int = level) if (level) { LOG_IRQ("%s: reset the PowerPC system\n", __func__); - qemu_system_reset_request(); + qemu_system_reset_request(SHUTDOWN_TYPE_GUEST_RESET); } break; case PPCE500_INPUT_RESET_CORE: diff --git a/hw/ppc/ppc405_uc.c b/hw/ppc/ppc405_uc.c index d5df94a..50c0cf1 100644 --- a/hw/ppc/ppc405_uc.c +++ b/hw/ppc/ppc405_uc.c @@ -1807,7 +1807,7 @@ void ppc40x_chip_reset(PowerPCCPU *cpu) void ppc40x_system_reset(PowerPCCPU *cpu) { printf("Reset PowerPC system\n"); - qemu_system_reset_request(); + qemu_system_reset_request(SHUTDOWN_TYPE_GUEST_RESET); } void store_40x_dbcr0 (CPUPPCState *env, uint32_t val) diff --git a/hw/ppc/spapr_hcall.c b/hw/ppc/spapr_hcall.c index 9f18f75..e797340 100644 --- a/hw/ppc/spapr_hcall.c +++ b/hw/ppc/spapr_hcall.c @@ -1166,7 +1166,7 @@ static target_ulong h_client_architecture_support(Pow= erPCCPU *cpu, spapr_ovec_cleanup(ov5_updates); if (spapr->cas_reboot) { - qemu_system_reset_request(); + qemu_system_reset_request(SHUTDOWN_TYPE_GUEST_RESET); } else { /* If ppc_spapr_reset() did not set up a HPT but one is necessary * (because the guest isn't going to use radix) then set it up her= e. */ diff --git a/hw/ppc/spapr_rtas.c b/hw/ppc/spapr_rtas.c index 619f32c..6e30a53 100644 --- a/hw/ppc/spapr_rtas.c +++ b/hw/ppc/spapr_rtas.c @@ -110,7 +110,7 @@ static void rtas_power_off(PowerPCCPU *cpu, sPAPRMachin= eState *spapr, rtas_st(rets, 0, RTAS_OUT_PARAM_ERROR); return; } - qemu_system_shutdown_request(); + qemu_system_shutdown_request(SHUTDOWN_TYPE_GUEST_SHUTDOWN); cpu_stop_current(); rtas_st(rets, 0, RTAS_OUT_SUCCESS); } @@ -124,7 +124,7 @@ static void rtas_system_reboot(PowerPCCPU *cpu, sPAPRMa= chineState *spapr, rtas_st(rets, 0, RTAS_OUT_PARAM_ERROR); return; } - qemu_system_reset_request(); + qemu_system_reset_request(SHUTDOWN_TYPE_GUEST_RESET); rtas_st(rets, 0, RTAS_OUT_SUCCESS); } diff --git a/hw/s390x/ipl.c b/hw/s390x/ipl.c index 7978c7d..2df3193 100644 --- a/hw/s390x/ipl.c +++ b/hw/s390x/ipl.c @@ -363,7 +363,7 @@ void s390_reipl_request(void) S390IPLState *ipl =3D get_ipl_device(); ipl->reipl_requested =3D true; - qemu_system_reset_request(); + qemu_system_reset_request(SHUTDOWN_TYPE_GUEST_RESET); } void s390_ipl_prepare_cpu(S390CPU *cpu) diff --git a/hw/sh4/r2d.c b/hw/sh4/r2d.c index 8f520ce..94319d4 100644 --- a/hw/sh4/r2d.c +++ b/hw/sh4/r2d.c @@ -164,7 +164,7 @@ r2d_fpga_write(void *opaque, hwaddr addr, uint64_t valu= e, unsigned int size) break; case PA_POWOFF: if (value & 1) { - qemu_system_shutdown_request(); + qemu_system_shutdown_request(SHUTDOWN_TYPE_GUEST_SHUTDOWN); } break; case PA_VERREG: diff --git a/hw/timer/etraxfs_timer.c b/hw/timer/etraxfs_timer.c index 8e18236..534f2bd 100644 --- a/hw/timer/etraxfs_timer.c +++ b/hw/timer/etraxfs_timer.c @@ -207,7 +207,7 @@ static void watchdog_hit(void *opaque) qemu_irq_raise(t->nmi); } else - qemu_system_reset_request(); + qemu_system_reset_request(SHUTDOWN_TYPE_GUEST_RESET); t->wd_hits++; } diff --git a/hw/timer/m48t59.c b/hw/timer/m48t59.c index 474981a..2189846 100644 --- a/hw/timer/m48t59.c +++ b/hw/timer/m48t59.c @@ -1,7 +1,7 @@ /* * QEMU M48T59 and M48T08 NVRAM emulation for PPC PREP and Sparc platforms * - * Copyright (c) 2003-2005, 2007 Jocelyn Mayer + * Copyright (c) 2003-2005, 2007, 2017 Jocelyn Mayer * Copyright (c) 2013 Herv=C3=A9 Poussineau * * Permission is hereby granted, free of charge, to any person obtaining a= copy @@ -159,7 +159,7 @@ static void watchdog_cb (void *opaque) NVRAM->buffer[0x1FF7] =3D 0x00; NVRAM->buffer[0x1FFC] &=3D ~0x40; /* May it be a hw CPU Reset instead ? */ - qemu_system_reset_request(); + qemu_system_reset_request(SHUTDOWN_TYPE_GUEST_RESET); } else { qemu_set_irq(NVRAM->IRQ, 1); qemu_set_irq(NVRAM->IRQ, 0); diff --git a/hw/timer/milkymist-sysctl.c b/hw/timer/milkymist-sysctl.c index 4488590..61356d9 100644 --- a/hw/timer/milkymist-sysctl.c +++ b/hw/timer/milkymist-sysctl.c @@ -90,7 +90,7 @@ static void sysctl_icap_write(MilkymistSysctlState *s, ui= nt32_t value) trace_milkymist_sysctl_icap_write(value); switch (value & 0xffff) { case 0x000e: - qemu_system_shutdown_request(); + qemu_system_shutdown_request(SHUTDOWN_TYPE_GUEST_SHUTDOWN); break; } } @@ -195,7 +195,7 @@ static void sysctl_write(void *opaque, hwaddr addr, uin= t64_t value, s->regs[addr] =3D 1; break; case R_SYSTEM_ID: - qemu_system_reset_request(); + qemu_system_reset_request(SHUTDOWN_TYPE_GUEST_RESET); break; case R_GPIO_IN: diff --git a/hw/timer/pxa2xx_timer.c b/hw/timer/pxa2xx_timer.c index 59002b4..b988835 100644 --- a/hw/timer/pxa2xx_timer.c +++ b/hw/timer/pxa2xx_timer.c @@ -401,7 +401,7 @@ static void pxa2xx_timer_tick(void *opaque) if (t->num =3D=3D 3) if (i->reset3 & 1) { i->reset3 =3D 0; - qemu_system_reset_request(); + qemu_system_reset_request(SHUTDOWN_TYPE_GUEST_RESET); } } diff --git a/hw/watchdog/watchdog.c b/hw/watchdog/watchdog.c index 2aeaf1f..5cfe775 100644 --- a/hw/watchdog/watchdog.c +++ b/hw/watchdog/watchdog.c @@ -110,7 +110,7 @@ void watchdog_perform_action(void) switch (watchdog_action) { case WDT_RESET: /* same as 'system_reset' in monitor */ qapi_event_send_watchdog(WATCHDOG_EXPIRATION_ACTION_RESET, &error_= abort); - qemu_system_reset_request(); + qemu_system_reset_request(SHUTDOWN_TYPE_GUEST_RESET); break; case WDT_SHUTDOWN: /* same as 'system_powerdown' in monitor */ diff --git a/hw/xenpv/xen_domainbuild.c b/hw/xenpv/xen_domainbuild.c index 457a897..e275ed1 100644 --- a/hw/xenpv/xen_domainbuild.c +++ b/hw/xenpv/xen_domainbuild.c @@ -148,7 +148,7 @@ static void xen_domain_poll(void *opaque) return; quit: - qemu_system_shutdown_request(); + qemu_system_shutdown_request(SHUTDOWN_TYPE_GUEST_SHUTDOWN); } static int xen_domain_watcher(void) diff --git a/hw/xtensa/xtfpga.c b/hw/xtensa/xtfpga.c index 11176e2..e7e531a 100644 --- a/hw/xtensa/xtfpga.c +++ b/hw/xtensa/xtfpga.c @@ -100,7 +100,7 @@ static void lx60_fpga_write(void *opaque, hwaddr addr, case 0x10: /*board reset*/ if (val =3D=3D 0xdead) { - qemu_system_reset_request(); + qemu_system_reset_request(SHUTDOWN_TYPE_GUEST_RESET); } break; } diff --git a/kvm-all.c b/kvm-all.c index 90b8573..6b40673 100644 --- a/kvm-all.c +++ b/kvm-all.c @@ -2052,7 +2052,7 @@ int kvm_cpu_exec(CPUState *cpu) break; case KVM_EXIT_SHUTDOWN: DPRINTF("shutdown\n"); - qemu_system_reset_request(); + qemu_system_reset_request(SHUTDOWN_TYPE_GUEST_RESET); ret =3D EXCP_INTERRUPT; break; case KVM_EXIT_UNKNOWN: @@ -2066,11 +2066,11 @@ int kvm_cpu_exec(CPUState *cpu) case KVM_EXIT_SYSTEM_EVENT: switch (run->system_event.type) { case KVM_SYSTEM_EVENT_SHUTDOWN: - qemu_system_shutdown_request(); + qemu_system_shutdown_request(SHUTDOWN_TYPE_GUEST_SHUTDOWN); ret =3D EXCP_INTERRUPT; break; case KVM_SYSTEM_EVENT_RESET: - qemu_system_reset_request(); + qemu_system_reset_request(SHUTDOWN_TYPE_GUEST_RESET); ret =3D EXCP_INTERRUPT; break; case KVM_SYSTEM_EVENT_CRASH: diff --git a/os-win32.c b/os-win32.c index ae98574..2feae65 100644 --- a/os-win32.c +++ b/os-win32.c @@ -52,7 +52,7 @@ int setenv(const char *name, const char *value, int overw= rite) static BOOL WINAPI qemu_ctrl_handler(DWORD type) { - qemu_system_shutdown_request(); + qemu_system_shutdown_request(SHUTDOWN_TYPE_HOST_SIGNAL); /* Windows 7 kills application when the function returns. Sleep here to give QEMU a try for closing. Sleep period is 10000ms because Windows kills the program diff --git a/qmp.c b/qmp.c index ab74cd7..f8163e4 100644 --- a/qmp.c +++ b/qmp.c @@ -84,7 +84,7 @@ UuidInfo *qmp_query_uuid(Error **errp) void qmp_quit(Error **errp) { no_shutdown =3D 0; - qemu_system_shutdown_request(); + qemu_system_shutdown_request(SHUTDOWN_TYPE_HOST_QMP); } void qmp_stop(Error **errp) @@ -105,7 +105,7 @@ void qmp_stop(Error **errp) void qmp_system_reset(Error **errp) { - qemu_system_reset_request(); + qemu_system_reset_request(SHUTDOWN_TYPE_HOST_QMP); } void qmp_system_powerdown(Error **erp) diff --git a/replay/replay.c b/replay/replay.c index f810628..2276aa8 100644 --- a/replay/replay.c +++ b/replay/replay.c @@ -51,7 +51,10 @@ bool replay_next_event_is(int event) switch (replay_state.data_kind) { case EVENT_SHUTDOWN: replay_finish_event(); - qemu_system_shutdown_request(); + /* TODO: track source of shutdown request, to replay a + * guest-initiated request rather than always claiming to + * be from the host? */ + qemu_system_shutdown_request(SHUTDOWN_TYPE_HOST_REPLAY); break; default: /* clock, time_t, checkpoint and other events */ diff --git a/target/alpha/sys_helper.c b/target/alpha/sys_helper.c index 652195d..aa0caad 100644 --- a/target/alpha/sys_helper.c +++ b/target/alpha/sys_helper.c @@ -60,9 +60,9 @@ void helper_tb_flush(CPUAlphaState *env) void helper_halt(uint64_t restart) { if (restart) { - qemu_system_reset_request(); + qemu_system_reset_request(SHUTDOWN_TYPE_GUEST_RESET); } else { - qemu_system_shutdown_request(); + qemu_system_shutdown_request(SHUTDOWN_TYPE_GUEST_SHUTDOWN); } } diff --git a/target/arm/psci.c b/target/arm/psci.c index ade9fe2..a10997d 100644 --- a/target/arm/psci.c +++ b/target/arm/psci.c @@ -137,7 +137,7 @@ void arm_handle_psci_call(ARMCPU *cpu) } break; case QEMU_PSCI_0_2_FN_SYSTEM_RESET: - qemu_system_reset_request(); + qemu_system_reset_request(SHUTDOWN_TYPE_GUEST_RESET); /* QEMU reset and shutdown are async requests, but PSCI * mandates that we never return from the reset/shutdown * call, so power the CPU off now so it doesn't execute @@ -145,7 +145,7 @@ void arm_handle_psci_call(ARMCPU *cpu) */ goto cpu_off; case QEMU_PSCI_0_2_FN_SYSTEM_OFF: - qemu_system_shutdown_request(); + qemu_system_shutdown_request(SHUTDOWN_TYPE_GUEST_SHUTDOWN); goto cpu_off; case QEMU_PSCI_0_1_FN_CPU_ON: case QEMU_PSCI_0_2_FN_CPU_ON: diff --git a/target/i386/excp_helper.c b/target/i386/excp_helper.c index ee596c6..c868eb3 100644 --- a/target/i386/excp_helper.c +++ b/target/i386/excp_helper.c @@ -59,7 +59,7 @@ static int check_exception(CPUX86State *env, int intno, i= nt *error_code, qemu_log_mask(CPU_LOG_RESET, "Triple fault\n"); - qemu_system_reset_request(); + qemu_system_reset_request(SHUTDOWN_TYPE_GUEST_RESET); return EXCP_HLT; } #endif diff --git a/target/i386/hax-all.c b/target/i386/hax-all.c index ef13015..fd77801 100644 --- a/target/i386/hax-all.c +++ b/target/i386/hax-all.c @@ -540,14 +540,14 @@ static int hax_vcpu_hax_exec(CPUArchState *env) /* Guest state changed, currently only for shutdown */ case HAX_EXIT_STATECHANGE: fprintf(stdout, "VCPU shutdown request\n"); - qemu_system_shutdown_request(); + qemu_system_shutdown_request(SHUTDOWN_TYPE_GUEST_SHUTDOWN); hax_vcpu_sync_state(env, 0); ret =3D 1; break; case HAX_EXIT_UNKNOWN_VMEXIT: fprintf(stderr, "Unknown VMX exit %x from guest\n", ht->_exit_reason); - qemu_system_reset_request(); + qemu_system_reset_request(SHUTDOWN_TYPE_GUEST_RESET); hax_vcpu_sync_state(env, 0); cpu_dump_state(cpu, stderr, fprintf, 0); ret =3D -1; @@ -578,7 +578,7 @@ static int hax_vcpu_hax_exec(CPUArchState *env) break; default: fprintf(stderr, "Unknown exit %x from HAX\n", ht->_exit_status= ); - qemu_system_reset_request(); + qemu_system_reset_request(SHUTDOWN_TYPE_GUEST_RESET); hax_vcpu_sync_state(env, 0); cpu_dump_state(cpu, stderr, fprintf, 0); ret =3D 1; diff --git a/target/i386/helper.c b/target/i386/helper.c index f11cac6..c6c6058 100644 --- a/target/i386/helper.c +++ b/target/i386/helper.c @@ -1212,7 +1212,7 @@ static void do_inject_x86_mce(CPUState *cs, run_on_cp= u_data data) " triple fault\n", cs->cpu_index); qemu_log_mask(CPU_LOG_RESET, "Triple fault\n"); - qemu_system_reset_request(); + qemu_system_reset_request(SHUTDOWN_TYPE_GUEST_RESET); return; } if (banks[1] & MCI_STATUS_VAL) { diff --git a/target/i386/kvm.c b/target/i386/kvm.c index 55865db..a2d988e 100644 --- a/target/i386/kvm.c +++ b/target/i386/kvm.c @@ -2930,7 +2930,7 @@ int kvm_arch_process_async_events(CPUState *cs) if (env->exception_injected =3D=3D EXCP08_DBLE) { /* this means triple fault */ - qemu_system_reset_request(); + qemu_system_reset_request(SHUTDOWN_TYPE_GUEST_RESET); cs->exit_request =3D 1; return 0; } diff --git a/target/s390x/helper.c b/target/s390x/helper.c index 68bd2f9..e01c5cf 100644 --- a/target/s390x/helper.c +++ b/target/s390x/helper.c @@ -266,7 +266,7 @@ void load_psw(CPUS390XState *env, uint64_t mask, uint64= _t addr) S390CPU *cpu =3D s390_env_get_cpu(env); if (s390_cpu_halt(cpu) =3D=3D 0) { #ifndef CONFIG_USER_ONLY - qemu_system_shutdown_request(); + qemu_system_shutdown_request(SHUTDOWN_TYPE_GUEST_SHUTDOWN); #endif } } diff --git a/target/s390x/kvm.c b/target/s390x/kvm.c index 1a249d8..ab2bba6 100644 --- a/target/s390x/kvm.c +++ b/target/s390x/kvm.c @@ -1929,7 +1929,7 @@ static int handle_intercept(S390CPU *cpu) cpu_synchronize_state(cs); if (s390_cpu_halt(cpu) =3D=3D 0) { if (is_special_wait_psw(cs)) { - qemu_system_shutdown_request(); + qemu_system_shutdown_request(SHUTDOWN_TYPE_GUEST_SHUTD= OWN); } else { qemu_system_guest_panicked(NULL); } @@ -1938,7 +1938,7 @@ static int handle_intercept(S390CPU *cpu) break; case ICPT_CPU_STOP: if (s390_cpu_set_state(CPU_STATE_STOPPED, cpu) =3D=3D 0) { - qemu_system_shutdown_request(); + qemu_system_shutdown_request(SHUTDOWN_TYPE_GUEST_SHUTDOWN); } if (cpu->env.sigp_order =3D=3D SIGP_STOP_STORE_STATUS) { kvm_s390_store_status(cpu, KVM_S390_STORE_STATUS_DEF_ADDR, diff --git a/target/s390x/misc_helper.c b/target/s390x/misc_helper.c index eca8244..4e8d410 100644 --- a/target/s390x/misc_helper.c +++ b/target/s390x/misc_helper.c @@ -533,11 +533,11 @@ uint32_t HELPER(sigp)(CPUS390XState *env, uint64_t or= der_code, uint32_t r1, break; #if !defined(CONFIG_USER_ONLY) case SIGP_RESTART: - qemu_system_reset_request(); + qemu_system_reset_request(SHUTDOWN_TYPE_GUEST_RESET); cpu_loop_exit(CPU(s390_env_get_cpu(env))); break; case SIGP_STOP: - qemu_system_shutdown_request(); + qemu_system_shutdown_request(SHUTDOWN_TYPE_GUEST_SHUTDOWN); cpu_loop_exit(CPU(s390_env_get_cpu(env))); break; #endif diff --git a/target/sparc/int32_helper.c b/target/sparc/int32_helper.c index 09afe13..23c4f80 100644 --- a/target/sparc/int32_helper.c +++ b/target/sparc/int32_helper.c @@ -109,7 +109,7 @@ void sparc_cpu_do_interrupt(CPUState *cs) if (env->psret =3D=3D 0) { if (cs->exception_index =3D=3D 0x80 && env->def->features & CPU_FEATURE_TA0_SHUTDOWN) { - qemu_system_shutdown_request(); + qemu_system_shutdown_request(SHUTDOWN_TYPE_GUEST_SHUTDOWN); } else { cpu_abort(cs, "Trap 0x%02x while interrupts disabled, Error st= ate", cs->exception_index); diff --git a/ui/sdl.c b/ui/sdl.c index 37c21a0..8d8a68d 100644 --- a/ui/sdl.c +++ b/ui/sdl.c @@ -837,7 +837,7 @@ static void sdl_refresh(DisplayChangeListener *dcl) case SDL_QUIT: if (!no_quit) { no_shutdown =3D 0; - qemu_system_shutdown_request(); + qemu_system_shutdown_request(SHUTDOWN_TYPE_HOST_UI); } break; case SDL_MOUSEMOTION: diff --git a/ui/sdl2.c b/ui/sdl2.c index faf9bdf..a8c98af 100644 --- a/ui/sdl2.c +++ b/ui/sdl2.c @@ -568,7 +568,7 @@ static void handle_windowevent(SDL_Event *ev) case SDL_WINDOWEVENT_CLOSE: if (!no_quit) { no_shutdown =3D 0; - qemu_system_shutdown_request(); + qemu_system_shutdown_request(SHUTDOWN_TYPE_HOST_UI); } break; case SDL_WINDOWEVENT_SHOWN: @@ -611,7 +611,7 @@ void sdl2_poll_events(struct sdl2_console *scon) case SDL_QUIT: if (!no_quit) { no_shutdown =3D 0; - qemu_system_shutdown_request(); + qemu_system_shutdown_request(SHUTDOWN_TYPE_HOST_UI); } break; case SDL_MOUSEMOTION: diff --git a/tests/qemu-iotests/071.out b/tests/qemu-iotests/071.out index dd879f1..1d5e28d 100644 --- a/tests/qemu-iotests/071.out +++ b/tests/qemu-iotests/071.out @@ -46,7 +46,7 @@ QMP_VERSION read failed: Input/output error {"return": ""} {"return": {}} -{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event"= : "SHUTDOWN"} +{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event"= : "SHUTDOWN", "data": {"guest": false}} =3D=3D=3D Testing blkverify on existing block device =3D=3D=3D @@ -85,7 +85,7 @@ wrote 512/512 bytes at offset 0 read failed: Input/output error {"return": ""} {"return": {}} -{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event"= : "SHUTDOWN"} +{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event"= : "SHUTDOWN", "data": {"guest": false}} QEMU_PROG: Failed to flush the L2 table cache: Input/output error QEMU_PROG: Failed to flush the refcount block cache: Input/output error diff --git a/tests/qemu-iotests/081.out b/tests/qemu-iotests/081.out index 97df69d..2533c31 100644 --- a/tests/qemu-iotests/081.out +++ b/tests/qemu-iotests/081.out @@ -36,7 +36,7 @@ read 10485760/10485760 bytes at offset 0 10 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) {"return": ""} {"return": {}} -{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event"= : "SHUTDOWN"} +{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event"= : "SHUTDOWN", "data": {"guest": false}} =3D=3D using quorum rewrite corrupted mode =3D=3D diff --git a/tests/qemu-iotests/087.out b/tests/qemu-iotests/087.out index dc6baf9..59c5208 100644 --- a/tests/qemu-iotests/087.out +++ b/tests/qemu-iotests/087.out @@ -8,7 +8,7 @@ QMP_VERSION {"return": {}} {"error": {"class": "GenericError", "desc": "'node-name' must be specified= for the root node"}} {"return": {}} -{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event"= : "SHUTDOWN"} +{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event"= : "SHUTDOWN", "data": {"guest": false}} =3D=3D=3D Duplicate ID =3D=3D=3D @@ -19,7 +19,7 @@ QMP_VERSION {"error": {"class": "GenericError", "desc": "node-name=3Ddisk is conflicti= ng with a device id"}} {"error": {"class": "GenericError", "desc": "Duplicate node name"}} {"return": {}} -{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event"= : "SHUTDOWN"} +{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event"= : "SHUTDOWN", "data": {"guest": false}} =3D=3D=3D aio=3Dnative without O_DIRECT =3D=3D=3D @@ -29,7 +29,7 @@ QMP_VERSION {"return": {}} {"error": {"class": "GenericError", "desc": "aio=3Dnative was specified, b= ut it requires cache.direct=3Don, which was not specified."}} {"return": {}} -{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event"= : "SHUTDOWN"} +{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event"= : "SHUTDOWN", "data": {"guest": false}} =3D=3D=3D Encrypted image =3D=3D=3D @@ -40,14 +40,14 @@ QMP_VERSION {"return": {}} {"error": {"class": "GenericError", "desc": "Use of AES-CBC encrypted IMGF= MT images is no longer supported in system emulators"}} {"return": {}} -{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event"= : "SHUTDOWN"} +{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event"= : "SHUTDOWN", "data": {"guest": false}} Testing: QMP_VERSION {"return": {}} {"error": {"class": "GenericError", "desc": "Use of AES-CBC encrypted IMGF= MT images is no longer supported in system emulators"}} {"return": {}} -{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event"= : "SHUTDOWN"} +{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event"= : "SHUTDOWN", "data": {"guest": false}} =3D=3D=3D Missing driver =3D=3D=3D @@ -58,6 +58,6 @@ QMP_VERSION {"return": {}} {"error": {"class": "GenericError", "desc": "Parameter 'driver' is missing= "}} {"return": {}} -{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event"= : "SHUTDOWN"} +{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event"= : "SHUTDOWN", "data": {"guest": false}} *** done diff --git a/tests/qemu-iotests/094.out b/tests/qemu-iotests/094.out index b66dc07..f52baff 100644 --- a/tests/qemu-iotests/094.out +++ b/tests/qemu-iotests/094.out @@ -7,5 +7,5 @@ Formatting 'TEST_DIR/source.IMGFMT', fmt=3DIMGFMT size=3D67= 108864 {"return": {}} {"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event"= : "BLOCK_JOB_COMPLETED", "data": {"device": "src", "len": 67108864, "offset= ": 67108864, "speed": 0, "type": "mirror"}} {"return": {}} -{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event"= : "SHUTDOWN"} +{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event"= : "SHUTDOWN", "data": {"guest": false}} *** done diff --git a/tests/qemu-iotests/117.out b/tests/qemu-iotests/117.out index f52dc1a..851e214 100644 --- a/tests/qemu-iotests/117.out +++ b/tests/qemu-iotests/117.out @@ -7,7 +7,7 @@ wrote 65536/65536 bytes at offset 0 64 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) {"return": ""} {"return": {}} -{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event"= : "SHUTDOWN"} +{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event"= : "SHUTDOWN", "data": {"guest": false}} No errors were found on the image. read 65536/65536 bytes at offset 0 64 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) diff --git a/tests/qemu-iotests/119.out b/tests/qemu-iotests/119.out index 58e7114..a8743b8 100644 --- a/tests/qemu-iotests/119.out +++ b/tests/qemu-iotests/119.out @@ -6,6 +6,6 @@ read 65536/65536 bytes at offset 0 64 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) {"return": ""} {"return": {}} -{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event"= : "SHUTDOWN"} +{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event"= : "SHUTDOWN", "data": {"guest": false}} *** done diff --git a/tests/qemu-iotests/120.out b/tests/qemu-iotests/120.out index 9131b1b..1af1aeb 100644 --- a/tests/qemu-iotests/120.out +++ b/tests/qemu-iotests/120.out @@ -6,7 +6,7 @@ wrote 65536/65536 bytes at offset 0 64 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) {"return": ""} {"return": {}} -{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event"= : "SHUTDOWN"} +{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event"= : "SHUTDOWN", "data": {"guest": false}} read 65536/65536 bytes at offset 0 64 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) read 65536/65536 bytes at offset 0 diff --git a/tests/qemu-iotests/140.out b/tests/qemu-iotests/140.out index 6c04456..0689b2b 100644 --- a/tests/qemu-iotests/140.out +++ b/tests/qemu-iotests/140.out @@ -10,5 +10,5 @@ read 65536/65536 bytes at offset 0 {"return": {}} can't open device nbd+unix:///drv?socket=3DTEST_DIR/nbd: No export with na= me 'drv' available {"return": {}} -{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event"= : "SHUTDOWN"} +{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event"= : "SHUTDOWN", "data": {"guest": false}} *** done diff --git a/tests/qemu-iotests/143.out b/tests/qemu-iotests/143.out index d24ad20..0978b89 100644 --- a/tests/qemu-iotests/143.out +++ b/tests/qemu-iotests/143.out @@ -3,5 +3,5 @@ QA output created by 143 {"return": {}} can't open device nbd+unix:///no_such_export?socket=3DTEST_DIR/nbd: No exp= ort with name 'no_such_export' available {"return": {}} -{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event"= : "SHUTDOWN"} +{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event"= : "SHUTDOWN", "data": {"guest": false}} *** done diff --git a/tests/qemu-iotests/156.out b/tests/qemu-iotests/156.out index 3af82ae..f96a564 100644 --- a/tests/qemu-iotests/156.out +++ b/tests/qemu-iotests/156.out @@ -34,7 +34,7 @@ read 65536/65536 bytes at offset 196608 {"return": ""} {"return": {}} -{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event"= : "SHUTDOWN"} +{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event"= : "SHUTDOWN", "data": {"guest": false}} read 65536/65536 bytes at offset 0 64 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) diff --git a/trace-events b/trace-events index e582d63..433865f 100644 --- a/trace-events +++ b/trace-events @@ -38,7 +38,7 @@ vm_state_notify(int running, int reason) "running %d reas= on %d" load_file(const char *name, const char *path) "name %s location %s" runstate_set(int new_state) "new state %d" system_wakeup_request(int reason) "reason=3D%d" -qemu_system_shutdown_request(void) "" +qemu_system_shutdown_request(int reason) "reason=3D%d" qemu_system_powerdown_request(void) "" # spice-qemu-char.c diff --git a/ui/cocoa.m b/ui/cocoa.m index 207555e..af6485d 100644 --- a/ui/cocoa.m +++ b/ui/cocoa.m @@ -934,7 +934,7 @@ QemuCocoaView *cocoaView; { COCOA_DEBUG("QemuCocoaAppController: applicationWillTerminate\n"); - qemu_system_shutdown_request(); + qemu_system_shutdown_request(SHUTDOWN_TYPE_HOST_UI); exit(0); } --=20 2.9.3 From nobody Sat May 4 07:59:06 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zoho.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1493321219867395.871857275704; Thu, 27 Apr 2017 12:26:59 -0700 (PDT) Received: from localhost ([::1]:33900 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1d3p46-0006mn-0B for importer@patchew.org; Thu, 27 Apr 2017 15:26:58 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:36724) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1d3p0i-0004iN-0j for qemu-devel@nongnu.org; Thu, 27 Apr 2017 15:23:33 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1d3p0g-00075a-5Q for qemu-devel@nongnu.org; Thu, 27 Apr 2017 15:23:27 -0400 Received: from mx1.redhat.com ([209.132.183.28]:37182) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1d3p0b-00072H-GY; Thu, 27 Apr 2017 15:23:21 -0400 Received: from smtp.corp.redhat.com (int-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.12]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 7606679352; Thu, 27 Apr 2017 19:23:20 +0000 (UTC) Received: from red.redhat.com (ovpn-123-177.rdu2.redhat.com [10.10.123.177]) by smtp.corp.redhat.com (Postfix) with ESMTP id C9F227E8E3; Thu, 27 Apr 2017 19:23:04 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mx1.redhat.com 7606679352 Authentication-Results: ext-mx04.extmail.prod.ext.phx2.redhat.com; dmarc=none (p=none dis=none) header.from=redhat.com Authentication-Results: ext-mx04.extmail.prod.ext.phx2.redhat.com; spf=pass smtp.mailfrom=eblake@redhat.com DKIM-Filter: OpenDKIM Filter v2.11.0 mx1.redhat.com 7606679352 From: Eric Blake To: qemu-devel@nongnu.org Date: Thu, 27 Apr 2017 14:22:11 -0500 Message-Id: <20170427192211.30640-5-eblake@redhat.com> In-Reply-To: <20170427192211.30640-1-eblake@redhat.com> References: <20170427192211.30640-1-eblake@redhat.com> X-Scanned-By: MIMEDefang 2.79 on 10.5.11.12 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.28]); Thu, 27 Apr 2017 19:23:20 +0000 (UTC) X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [PATCH v3 4/4] RFC: shutdown: Expose full ShutdownType across QMP X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Kevin Wolf , "open list:Block layer core" , armbru@redhat.com, Max Reitz , Paolo Bonzini , alistair.francis@xilinx.com Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Since all reset/shutdown requests have been associated with a reason, we can expose the full reason rather than a simple bool to the guest. Document that any future additions to the enum type will still use a 'host-' or 'guest-' prefix. Signed-off-by: Eric Blake --- v3: new patch. If we like this approach better than just the 'guest':'bool' of the previous, then I will squash the two patches together and tweak the commit message for a v4 posting. --- qapi-schema.json | 5 ++++- qapi/event.json | 17 ++++++----------- vl.c | 6 ++---- tests/qemu-iotests/071.out | 4 ++-- tests/qemu-iotests/081.out | 2 +- tests/qemu-iotests/087.out | 12 ++++++------ tests/qemu-iotests/094.out | 2 +- tests/qemu-iotests/117.out | 2 +- tests/qemu-iotests/119.out | 2 +- tests/qemu-iotests/120.out | 2 +- tests/qemu-iotests/140.out | 2 +- tests/qemu-iotests/143.out | 2 +- tests/qemu-iotests/156.out | 2 +- 13 files changed, 28 insertions(+), 32 deletions(-) diff --git a/qapi-schema.json b/qapi-schema.json index 8b9819f..b662a94 100644 --- a/qapi-schema.json +++ b/qapi-schema.json @@ -2306,7 +2306,10 @@ ## # @ShutdownType: # -# Enumeration of various causes for shutdown. +# Enumeration of various causes for shutdown, used in SHUTDOWN and RESET +# events. It is anticipated that if any new reasons are added, the prefix +# will still make it possible to distinguish whether it was the guest or +# the host that requested the change in state. # # @host-qmp: Reaction to a QMP command, such as 'quit' # @host-signal: Reaction to a signal, such as SIGINT diff --git a/qapi/event.json b/qapi/event.json index 6d22b02..de721de 100644 --- a/qapi/event.json +++ b/qapi/event.json @@ -10,9 +10,7 @@ # Emitted when the virtual machine has shut down, indicating that qemu is # about to exit. # -# @guest: If true, the shutdown was triggered by a guest request (such as -# a guest-initiated ACPI shutdown request or other hardware-specific actio= n) -# rather than a host request (such as sending qemu a SIGINT). (since 2.10) +# @reason: What triggered the reset. (since 2.10) # # Note: If the command-line option "-no-shutdown" has been specified, qemu= will # not exit, and a STOP event will eventually follow the SHUTDOWN event @@ -21,11 +19,11 @@ # # Example: # -# <- { "event": "SHUTDOWN", "data": { "guest": true }, +# <- { "event": "SHUTDOWN", "data": { "reason": "guest-shutdown" }, # "timestamp": { "seconds": 1267040730, "microseconds": 682951 } } # ## -{ 'event': 'SHUTDOWN', 'data': { 'guest': 'bool' } } +{ 'event': 'SHUTDOWN', 'data': { 'reason': 'ShutdownType' } } ## # @POWERDOWN: @@ -48,20 +46,17 @@ # # Emitted when the virtual machine is reset # -# @guest: If true, the reset was triggered by a guest request (such as -# a guest-initiated ACPI reboot request or other hardware-specific action) -# rather than a host request (such as the QMP command system_reset). -# (since 2.10) +# @reason: What triggered the reset. (since 2.10) # # Since: 0.12.0 # # Example: # -# <- { "event": "RESET", "data": { "guest": false }, +# <- { "event": "RESET", "data": { "reason": "host-qmp" }, # "timestamp": { "seconds": 1267041653, "microseconds": 9518 } } # ## -{ 'event': 'RESET', 'data': { 'guest': 'bool' } } +{ 'event': 'RESET', 'data': { 'reason': 'ShutdownType' } } ## # @STOP: diff --git a/vl.c b/vl.c index 4f9c5bf..e78141a 100644 --- a/vl.c +++ b/vl.c @@ -1706,8 +1706,7 @@ void qemu_system_reset(bool report, int reason) } if (report) { assert(reason >=3D 0); - qapi_event_send_reset(reason >=3D SHUTDOWN_TYPE_GUEST_SHUTDOWN, - &error_abort); + qapi_event_send_reset(reason, &error_abort); } cpu_synchronize_all_post_reset(); } @@ -1864,8 +1863,7 @@ static bool main_loop_should_exit(void) request =3D qemu_shutdown_requested(); if (request >=3D 0) { qemu_kill_report(); - qapi_event_send_shutdown(request >=3D SHUTDOWN_TYPE_GUEST_SHUTDOWN, - &error_abort); + qapi_event_send_shutdown(request, &error_abort); if (no_shutdown) { vm_stop(RUN_STATE_SHUTDOWN); } else { diff --git a/tests/qemu-iotests/071.out b/tests/qemu-iotests/071.out index 1d5e28d..aa6edc2 100644 --- a/tests/qemu-iotests/071.out +++ b/tests/qemu-iotests/071.out @@ -46,7 +46,7 @@ QMP_VERSION read failed: Input/output error {"return": ""} {"return": {}} -{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event"= : "SHUTDOWN", "data": {"guest": false}} +{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event"= : "SHUTDOWN", "data": {"reason": "host-qmp"}} =3D=3D=3D Testing blkverify on existing block device =3D=3D=3D @@ -85,7 +85,7 @@ wrote 512/512 bytes at offset 0 read failed: Input/output error {"return": ""} {"return": {}} -{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event"= : "SHUTDOWN", "data": {"guest": false}} +{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event"= : "SHUTDOWN", "data": {"reason": "host-qmp"}} QEMU_PROG: Failed to flush the L2 table cache: Input/output error QEMU_PROG: Failed to flush the refcount block cache: Input/output error diff --git a/tests/qemu-iotests/081.out b/tests/qemu-iotests/081.out index 2533c31..ed79421 100644 --- a/tests/qemu-iotests/081.out +++ b/tests/qemu-iotests/081.out @@ -36,7 +36,7 @@ read 10485760/10485760 bytes at offset 0 10 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) {"return": ""} {"return": {}} -{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event"= : "SHUTDOWN", "data": {"guest": false}} +{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event"= : "SHUTDOWN", "data": {"reason": "host-qmp"}} =3D=3D using quorum rewrite corrupted mode =3D=3D diff --git a/tests/qemu-iotests/087.out b/tests/qemu-iotests/087.out index 59c5208..a494659 100644 --- a/tests/qemu-iotests/087.out +++ b/tests/qemu-iotests/087.out @@ -8,7 +8,7 @@ QMP_VERSION {"return": {}} {"error": {"class": "GenericError", "desc": "'node-name' must be specified= for the root node"}} {"return": {}} -{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event"= : "SHUTDOWN", "data": {"guest": false}} +{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event"= : "SHUTDOWN", "data": {"reason": "host-qmp"}} =3D=3D=3D Duplicate ID =3D=3D=3D @@ -19,7 +19,7 @@ QMP_VERSION {"error": {"class": "GenericError", "desc": "node-name=3Ddisk is conflicti= ng with a device id"}} {"error": {"class": "GenericError", "desc": "Duplicate node name"}} {"return": {}} -{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event"= : "SHUTDOWN", "data": {"guest": false}} +{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event"= : "SHUTDOWN", "data": {"reason": "host-qmp"}} =3D=3D=3D aio=3Dnative without O_DIRECT =3D=3D=3D @@ -29,7 +29,7 @@ QMP_VERSION {"return": {}} {"error": {"class": "GenericError", "desc": "aio=3Dnative was specified, b= ut it requires cache.direct=3Don, which was not specified."}} {"return": {}} -{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event"= : "SHUTDOWN", "data": {"guest": false}} +{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event"= : "SHUTDOWN", "data": {"reason": "host-qmp"}} =3D=3D=3D Encrypted image =3D=3D=3D @@ -40,14 +40,14 @@ QMP_VERSION {"return": {}} {"error": {"class": "GenericError", "desc": "Use of AES-CBC encrypted IMGF= MT images is no longer supported in system emulators"}} {"return": {}} -{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event"= : "SHUTDOWN", "data": {"guest": false}} +{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event"= : "SHUTDOWN", "data": {"reason": "host-qmp"}} Testing: QMP_VERSION {"return": {}} {"error": {"class": "GenericError", "desc": "Use of AES-CBC encrypted IMGF= MT images is no longer supported in system emulators"}} {"return": {}} -{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event"= : "SHUTDOWN", "data": {"guest": false}} +{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event"= : "SHUTDOWN", "data": {"reason": "host-qmp"}} =3D=3D=3D Missing driver =3D=3D=3D @@ -58,6 +58,6 @@ QMP_VERSION {"return": {}} {"error": {"class": "GenericError", "desc": "Parameter 'driver' is missing= "}} {"return": {}} -{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event"= : "SHUTDOWN", "data": {"guest": false}} +{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event"= : "SHUTDOWN", "data": {"reason": "host-qmp"}} *** done diff --git a/tests/qemu-iotests/094.out b/tests/qemu-iotests/094.out index f52baff..6059f20 100644 --- a/tests/qemu-iotests/094.out +++ b/tests/qemu-iotests/094.out @@ -7,5 +7,5 @@ Formatting 'TEST_DIR/source.IMGFMT', fmt=3DIMGFMT size=3D67= 108864 {"return": {}} {"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event"= : "BLOCK_JOB_COMPLETED", "data": {"device": "src", "len": 67108864, "offset= ": 67108864, "speed": 0, "type": "mirror"}} {"return": {}} -{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event"= : "SHUTDOWN", "data": {"guest": false}} +{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event"= : "SHUTDOWN", "data": {"reason": "host-qmp"}} *** done diff --git a/tests/qemu-iotests/117.out b/tests/qemu-iotests/117.out index 851e214..d325f64 100644 --- a/tests/qemu-iotests/117.out +++ b/tests/qemu-iotests/117.out @@ -7,7 +7,7 @@ wrote 65536/65536 bytes at offset 0 64 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) {"return": ""} {"return": {}} -{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event"= : "SHUTDOWN", "data": {"guest": false}} +{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event"= : "SHUTDOWN", "data": {"reason": "host-qmp"}} No errors were found on the image. read 65536/65536 bytes at offset 0 64 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) diff --git a/tests/qemu-iotests/119.out b/tests/qemu-iotests/119.out index a8743b8..80d2750 100644 --- a/tests/qemu-iotests/119.out +++ b/tests/qemu-iotests/119.out @@ -6,6 +6,6 @@ read 65536/65536 bytes at offset 0 64 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) {"return": ""} {"return": {}} -{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event"= : "SHUTDOWN", "data": {"guest": false}} +{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event"= : "SHUTDOWN", "data": {"reason": "host-qmp"}} *** done diff --git a/tests/qemu-iotests/120.out b/tests/qemu-iotests/120.out index 1af1aeb..fe717f0 100644 --- a/tests/qemu-iotests/120.out +++ b/tests/qemu-iotests/120.out @@ -6,7 +6,7 @@ wrote 65536/65536 bytes at offset 0 64 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) {"return": ""} {"return": {}} -{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event"= : "SHUTDOWN", "data": {"guest": false}} +{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event"= : "SHUTDOWN", "data": {"reason": "host-qmp"}} read 65536/65536 bytes at offset 0 64 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) read 65536/65536 bytes at offset 0 diff --git a/tests/qemu-iotests/140.out b/tests/qemu-iotests/140.out index 0689b2b..2da1c0a 100644 --- a/tests/qemu-iotests/140.out +++ b/tests/qemu-iotests/140.out @@ -10,5 +10,5 @@ read 65536/65536 bytes at offset 0 {"return": {}} can't open device nbd+unix:///drv?socket=3DTEST_DIR/nbd: No export with na= me 'drv' available {"return": {}} -{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event"= : "SHUTDOWN", "data": {"guest": false}} +{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event"= : "SHUTDOWN", "data": {"reason": "host-qmp"}} *** done diff --git a/tests/qemu-iotests/143.out b/tests/qemu-iotests/143.out index 0978b89..efec8a0 100644 --- a/tests/qemu-iotests/143.out +++ b/tests/qemu-iotests/143.out @@ -3,5 +3,5 @@ QA output created by 143 {"return": {}} can't open device nbd+unix:///no_such_export?socket=3DTEST_DIR/nbd: No exp= ort with name 'no_such_export' available {"return": {}} -{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event"= : "SHUTDOWN", "data": {"guest": false}} +{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event"= : "SHUTDOWN", "data": {"reason": "host-qmp"}} *** done diff --git a/tests/qemu-iotests/156.out b/tests/qemu-iotests/156.out index f96a564..cfa7665 100644 --- a/tests/qemu-iotests/156.out +++ b/tests/qemu-iotests/156.out @@ -34,7 +34,7 @@ read 65536/65536 bytes at offset 196608 {"return": ""} {"return": {}} -{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event"= : "SHUTDOWN", "data": {"guest": false}} +{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event"= : "SHUTDOWN", "data": {"reason": "host-qmp"}} read 65536/65536 bytes at offset 0 64 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) --=20 2.9.3