summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--hmp-commands.hx2
-rw-r--r--hmp.c6
-rw-r--r--hmp.h1
-rw-r--r--monitor.c12
-rw-r--r--qapi-schema.json11
-rw-r--r--qmp-commands.hx5
-rw-r--r--qmp.c6
7 files changed, 26 insertions, 17 deletions
diff --git a/hmp-commands.hx b/hmp-commands.hx
index 9e1cca8e3d..2163e6f5f4 100644
--- a/hmp-commands.hx
+++ b/hmp-commands.hx
@@ -43,7 +43,7 @@ ETEXI
.params = "",
.help = "quit the emulator",
.user_print = monitor_user_noop,
- .mhandler.cmd_new = do_quit,
+ .mhandler.cmd = hmp_quit,
},
STEXI
diff --git a/hmp.c b/hmp.c
index 30c6cc9511..7695dfc467 100644
--- a/hmp.c
+++ b/hmp.c
@@ -93,3 +93,9 @@ void hmp_info_chardev(Monitor *mon)
qapi_free_ChardevInfoList(char_info);
}
+
+void hmp_quit(Monitor *mon, const QDict *qdict)
+{
+ monitor_suspend(mon);
+ qmp_quit(NULL);
+}
diff --git a/hmp.h b/hmp.h
index 7388f9a6ea..a3dfafd8e9 100644
--- a/hmp.h
+++ b/hmp.h
@@ -23,5 +23,6 @@ void hmp_info_kvm(Monitor *mon);
void hmp_info_status(Monitor *mon);
void hmp_info_uuid(Monitor *mon);
void hmp_info_chardev(Monitor *mon);
+void hmp_quit(Monitor *mon, const QDict *qdict);
#endif
diff --git a/monitor.c b/monitor.c
index 0c90506cdd..6e13ef6571 100644
--- a/monitor.c
+++ b/monitor.c
@@ -946,18 +946,6 @@ static void do_trace_print_events(Monitor *mon)
trace_print_events((FILE *)mon, &monitor_fprintf);
}
-/**
- * do_quit(): Quit QEMU execution
- */
-static int do_quit(Monitor *mon, const QDict *qdict, QObject **ret_data)
-{
- monitor_suspend(mon);
- no_shutdown = 0;
- qemu_system_shutdown_request();
-
- return 0;
-}
-
#ifdef CONFIG_VNC
static int change_vnc_password(const char *password)
{
diff --git a/qapi-schema.json b/qapi-schema.json
index 35434c1eb6..38104635c0 100644
--- a/qapi-schema.json
+++ b/qapi-schema.json
@@ -225,3 +225,14 @@
##
{ 'command': 'query-commands', 'returns': ['CommandInfo'] }
+##
+# @quit:
+#
+# This command will cause the QEMU process to exit gracefully. While every
+# attempt is made to send the QMP response before terminating, this is not
+# guaranteed. When using this interface, a premature EOF would not be
+# unexpected.
+#
+# Since: 0.14.0
+##
+{ 'command': 'quit' }
diff --git a/qmp-commands.hx b/qmp-commands.hx
index 0fda5c3b97..151a5fa651 100644
--- a/qmp-commands.hx
+++ b/qmp-commands.hx
@@ -63,10 +63,7 @@ EQMP
{
.name = "quit",
.args_type = "",
- .params = "",
- .help = "quit the emulator",
- .user_print = monitor_user_noop,
- .mhandler.cmd_new = do_quit,
+ .mhandler.cmd_new = qmp_marshal_input_quit,
},
SQMP
diff --git a/qmp.c b/qmp.c
index 58337c79f1..1d380b6a5f 100644
--- a/qmp.c
+++ b/qmp.c
@@ -70,3 +70,9 @@ UuidInfo *qmp_query_uuid(Error **errp)
return info;
}
+void qmp_quit(Error **err)
+{
+ no_shutdown = 0;
+ qemu_system_shutdown_request();
+}
+