diff --git a/QMP/qmp-spec.txt b/QMP/qmp-spec.txt index f3c03277034879e16b6c1d0bdebc231389050ecd..9d30a8ce6e71e0f48beedd380250b463fb8c427a 100644 --- a/QMP/qmp-spec.txt +++ b/QMP/qmp-spec.txt @@ -215,3 +215,58 @@ Additionally, Clients must not assume any particular: - Order of json-object members or json-array elements - Amount of errors generated by a command, that is, new errors can be added to any existing command in newer versions of the Server + +6. Downstream extension of QMP +------------------------------ + +We recommend that downstream consumers of QEMU do *not* modify QMP. +Management tools should be able to support both upstream and downstream +versions of QMP without special logic, and downstream extensions are +inherently at odds with that. + +However, we recognize that it is sometimes impossible for downstreams to +avoid modifying QMP. Both upstream and downstream need to take care to +preserve long-term compatibility and interoperability. + +To help with that, QMP reserves JSON object member names beginning with +'__' (double underscore) for downstream use ("downstream names"). This +means upstream will never use any downstream names for its commands, +arguments, errors, asynchronous events, and so forth. + +Any new names downstream wishes to add must begin with '__'. To +ensure compatibility with other downstreams, it is strongly +recommended that you prefix your downstram names with '__RFQDN_' where +RFQDN is a valid, reverse fully qualified domain name which you +control. For example, a qemu-kvm specific monitor command would be: + + (qemu) __org.linux-kvm_enable_irqchip + +Downstream must not change the server greeting (section 2.2) other than +to offer additional capabilities. But see below for why even that is +discouraged. + +Section '5 Compatibility Considerations' applies to downstream as well +as to upstream, obviously. It follows that downstream must behave +exactly like upstream for any input not containing members with +downstream names ("downstream members"), except it may add members +with downstream names to its output. + +Thus, a client should not be able to distinguish downstream from +upstream as long as it doesn't send input with downstream members, and +properly ignores any downstream members in the output it receives. + +Advice on downstream modifications: + +1. Introducing new commands is okay. If you want to extend an existing + command, consider introducing a new one with the new behaviour + instead. + +2. Introducing new asynchronous messages is okay. If you want to extend + an existing message, consider adding a new one instead. + +3. Introducing new errors for use in new commands is okay. Adding new + errors to existing commands counts as extension, so 1. applies. + +4. New capabilities are strongly discouraged. Capabilities are for + evolving the basic protocol, and multiple diverging basic protocol + dialects are most undesirable. diff --git a/check-qdict.c b/check-qdict.c index f2b4826560a6fa017f421913ac006ba58c581fd3..2c3089fa66d1b8710c188c0729139a67cc2685ca 100644 --- a/check-qdict.c +++ b/check-qdict.c @@ -5,6 +5,9 @@ * * Authors: * Luiz Capitulino + * + * This work is licensed under the terms of the GNU LGPL, version 2.1 or later. + * See the COPYING.LIB file in the top-level directory. */ #include diff --git a/check-qfloat.c b/check-qfloat.c index 3758700cb845add6a3b82f0415a666e40158b9f0..b71d9834f09f1836e0a86ed34ae3c6e3d0a51c1c 100644 --- a/check-qfloat.c +++ b/check-qfloat.c @@ -1,11 +1,6 @@ /* * QFloat unit-tests. * - * Copyright (C) 2009 Red Hat Inc. - * - * Authors: - * Luiz Capitulino - * * Copyright IBM, Corp. 2009 * * Authors: diff --git a/check-qint.c b/check-qint.c index 49887bb7d9c1b9514b30fe2a7787758e13b1d8d7..f3b031698c4021612ba051ed1a61a501d7ed3683 100644 --- a/check-qint.c +++ b/check-qint.c @@ -5,6 +5,9 @@ * * Authors: * Luiz Capitulino + * + * This work is licensed under the terms of the GNU LGPL, version 2.1 or later. + * See the COPYING.LIB file in the top-level directory. */ #include diff --git a/check-qlist.c b/check-qlist.c index 0117ef32e8ffbbbe66c832bb6934ed9478867bb1..58984cbfcc32039f4b445956e579d67a05213b24 100644 --- a/check-qlist.c +++ b/check-qlist.c @@ -6,8 +6,8 @@ * Authors: * Luiz Capitulino * - * This work is licensed under the terms of the GNU GPL, version 2. See - * the COPYING file in the top-level directory. + * This work is licensed under the terms of the GNU LGPL, version 2.1 or later. + * See the COPYING.LIB file in the top-level directory. */ #include diff --git a/check-qstring.c b/check-qstring.c index c308a63eaf8831894590ba3fed60a5d4838e3c96..c9bafc26b3285a2c9a56826fe0b1984266c4630c 100644 --- a/check-qstring.c +++ b/check-qstring.c @@ -5,6 +5,9 @@ * * Authors: * Luiz Capitulino + * + * This work is licensed under the terms of the GNU LGPL, version 2.1 or later. + * See the COPYING.LIB file in the top-level directory. */ #include diff --git a/hw/pci-hotplug.c b/hw/pci-hotplug.c index cc45c504ad25a4a46ac1e1219cf72b9a0e4f8962..37ac015f7d68971944c017c120014492854844cf 100644 --- a/hw/pci-hotplug.c +++ b/hw/pci-hotplug.c @@ -33,7 +33,6 @@ #include "scsi.h" #include "virtio-blk.h" #include "qemu-config.h" -#include "qemu-objects.h" #if defined(TARGET_I386) static PCIDevice *qemu_pci_hot_add_nic(Monitor *mon, @@ -224,36 +223,7 @@ static PCIDevice *qemu_pci_hot_add_storage(Monitor *mon, return dev; } -void pci_device_hot_add_print(Monitor *mon, const QObject *data) -{ - QDict *qdict; - - assert(qobject_type(data) == QTYPE_QDICT); - qdict = qobject_to_qdict(data); - - monitor_printf(mon, "OK domain %d, bus %d, slot %d, function %d\n", - (int) qdict_get_int(qdict, "domain"), - (int) qdict_get_int(qdict, "bus"), - (int) qdict_get_int(qdict, "slot"), - (int) qdict_get_int(qdict, "function")); - -} - -/** - * pci_device_hot_add(): Hot add a PCI device - * - * Return a QDict with the following device information: - * - * - "domain": domain number - * - "bus": bus number - * - "slot": slot number - * - "function": function number - * - * Example: - * - * { "domain": 0, "bus": 0, "slot": 5, "function": 0 } - */ -int pci_device_hot_add(Monitor *mon, const QDict *qdict, QObject **ret_data) +void pci_device_hot_add(Monitor *mon, const QDict *qdict) { PCIDevice *dev = NULL; const char *pci_addr = qdict_get_str(qdict, "pci_addr"); @@ -278,20 +248,14 @@ int pci_device_hot_add(Monitor *mon, const QDict *qdict, QObject **ret_data) dev = qemu_pci_hot_add_storage(mon, pci_addr, opts); } else { monitor_printf(mon, "invalid type: %s\n", type); - return -1; } if (dev) { - *ret_data = - qobject_from_jsonf("{ 'domain': 0, 'bus': %d, 'slot': %d, " - "'function': %d }", pci_bus_num(dev->bus), - PCI_SLOT(dev->devfn), PCI_FUNC(dev->devfn)); - } else { + monitor_printf(mon, "OK domain %d, bus %d, slot %d, function %d\n", + 0, pci_bus_num(dev->bus), PCI_SLOT(dev->devfn), + PCI_FUNC(dev->devfn)); + } else monitor_printf(mon, "failed to add %s\n", opts); - return -1; - } - - return 0; } #endif @@ -313,8 +277,7 @@ int pci_device_hot_remove(Monitor *mon, const char *pci_addr) return qdev_unplug(&d->qdev); } -int do_pci_device_hot_remove(Monitor *mon, const QDict *qdict, - QObject **ret_data) +void do_pci_device_hot_remove(Monitor *mon, const QDict *qdict) { - return pci_device_hot_remove(mon, qdict_get_str(qdict, "pci_addr")); + pci_device_hot_remove(mon, qdict_get_str(qdict, "pci_addr")); } diff --git a/monitor.c b/monitor.c index a1ebc5d4d2e020c8607d035d91bcdb959b93c3d8..ad50f12edbd470e9e1ad8cd8e38a82be705207a8 100644 --- a/monitor.c +++ b/monitor.c @@ -1021,7 +1021,9 @@ static void do_info_cpu_stats(Monitor *mon) static int do_quit(Monitor *mon, const QDict *qdict, QObject **ret_data) { monitor_suspend(mon); - qemu_system_exit_request(); + no_shutdown = 0; + qemu_system_shutdown_request(); + return 0; } diff --git a/qbool.c b/qbool.c index 5ab734c2c78572deef55ea0292e8253b78699266..ad4873f62cc97bec60dde88d3b8ef2f5fd03bcea 100644 --- a/qbool.c +++ b/qbool.c @@ -1,14 +1,6 @@ /* * QBool Module * - * Copyright (C) 2009 Red Hat Inc. - * - * Authors: - * Luiz Capitulino - * - * This work is licensed under the terms of the GNU GPL, version 2. See - * the COPYING file in the top-level directory. - * * Copyright IBM, Corp. 2009 * * Authors: diff --git a/qdict.c b/qdict.c index aae57bf450d4045fcb9233b1dadc90118bf88b59..175bc178f041cfaad8078b2e920c08accb32dae9 100644 --- a/qdict.c +++ b/qdict.c @@ -1,13 +1,13 @@ /* - * QDict data type. + * QDict Module * * Copyright (C) 2009 Red Hat Inc. * * Authors: * Luiz Capitulino * - * This work is licensed under the terms of the GNU GPL, version 2. See - * the COPYING file in the top-level directory. + * This work is licensed under the terms of the GNU LGPL, version 2.1 or later. + * See the COPYING.LIB file in the top-level directory. */ #include "qint.h" diff --git a/qdict.h b/qdict.h index 579dcddc74dbb7745dd381916fc48e4f455f06bc..5e5902caea929d2483ec8b2f1066fd0d5e2648ed 100644 --- a/qdict.h +++ b/qdict.h @@ -1,3 +1,15 @@ +/* + * QDict Module + * + * Copyright (C) 2009 Red Hat Inc. + * + * Authors: + * Luiz Capitulino + * + * This work is licensed under the terms of the GNU LGPL, version 2.1 or later. + * See the COPYING.LIB file in the top-level directory. + */ + #ifndef QDICT_H #define QDICT_H diff --git a/qemu-monitor.hx b/qemu-monitor.hx index a8f194c3015be2c4abb091c27645ea9f20607c33..b6e3467c0873f1fa93f1e8e28751b508966cf958 100644 --- a/qemu-monitor.hx +++ b/qemu-monitor.hx @@ -858,8 +858,7 @@ ETEXI .args_type = "pci_addr:s,type:s,opts:s?", .params = "auto|[[:]:] nic|storage [[vlan=n][,macaddr=addr][,model=type]] [file=file][,if=type][,bus=nr]...", .help = "hot-add PCI device", - .user_print = pci_device_hot_add_print, - .mhandler.cmd_new = pci_device_hot_add, + .mhandler.cmd = pci_device_hot_add, }, #endif @@ -875,8 +874,7 @@ ETEXI .args_type = "pci_addr:s", .params = "[[:]:]", .help = "hot remove PCI device", - .user_print = monitor_user_noop, - .mhandler.cmd_new = do_pci_device_hot_remove, + .mhandler.cmd = do_pci_device_hot_remove, }, #endif diff --git a/qemu-objects.h b/qemu-objects.h index e1d1e0ca7249b876f5a0ac3c82d8269e164165be..c53fbaa2175507e626d78c516fbd786f5479d2b0 100644 --- a/qemu-objects.h +++ b/qemu-objects.h @@ -6,9 +6,10 @@ * Authors: * Luiz Capitulino * - * This work is licensed under the terms of the GNU GPL, version 2. See - * the COPYING file in the top-level directory. + * This work is licensed under the terms of the GNU LGPL, version 2.1 or later. + * See the COPYING.LIB file in the top-level directory. */ + #ifndef QEMU_OBJECTS_H #define QEMU_OBJECTS_H diff --git a/qerror.c b/qerror.c index 034c7deaad95a178f9cc5b8be09c3603a7f1c5b3..44d0bf82b48d98e5a6c022fb20d13710cad1ce2e 100644 --- a/qerror.c +++ b/qerror.c @@ -1,5 +1,5 @@ /* - * QError: QEMU Error data-type. + * QError Module * * Copyright (C) 2009 Red Hat Inc. * diff --git a/qerror.h b/qerror.h index c98c61ad11ff1400d04b9748ef07f002044692c7..77ae57464e4f1ae73b9038c3f6ce41ab8787647a 100644 --- a/qerror.h +++ b/qerror.h @@ -1,5 +1,5 @@ /* - * QError header file. + * QError Module * * Copyright (C) 2009 Red Hat Inc. * diff --git a/qfloat.c b/qfloat.c index 05215f50270c7ce4f2355613b97dcac962888caa..f8c8a2eb21afc1b6512bdec7b262caf1382a6c4f 100644 --- a/qfloat.c +++ b/qfloat.c @@ -1,14 +1,6 @@ /* * QFloat Module * - * Copyright (C) 2009 Red Hat Inc. - * - * Authors: - * Luiz Capitulino - * - * This work is licensed under the terms of the GNU GPL, version 2. See - * the COPYING file in the top-level directory. - * * Copyright IBM, Corp. 2009 * * Authors: diff --git a/qint.c b/qint.c index 447e847af3d9f5aacd68374fbb2d0f28cc0ac06f..fb3823a7f416319e57cfe2d69f69fd94f2a19659 100644 --- a/qint.c +++ b/qint.c @@ -1,14 +1,15 @@ /* - * QInt data type. + * QInt Module * * Copyright (C) 2009 Red Hat Inc. * * Authors: * Luiz Capitulino * - * This work is licensed under the terms of the GNU GPL, version 2. See - * the COPYING file in the top-level directory. + * This work is licensed under the terms of the GNU LGPL, version 2.1 or later. + * See the COPYING.LIB file in the top-level directory. */ + #include "qint.h" #include "qobject.h" #include "qemu-common.h" diff --git a/qint.h b/qint.h index 672b32196c7cd5b8cca3826099b668b2f98048f6..6b1a15c088be387fd4fdacd47ebd5a9372798099 100644 --- a/qint.h +++ b/qint.h @@ -1,3 +1,15 @@ +/* + * QInt Module + * + * Copyright (C) 2009 Red Hat Inc. + * + * Authors: + * Luiz Capitulino + * + * This work is licensed under the terms of the GNU LGPL, version 2.1 or later. + * See the COPYING.LIB file in the top-level directory. + */ + #ifndef QINT_H #define QINT_H diff --git a/qlist.c b/qlist.c index 5fccb7d0956663679604764ca8fc96430b7815f5..5730fb87f7bd848e2493d55bde055bf9e3965faf 100644 --- a/qlist.c +++ b/qlist.c @@ -1,14 +1,15 @@ /* - * QList data type. + * QList Module * * Copyright (C) 2009 Red Hat Inc. * * Authors: * Luiz Capitulino * - * This work is licensed under the terms of the GNU GPL, version 2. See - * the COPYING file in the top-level directory. + * This work is licensed under the terms of the GNU LGPL, version 2.1 or later. + * See the COPYING.LIB file in the top-level directory. */ + #include "qlist.h" #include "qobject.h" #include "qemu-queue.h" diff --git a/qlist.h b/qlist.h index a3261e1781cb9a599fcb0dce96c329111f27e610..dbe7b92db5262656c3ba1f3a6e2f8a91b91d2f6b 100644 --- a/qlist.h +++ b/qlist.h @@ -1,14 +1,15 @@ /* - * QList data type header. + * QList Module * * Copyright (C) 2009 Red Hat Inc. * * Authors: * Luiz Capitulino * - * This work is licensed under the terms of the GNU GPL, version 2. See - * the COPYING file in the top-level directory. + * This work is licensed under the terms of the GNU LGPL, version 2.1 or later. + * See the COPYING.LIB file in the top-level directory. */ + #ifndef QLIST_H #define QLIST_H diff --git a/qobject.h b/qobject.h index 07de211ef0436190806578e74131fcff9e0a453d..d42386dde1394d9651c87d69665ffa2742f4cdea 100644 --- a/qobject.h +++ b/qobject.h @@ -8,8 +8,8 @@ * Authors: * Luiz Capitulino * - * This work is licensed under the terms of the GNU GPL, version 2. See - * the COPYING file in the top-level directory. + * This work is licensed under the terms of the GNU LGPL, version 2.1 or later. + * See the COPYING.LIB file in the top-level directory. * * QObject Reference Counts Terminology * ------------------------------------ diff --git a/qstring.c b/qstring.c index 740a1067d2d7567f73d3e36da37b6aa9d4134f27..4e2ba083b71269e53c9e805718817a57031b2598 100644 --- a/qstring.c +++ b/qstring.c @@ -1,14 +1,15 @@ /* - * QString data type. + * QString Module * * Copyright (C) 2009 Red Hat Inc. * * Authors: * Luiz Capitulino * - * This work is licensed under the terms of the GNU GPL, version 2. See - * the COPYING file in the top-level directory. + * This work is licensed under the terms of the GNU LGPL, version 2.1 or later. + * See the COPYING.LIB file in the top-level directory. */ + #include "qobject.h" #include "qstring.h" #include "qemu-common.h" diff --git a/qstring.h b/qstring.h index 6aaa7d5c830c5c58beecd8cb298464e0346b6618..84ccd96d61fd2f3b73b6e129dbb4097437288957 100644 --- a/qstring.h +++ b/qstring.h @@ -1,3 +1,15 @@ +/* + * QString Module + * + * Copyright (C) 2009 Red Hat Inc. + * + * Authors: + * Luiz Capitulino + * + * This work is licensed under the terms of the GNU LGPL, version 2.1 or later. + * See the COPYING.LIB file in the top-level directory. + */ + #ifndef QSTRING_H #define QSTRING_H diff --git a/sysemu.h b/sysemu.h index fa921df94a80bebaba60e061f0a033c1cb90d02f..879446ab9eccdc41c7f2df46513fdf1892f47552 100644 --- a/sysemu.h +++ b/sysemu.h @@ -45,11 +45,9 @@ void cpu_disable_ticks(void); void qemu_system_reset_request(void); void qemu_system_shutdown_request(void); void qemu_system_powerdown_request(void); -void qemu_system_exit_request(void); int qemu_shutdown_requested(void); int qemu_reset_requested(void); int qemu_powerdown_requested(void); -int qemu_exit_requested(void); extern qemu_irq qemu_system_powerdown; void qemu_system_reset(void); @@ -130,6 +128,7 @@ extern int max_cpus; extern int cursor_hide; extern int graphic_rotate; extern int no_quit; +extern int no_shutdown; extern int semihosting_enabled; extern int old_param; extern int boot_menu; @@ -201,12 +200,10 @@ extern DriveInfo *drive_init(QemuOpts *arg, void *machine, int *fatal_error); DriveInfo *add_init_drive(const char *opts); /* pci-hotplug */ -void pci_device_hot_add_print(Monitor *mon, const QObject *data); -int pci_device_hot_add(Monitor *mon, const QDict *qdict, QObject **ret_data); +void pci_device_hot_add(Monitor *mon, const QDict *qdict); void drive_hot_add(Monitor *mon, const QDict *qdict); int pci_device_hot_remove(Monitor *mon, const char *pci_addr); -int do_pci_device_hot_remove(Monitor *mon, const QDict *qdict, - QObject **ret_data); +void do_pci_device_hot_remove(Monitor *mon, const QDict *qdict); /* serial ports */ diff --git a/vl.c b/vl.c index d77b47c6f7b8a7560830e2b61a3779d4049d4fe3..8c818f0d24d43b75a0b047bc0692d4ed4e50dc59 100644 --- a/vl.c +++ b/vl.c @@ -1708,7 +1708,6 @@ static int shutdown_requested; static int powerdown_requested; int debug_requested; int vmstop_requested; -static int exit_requested; int qemu_shutdown_requested(void) { @@ -1731,12 +1730,6 @@ int qemu_powerdown_requested(void) return r; } -int qemu_exit_requested(void) -{ - /* just return it, we'll exit() anyway */ - return exit_requested; -} - static int qemu_debug_requested(void) { int r = debug_requested; @@ -1807,12 +1800,6 @@ void qemu_system_powerdown_request(void) qemu_notify_event(); } -void qemu_system_exit_request(void) -{ - exit_requested = 1; - qemu_notify_event(); -} - #ifdef _WIN32 static void host_main_loop_wait(int *timeout) { @@ -1949,8 +1936,6 @@ static int vm_can_run(void) return 0; if (debug_requested) return 0; - if (exit_requested) - return 0; return 1; } @@ -2003,9 +1988,6 @@ static void main_loop(void) if ((r = qemu_vmstop_requested())) { vm_stop(r); } - if (qemu_exit_requested()) { - exit(0); - } } pause_all_vcpus(); }