diff --git a/.gitignore b/.gitignore index 5ffc84ba9f..c91d018c78 100644 --- a/.gitignore +++ b/.gitignore @@ -55,7 +55,6 @@ /qemu-monitor-info.texi /qemu-version.h /qemu-version.h.tmp -/qmp-commands.txt /vscclient /fsdev/virtfs-proxy-helper *.[1-9] diff --git a/MAINTAINERS b/MAINTAINERS index 3e106c823d..09d13bf1c0 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -1245,7 +1245,6 @@ M: Markus Armbruster S: Supported F: qmp.c F: monitor.c -F: qmp-commands.hx F: docs/*qmp-* F: scripts/qmp/ T: git git://repo.or.cz/qemu/armbru.git qapi-next diff --git a/Makefile b/Makefile index 1fad5b78e5..81ca388a75 100644 --- a/Makefile +++ b/Makefile @@ -92,7 +92,6 @@ HELPERS-$(CONFIG_LINUX) = qemu-bridge-helper$(EXESUF) ifdef BUILD_DOCS DOCS=qemu-doc.html qemu-tech.html qemu.1 qemu-img.1 qemu-nbd.8 qemu-ga.8 -DOCS+=qmp-commands.txt ifdef CONFIG_VIRTFS DOCS+=fsdev/virtfs-proxy-helper.1 endif @@ -312,7 +311,7 @@ $(qapi-modules) $(SRC_PATH)/scripts/qapi-event.py $(qapi-py) qmp-commands.h qmp-marshal.c :\ $(qapi-modules) $(SRC_PATH)/scripts/qapi-commands.py $(qapi-py) $(call quiet-command,$(PYTHON) $(SRC_PATH)/scripts/qapi-commands.py \ - $(gen-out-type) -o "." -m $<, \ + $(gen-out-type) -o "." $<, \ " GEN $@") qmp-introspect.h qmp-introspect.c :\ $(qapi-modules) $(SRC_PATH)/scripts/qapi-introspect.py $(qapi-py) @@ -432,7 +431,7 @@ endif install-doc: $(DOCS) $(INSTALL_DIR) "$(DESTDIR)$(qemu_docdir)" $(INSTALL_DATA) qemu-doc.html qemu-tech.html "$(DESTDIR)$(qemu_docdir)" - $(INSTALL_DATA) qmp-commands.txt "$(DESTDIR)$(qemu_docdir)" + $(INSTALL_DATA) docs/qmp-commands.txt "$(DESTDIR)$(qemu_docdir)" ifdef CONFIG_POSIX $(INSTALL_DIR) "$(DESTDIR)$(mandir)/man1" $(INSTALL_DATA) qemu.1 "$(DESTDIR)$(mandir)/man1" @@ -555,9 +554,6 @@ qemu-monitor.texi: $(SRC_PATH)/hmp-commands.hx $(SRC_PATH)/scripts/hxtool qemu-monitor-info.texi: $(SRC_PATH)/hmp-commands-info.hx $(SRC_PATH)/scripts/hxtool $(call quiet-command,sh $(SRC_PATH)/scripts/hxtool -t < $< > $@," GEN $@") -qmp-commands.txt: $(SRC_PATH)/qmp-commands.hx $(SRC_PATH)/scripts/hxtool - $(call quiet-command,sh $(SRC_PATH)/scripts/hxtool -q < $< > $@," GEN $@") - qemu-img-cmds.texi: $(SRC_PATH)/qemu-img-cmds.hx $(SRC_PATH)/scripts/hxtool $(call quiet-command,sh $(SRC_PATH)/scripts/hxtool -t < $< > $@," GEN $@") diff --git a/Makefile.target b/Makefile.target index 8c7a072f08..19cc49c0d7 100644 --- a/Makefile.target +++ b/Makefile.target @@ -156,7 +156,7 @@ else obj-y += hw/$(TARGET_BASE_ARCH)/ endif -GENERATED_HEADERS += hmp-commands.h hmp-commands-info.h qmp-commands-old.h +GENERATED_HEADERS += hmp-commands.h hmp-commands-info.h endif # CONFIG_SOFTMMU @@ -209,13 +209,10 @@ hmp-commands.h: $(SRC_PATH)/hmp-commands.hx $(SRC_PATH)/scripts/hxtool hmp-commands-info.h: $(SRC_PATH)/hmp-commands-info.hx $(SRC_PATH)/scripts/hxtool $(call quiet-command,sh $(SRC_PATH)/scripts/hxtool -h < $< > $@," GEN $(TARGET_DIR)$@") -qmp-commands-old.h: $(SRC_PATH)/qmp-commands.hx $(SRC_PATH)/scripts/hxtool - $(call quiet-command,sh $(SRC_PATH)/scripts/hxtool -h < $< > $@," GEN $(TARGET_DIR)$@") - clean: clean-target rm -f *.a *~ $(PROGS) rm -f $(shell find . -name '*.[od]') - rm -f hmp-commands.h qmp-commands-old.h gdbstub-xml.c + rm -f hmp-commands.h gdbstub-xml.c ifdef CONFIG_TRACE_SYSTEMTAP rm -f *.stp endif diff --git a/docs/qapi-code-gen.txt b/docs/qapi-code-gen.txt index de298dcaec..5d4c2cdd7e 100644 --- a/docs/qapi-code-gen.txt +++ b/docs/qapi-code-gen.txt @@ -964,9 +964,9 @@ Example: Used to generate the marshaling/dispatch functions for the commands defined in the schema. The generated code implements -qmp_marshal_COMMAND() (mentioned in qmp-commands.hx, and registered -automatically), and declares qmp_COMMAND() that the user must -implement. The following files are generated: +qmp_marshal_COMMAND() (registered automatically), and declares +qmp_COMMAND() that the user must implement. The following files are +generated: $(prefix)qmp-marshal.c: command marshal/dispatch functions for each QMP command defined in the schema. Functions diff --git a/qmp-commands.hx b/docs/qmp-commands.txt similarity index 81% rename from qmp-commands.hx rename to docs/qmp-commands.txt index e6c9193600..acebeb3954 100644 --- a/qmp-commands.hx +++ b/docs/qmp-commands.txt @@ -1,8 +1,3 @@ -HXCOMM QMP dispatch table and documentation -HXCOMM Text between SQMP and EQMP is copied to the QMP documentation file and -HXCOMM does not show up in the other formats. - -SQMP QMP Supported Commands ---------------------- @@ -58,15 +53,6 @@ If you're planning to adopt QMP, please observe the following: Server's responses in the examples below are always a success response, please refer to the QMP specification for more details on error responses. -EQMP - - { - .name = "quit", - .args_type = "", - .mhandler.cmd_new = qmp_marshal_quit, - }, - -SQMP quit ---- @@ -79,21 +65,12 @@ Example: -> { "execute": "quit" } <- { "return": {} } -EQMP - - { - .name = "eject", - .args_type = "force:-f,device:B", - .mhandler.cmd_new = qmp_marshal_eject, - }, - -SQMP eject ----- Eject a removable medium. -Arguments: +Arguments: - force: force ejection (json-bool, optional) - device: device name (json-string) @@ -105,15 +82,6 @@ Example: Note: The "force" argument defaults to false. -EQMP - - { - .name = "change", - .args_type = "device:B,target:F,arg:s?", - .mhandler.cmd_new = qmp_marshal_change, - }, - -SQMP change ------ @@ -141,15 +109,6 @@ Examples: "arg": "foobar1" } } <- { "return": {} } -EQMP - - { - .name = "screendump", - .args_type = "filename:F", - .mhandler.cmd_new = qmp_marshal_screendump, - }, - -SQMP screendump ---------- @@ -164,15 +123,6 @@ Example: -> { "execute": "screendump", "arguments": { "filename": "/tmp/image" } } <- { "return": {} } -EQMP - - { - .name = "stop", - .args_type = "", - .mhandler.cmd_new = qmp_marshal_stop, - }, - -SQMP stop ---- @@ -185,15 +135,6 @@ Example: -> { "execute": "stop" } <- { "return": {} } -EQMP - - { - .name = "cont", - .args_type = "", - .mhandler.cmd_new = qmp_marshal_cont, - }, - -SQMP cont ---- @@ -206,15 +147,6 @@ Example: -> { "execute": "cont" } <- { "return": {} } -EQMP - - { - .name = "system_wakeup", - .args_type = "", - .mhandler.cmd_new = qmp_marshal_system_wakeup, - }, - -SQMP system_wakeup ------------- @@ -227,15 +159,6 @@ Example: -> { "execute": "system_wakeup" } <- { "return": {} } -EQMP - - { - .name = "system_reset", - .args_type = "", - .mhandler.cmd_new = qmp_marshal_system_reset, - }, - -SQMP system_reset ------------ @@ -248,15 +171,6 @@ Example: -> { "execute": "system_reset" } <- { "return": {} } -EQMP - - { - .name = "system_powerdown", - .args_type = "", - .mhandler.cmd_new = qmp_marshal_system_powerdown, - }, - -SQMP system_powerdown ---------------- @@ -269,17 +183,6 @@ Example: -> { "execute": "system_powerdown" } <- { "return": {} } -EQMP - - { - .name = "device_add", - .args_type = "device:O", - .params = "driver[,prop=value][,...]", - .help = "add device, like -device on the command line", - .mhandler.cmd_new = qmp_device_add, - }, - -SQMP device_add ---------- @@ -305,15 +208,6 @@ Notes: (2) It's possible to list device properties by running QEMU with the "-device DEVICE,\?" command-line argument, where DEVICE is the device's name -EQMP - - { - .name = "device_del", - .args_type = "id:s", - .mhandler.cmd_new = qmp_marshal_device_del, - }, - -SQMP device_del ---------- @@ -333,15 +227,6 @@ Example: -> { "execute": "device_del", "arguments": { "id": "/machine/peripheral-anon/device[0]" } } <- { "return": {} } -EQMP - - { - .name = "send-key", - .args_type = "keys:q,hold-time:i?", - .mhandler.cmd_new = qmp_marshal_send_key, - }, - -SQMP send-key ---------- @@ -364,15 +249,6 @@ Example: { "type": "qcode", "data": "delete" } ] } } <- { "return": {} } -EQMP - - { - .name = "cpu", - .args_type = "index:i", - .mhandler.cmd_new = qmp_marshal_cpu, - }, - -SQMP cpu --- @@ -389,15 +265,6 @@ Example: Note: CPUs' indexes are obtained with the 'query-cpus' command. -EQMP - - { - .name = "cpu-add", - .args_type = "id:i", - .mhandler.cmd_new = qmp_marshal_cpu_add, - }, - -SQMP cpu-add ------- @@ -412,15 +279,6 @@ Example: -> { "execute": "cpu-add", "arguments": { "id": 2 } } <- { "return": {} } -EQMP - - { - .name = "memsave", - .args_type = "val:l,size:i,filename:s,cpu:i?", - .mhandler.cmd_new = qmp_marshal_memsave, - }, - -SQMP memsave ------- @@ -441,15 +299,6 @@ Example: "filename": "/tmp/virtual-mem-dump" } } <- { "return": {} } -EQMP - - { - .name = "pmemsave", - .args_type = "val:l,size:i,filename:s", - .mhandler.cmd_new = qmp_marshal_pmemsave, - }, - -SQMP pmemsave -------- @@ -469,15 +318,6 @@ Example: "filename": "/tmp/physical-mem-dump" } } <- { "return": {} } -EQMP - - { - .name = "inject-nmi", - .args_type = "", - .mhandler.cmd_new = qmp_marshal_inject_nmi, - }, - -SQMP inject-nmi ---------- @@ -492,15 +332,6 @@ Example: Note: inject-nmi fails when the guest doesn't support injecting. -EQMP - - { - .name = "ringbuf-write", - .args_type = "device:s,data:s,format:s?", - .mhandler.cmd_new = qmp_marshal_ringbuf_write, - }, - -SQMP ringbuf-write ------------- @@ -521,15 +352,6 @@ Example: "format": "utf8" } } <- { "return": {} } -EQMP - - { - .name = "ringbuf-read", - .args_type = "device:s,size:i,format:s?", - .mhandler.cmd_new = qmp_marshal_ringbuf_read, - }, - -SQMP ringbuf-read ------------- @@ -557,15 +379,6 @@ Example: "format": "utf8" } } <- {"return": "abcdefgh"} -EQMP - - { - .name = "xen-save-devices-state", - .args_type = "filename:F", - .mhandler.cmd_new = qmp_marshal_xen_save_devices_state, - }, - -SQMP xen-save-devices-state ------- @@ -584,15 +397,6 @@ Example: "arguments": { "filename": "/tmp/save" } } <- { "return": {} } -EQMP - - { - .name = "xen-load-devices-state", - .args_type = "filename:F", - .mhandler.cmd_new = qmp_marshal_xen_load_devices_state, - }, - -SQMP xen-load-devices-state ---------------------- @@ -611,15 +415,6 @@ Example: "arguments": { "filename": "/tmp/resume" } } <- { "return": {} } -EQMP - - { - .name = "xen-set-global-dirty-log", - .args_type = "enable:b", - .mhandler.cmd_new = qmp_marshal_xen_set_global_dirty_log, - }, - -SQMP xen-set-global-dirty-log ------- @@ -635,15 +430,6 @@ Example: "arguments": { "enable": true } } <- { "return": {} } -EQMP - - { - .name = "migrate", - .args_type = "detach:-d,blk:-b,inc:-i,uri:s", - .mhandler.cmd_new = qmp_marshal_migrate, - }, - -SQMP migrate ------- @@ -668,15 +454,6 @@ Notes: (3) The user Monitor's "detach" argument is invalid in QMP and should not be used -EQMP - - { - .name = "migrate_cancel", - .args_type = "", - .mhandler.cmd_new = qmp_marshal_migrate_cancel, - }, - -SQMP migrate_cancel -------------- @@ -689,15 +466,6 @@ Example: -> { "execute": "migrate_cancel" } <- { "return": {} } -EQMP - - { - .name = "migrate-incoming", - .args_type = "uri:s", - .mhandler.cmd_new = qmp_marshal_migrate_incoming, - }, - -SQMP migrate-incoming ---------------- @@ -718,14 +486,6 @@ Notes: be used (2) The uri format is the same as for -incoming -EQMP - { - .name = "migrate-set-cache-size", - .args_type = "value:o", - .mhandler.cmd_new = qmp_marshal_migrate_set_cache_size, - }, - -SQMP migrate-set-cache-size ---------------------- @@ -741,14 +501,6 @@ Example: -> { "execute": "migrate-set-cache-size", "arguments": { "value": 536870912 } } <- { "return": {} } -EQMP - { - .name = "migrate-start-postcopy", - .args_type = "", - .mhandler.cmd_new = qmp_marshal_migrate_start_postcopy, - }, - -SQMP migrate-start-postcopy ---------------------- @@ -759,15 +511,6 @@ Example: -> { "execute": "migrate-start-postcopy" } <- { "return": {} } -EQMP - - { - .name = "query-migrate-cache-size", - .args_type = "", - .mhandler.cmd_new = qmp_marshal_query_migrate_cache_size, - }, - -SQMP query-migrate-cache-size ------------------------ @@ -781,15 +524,6 @@ Example: -> { "execute": "query-migrate-cache-size" } <- { "return": 67108864 } -EQMP - - { - .name = "migrate_set_speed", - .args_type = "value:o", - .mhandler.cmd_new = qmp_marshal_migrate_set_speed, - }, - -SQMP migrate_set_speed ----------------- @@ -804,15 +538,6 @@ Example: -> { "execute": "migrate_set_speed", "arguments": { "value": 1024 } } <- { "return": {} } -EQMP - - { - .name = "migrate_set_downtime", - .args_type = "value:T", - .mhandler.cmd_new = qmp_marshal_migrate_set_downtime, - }, - -SQMP migrate_set_downtime -------------------- @@ -827,17 +552,6 @@ Example: -> { "execute": "migrate_set_downtime", "arguments": { "value": 0.1 } } <- { "return": {} } -EQMP - - { - .name = "client_migrate_info", - .args_type = "protocol:s,hostname:s,port:i?,tls-port:i?,cert-subject:s?", - .params = "protocol hostname port tls-port cert-subject", - .help = "set migration information for remote display", - .mhandler.cmd_new = qmp_marshal_client_migrate_info, - }, - -SQMP client_migrate_info ------------------- @@ -861,17 +575,6 @@ Example: "port": 1234 } } <- { "return": {} } -EQMP - - { - .name = "dump-guest-memory", - .args_type = "paging:b,protocol:s,detach:b?,begin:i?,end:i?,format:s?", - .params = "-p protocol [-d] [begin] [length] [format]", - .help = "dump guest memory to file", - .mhandler.cmd_new = qmp_marshal_dump_guest_memory, - }, - -SQMP dump @@ -902,15 +605,6 @@ Notes: (1) All boolean arguments default to false -EQMP - - { - .name = "query-dump-guest-memory-capability", - .args_type = "", - .mhandler.cmd_new = qmp_marshal_query_dump_guest_memory_capability, - }, - -SQMP query-dump-guest-memory-capability ---------- @@ -922,17 +616,6 @@ Example: <- { "return": { "formats": ["elf", "kdump-zlib", "kdump-lzo", "kdump-snappy"] } -EQMP - - { - .name = "query-dump", - .args_type = "", - .params = "", - .help = "query background dump status", - .mhandler.cmd_new = qmp_marshal_query_dump, - }, - -SQMP query-dump ---------- @@ -946,17 +629,6 @@ Example: <- { "return": { "status": "active", "completed": 1024000, "total": 2048000 } } -EQMP - -#if defined TARGET_S390X - { - .name = "dump-skeys", - .args_type = "filename:F", - .mhandler.cmd_new = qmp_marshal_dump_skeys, - }, -#endif - -SQMP dump-skeys ---------- @@ -971,15 +643,6 @@ Example: -> { "execute": "dump-skeys", "arguments": { "filename": "/tmp/skeys" } } <- { "return": {} } -EQMP - - { - .name = "netdev_add", - .args_type = "netdev:O", - .mhandler.cmd_new = qmp_netdev_add, - }, - -SQMP netdev_add ---------- @@ -1002,15 +665,6 @@ Note: The supported device options are the same ones supported by the '-netdev' command-line argument, which are listed in the '-help' output or QEMU's manual -EQMP - - { - .name = "netdev_del", - .args_type = "id:s", - .mhandler.cmd_new = qmp_marshal_netdev_del, - }, - -SQMP netdev_del ---------- @@ -1026,15 +680,6 @@ Example: <- { "return": {} } -EQMP - - { - .name = "object-add", - .args_type = "qom-type:s,id:s,props:q?", - .mhandler.cmd_new = qmp_marshal_object_add, - }, - -SQMP object-add ---------- @@ -1052,15 +697,6 @@ Example: "props": { "filename": "/dev/hwrng" } } } <- { "return": {} } -EQMP - - { - .name = "object-del", - .args_type = "id:s", - .mhandler.cmd_new = qmp_marshal_object_del, - }, - -SQMP object-del ---------- @@ -1076,16 +712,6 @@ Example: <- { "return": {} } -EQMP - - - { - .name = "block_resize", - .args_type = "device:s?,node-name:s?,size:o", - .mhandler.cmd_new = qmp_marshal_block_resize, - }, - -SQMP block_resize ------------ @@ -1102,15 +728,6 @@ Example: -> { "execute": "block_resize", "arguments": { "device": "scratch", "size": 1073741824 } } <- { "return": {} } -EQMP - - { - .name = "block-stream", - .args_type = "job-id:s?,device:B,base:s?,speed:o?,backing-file:s?,on-error:s?", - .mhandler.cmd_new = qmp_marshal_block_stream, - }, - -SQMP block-stream ------------ @@ -1147,15 +764,6 @@ Example: "base": "/tmp/master.qcow2" } } <- { "return": {} } -EQMP - - { - .name = "block-commit", - .args_type = "job-id:s?,device:B,base:s?,top:s?,backing-file:s?,speed:o?", - .mhandler.cmd_new = qmp_marshal_block_commit, - }, - -SQMP block-commit ------------ @@ -1212,17 +820,6 @@ Example: "top": "/tmp/snap1.qcow2" } } <- { "return": {} } -EQMP - - { - .name = "drive-backup", - .args_type = "job-id:s?,sync:s,device:B,target:s,speed:i?,mode:s?," - "format:s?,bitmap:s?,compress:b?," - "on-source-error:s?,on-target-error:s?", - .mhandler.cmd_new = qmp_marshal_drive_backup, - }, - -SQMP drive-backup ------------ @@ -1271,16 +868,6 @@ Example: "target": "backup.img" } } <- { "return": {} } -EQMP - - { - .name = "blockdev-backup", - .args_type = "job-id:s?,sync:s,device:B,target:B,speed:i?,compress:b?," - "on-source-error:s?,on-target-error:s?", - .mhandler.cmd_new = qmp_marshal_blockdev_backup, - }, - -SQMP blockdev-backup --------------- @@ -1316,41 +903,6 @@ Example: "target": "tgt-id" } } <- { "return": {} } -EQMP - - { - .name = "block-job-set-speed", - .args_type = "device:B,speed:o", - .mhandler.cmd_new = qmp_marshal_block_job_set_speed, - }, - - { - .name = "block-job-cancel", - .args_type = "device:B,force:b?", - .mhandler.cmd_new = qmp_marshal_block_job_cancel, - }, - { - .name = "block-job-pause", - .args_type = "device:B", - .mhandler.cmd_new = qmp_marshal_block_job_pause, - }, - { - .name = "block-job-resume", - .args_type = "device:B", - .mhandler.cmd_new = qmp_marshal_block_job_resume, - }, - { - .name = "block-job-complete", - .args_type = "device:B", - .mhandler.cmd_new = qmp_marshal_block_job_complete, - }, - { - .name = "transaction", - .args_type = "actions:q,properties:q?", - .mhandler.cmd_new = qmp_marshal_transaction, - }, - -SQMP transaction ----------- @@ -1437,16 +989,6 @@ Example: "name": "snapshot0" } } ] } } <- { "return": {} } -EQMP - - { - .name = "block-dirty-bitmap-add", - .args_type = "node:B,name:s,granularity:i?", - .mhandler.cmd_new = qmp_marshal_block_dirty_bitmap_add, - }, - -SQMP - block-dirty-bitmap-add ---------------------- Since 2.4 @@ -1465,16 +1007,6 @@ Example: "name": "bitmap0" } } <- { "return": {} } -EQMP - - { - .name = "block-dirty-bitmap-remove", - .args_type = "node:B,name:s", - .mhandler.cmd_new = qmp_marshal_block_dirty_bitmap_remove, - }, - -SQMP - block-dirty-bitmap-remove ------------------------- Since 2.4 @@ -1493,16 +1025,6 @@ Example: "name": "bitmap0" } } <- { "return": {} } -EQMP - - { - .name = "block-dirty-bitmap-clear", - .args_type = "node:B,name:s", - .mhandler.cmd_new = qmp_marshal_block_dirty_bitmap_clear, - }, - -SQMP - block-dirty-bitmap-clear ------------------------ Since 2.4 @@ -1522,15 +1044,6 @@ Example: "name": "bitmap0" } } <- { "return": {} } -EQMP - - { - .name = "blockdev-snapshot-sync", - .args_type = "device:s?,node-name:s?,snapshot-file:s,snapshot-node-name:s?,format:s?,mode:s?", - .mhandler.cmd_new = qmp_marshal_blockdev_snapshot_sync, - }, - -SQMP blockdev-snapshot-sync ---------------------- @@ -1558,15 +1071,6 @@ Example: "format": "qcow2" } } <- { "return": {} } -EQMP - - { - .name = "blockdev-snapshot", - .args_type = "node:s,overlay:s", - .mhandler.cmd_new = qmp_marshal_blockdev_snapshot, - }, - -SQMP blockdev-snapshot ----------------- Since 2.5 @@ -1596,15 +1100,6 @@ Example: "overlay": "node1534" } } <- { "return": {} } -EQMP - - { - .name = "blockdev-snapshot-internal-sync", - .args_type = "device:B,name:s", - .mhandler.cmd_new = qmp_marshal_blockdev_snapshot_internal_sync, - }, - -SQMP blockdev-snapshot-internal-sync ------------------------------- @@ -1626,16 +1121,6 @@ Example: } <- { "return": {} } -EQMP - - { - .name = "blockdev-snapshot-delete-internal-sync", - .args_type = "device:B,id:s?,name:s?", - .mhandler.cmd_new = - qmp_marshal_blockdev_snapshot_delete_internal_sync, - }, - -SQMP blockdev-snapshot-delete-internal-sync -------------------------------------- @@ -1667,19 +1152,6 @@ Example: } } -EQMP - - { - .name = "drive-mirror", - .args_type = "job-id:s?,sync:s,device:B,target:s,speed:i?,mode:s?," - "format:s?,node-name:s?,replaces:s?," - "on-source-error:s?,on-target-error:s?," - "unmap:b?," - "granularity:i?,buf-size:i?", - .mhandler.cmd_new = qmp_marshal_drive_mirror, - }, - -SQMP drive-mirror ------------ @@ -1734,17 +1206,6 @@ Example: "format": "qcow2" } } <- { "return": {} } -EQMP - - { - .name = "blockdev-mirror", - .args_type = "job-id:s?,sync:s,device:B,target:B,replaces:s?,speed:i?," - "on-source-error:s?,on-target-error:s?," - "granularity:i?,buf-size:i?", - .mhandler.cmd_new = qmp_marshal_blockdev_mirror, - }, - -SQMP blockdev-mirror ------------ @@ -1786,14 +1247,6 @@ Example: "sync": "full" } } <- { "return": {} } -EQMP - { - .name = "change-backing-file", - .args_type = "device:s,image-node-name:s,backing-file:s", - .mhandler.cmd_new = qmp_marshal_change_backing_file, - }, - -SQMP change-backing-file ------------------- Since: 2.1 @@ -1825,15 +1278,6 @@ Arguments: Returns: Nothing on success If "device" does not exist or cannot be determined, DeviceNotFound -EQMP - - { - .name = "balloon", - .args_type = "value:M", - .mhandler.cmd_new = qmp_marshal_balloon, - }, - -SQMP balloon ------- @@ -1848,15 +1292,6 @@ Example: -> { "execute": "balloon", "arguments": { "value": 536870912 } } <- { "return": {} } -EQMP - - { - .name = "set_link", - .args_type = "name:s,up:b", - .mhandler.cmd_new = qmp_marshal_set_link, - }, - -SQMP set_link -------- @@ -1872,17 +1307,6 @@ Example: -> { "execute": "set_link", "arguments": { "name": "e1000.0", "up": false } } <- { "return": {} } -EQMP - - { - .name = "getfd", - .args_type = "fdname:s", - .params = "getfd name", - .help = "receive a file descriptor via SCM rights and assign it a name", - .mhandler.cmd_new = qmp_marshal_getfd, - }, - -SQMP getfd ----- @@ -1905,17 +1329,6 @@ Notes: (2) The 'closefd' command can be used to explicitly close the file descriptor when it is no longer needed. -EQMP - - { - .name = "closefd", - .args_type = "fdname:s", - .params = "closefd name", - .help = "close a file descriptor previously passed via SCM rights", - .mhandler.cmd_new = qmp_marshal_closefd, - }, - -SQMP closefd ------- @@ -1930,17 +1343,6 @@ Example: -> { "execute": "closefd", "arguments": { "fdname": "fd1" } } <- { "return": {} } -EQMP - - { - .name = "add-fd", - .args_type = "fdset-id:i?,opaque:s?", - .params = "add-fd fdset-id opaque", - .help = "Add a file descriptor, that was passed via SCM rights, to an fd set", - .mhandler.cmd_new = qmp_marshal_add_fd, - }, - -SQMP add-fd ------- @@ -1969,17 +1371,6 @@ Notes: (1) The list of fd sets is shared by all monitor connections. (2) If "fdset-id" is not specified, a new fd set will be created. -EQMP - - { - .name = "remove-fd", - .args_type = "fdset-id:i,fd:i?", - .params = "remove-fd fdset-id fd", - .help = "Remove a file descriptor from an fd set", - .mhandler.cmd_new = qmp_marshal_remove_fd, - }, - -SQMP remove-fd --------- @@ -2002,16 +1393,6 @@ Notes: (2) If "fd" is not specified, all file descriptors in "fdset-id" will be removed. -EQMP - - { - .name = "query-fdsets", - .args_type = "", - .help = "Return information describing all fd sets", - .mhandler.cmd_new = qmp_marshal_query_fdsets, - }, - -SQMP query-fdsets ------------- @@ -2052,15 +1433,6 @@ Example: Note: The list of fd sets is shared by all monitor connections. -EQMP - - { - .name = "block_passwd", - .args_type = "device:s?,node-name:s?,password:s", - .mhandler.cmd_new = qmp_marshal_block_passwd, - }, - -SQMP block_passwd ------------ @@ -2078,15 +1450,6 @@ Example: "password": "12345" } } <- { "return": {} } -EQMP - - { - .name = "block_set_io_throttle", - .args_type = "device:B,bps:l,bps_rd:l,bps_wr:l,iops:l,iops_rd:l,iops_wr:l,bps_max:l?,bps_rd_max:l?,bps_wr_max:l?,iops_max:l?,iops_rd_max:l?,iops_wr_max:l?,bps_max_length:l?,bps_rd_max_length:l?,bps_wr_max_length:l?,iops_max_length:l?,iops_rd_max_length:l?,iops_wr_max_length:l?,iops_size:l?,group:s?", - .mhandler.cmd_new = qmp_marshal_block_set_io_throttle, - }, - -SQMP block_set_io_throttle ------------ @@ -2135,15 +1498,6 @@ Example: "iops_size": 0 } } <- { "return": {} } -EQMP - - { - .name = "set_password", - .args_type = "protocol:s,password:s,connected:s?", - .mhandler.cmd_new = qmp_marshal_set_password, - }, - -SQMP set_password ------------ @@ -2161,15 +1515,6 @@ Example: "password": "secret" } } <- { "return": {} } -EQMP - - { - .name = "expire_password", - .args_type = "protocol:s,time:s", - .mhandler.cmd_new = qmp_marshal_expire_password, - }, - -SQMP expire_password --------------- @@ -2186,15 +1531,6 @@ Example: "time": "+60" } } <- { "return": {} } -EQMP - - { - .name = "add_client", - .args_type = "protocol:s,fdname:s,skipauth:b?,tls:b?", - .mhandler.cmd_new = qmp_marshal_add_client, - }, - -SQMP add_client ---------- @@ -2213,16 +1549,6 @@ Example: "fdname": "myclient" } } <- { "return": {} } -EQMP - { - .name = "qmp_capabilities", - .args_type = "", - .params = "", - .help = "enable QMP capabilities", - .mhandler.cmd_new = qmp_capabilities, - }, - -SQMP qmp_capabilities ---------------- @@ -2237,21 +1563,12 @@ Example: Note: This command must be issued before issuing any other command. -EQMP - - { - .name = "human-monitor-command", - .args_type = "command-line:s,cpu-index:i?", - .mhandler.cmd_new = qmp_marshal_human_monitor_command, - }, - -SQMP human-monitor-command --------------------- Execute a Human Monitor command. -Arguments: +Arguments: - command-line: the command name and its arguments, just like the Human Monitor's shell (json-string) @@ -2282,13 +1599,7 @@ Notes: 3. Query Commands ================= -HXCOMM Each query command below is inside a SQMP/EQMP section, do NOT change -HXCOMM this! We will possibly move query commands definitions inside those -HXCOMM sections, just like regular commands. -EQMP - -SQMP query-version ------------- @@ -2316,15 +1627,6 @@ Example: } } -EQMP - - { - .name = "query-version", - .args_type = "", - .mhandler.cmd_new = qmp_marshal_query_version, - }, - -SQMP query-commands -------------- @@ -2353,15 +1655,6 @@ Example: Note: This example has been shortened as the real response is too long. -EQMP - - { - .name = "query-commands", - .args_type = "", - .mhandler.cmd_new = qmp_marshal_query_commands, - }, - -SQMP query-events -------------- @@ -2390,15 +1683,6 @@ Example: Note: This example has been shortened as the real response is too long. -EQMP - - { - .name = "query-events", - .args_type = "", - .mhandler.cmd_new = qmp_marshal_query_events, - }, - -SQMP query-qmp-schema ---------------- @@ -2407,15 +1691,6 @@ named schema entities. Entities are commands, events and various types. See docs/qapi-code-gen.txt for information on their structure and intended use. -EQMP - - { - .name = "query-qmp-schema", - .args_type = "", - .mhandler.cmd_new = qmp_query_qmp_schema, - }, - -SQMP query-chardev ------------- @@ -2452,15 +1727,6 @@ Example: ] } -EQMP - - { - .name = "query-chardev", - .args_type = "", - .mhandler.cmd_new = qmp_marshal_query_chardev, - }, - -SQMP query-chardev-backends ------------- @@ -2493,15 +1759,6 @@ Example: ] } -EQMP - - { - .name = "query-chardev-backends", - .args_type = "", - .mhandler.cmd_new = qmp_marshal_query_chardev_backends, - }, - -SQMP query-block ----------- @@ -2677,15 +1934,6 @@ Example: ] } -EQMP - - { - .name = "query-block", - .args_type = "", - .mhandler.cmd_new = qmp_marshal_query_block, - }, - -SQMP query-blockstats ---------------- @@ -2874,15 +2122,6 @@ Example: ] } -EQMP - - { - .name = "query-blockstats", - .args_type = "query-nodes:b?", - .mhandler.cmd_new = qmp_marshal_query_blockstats, - }, - -SQMP query-cpus ---------- @@ -2929,15 +2168,6 @@ Example: ] } -EQMP - - { - .name = "query-cpus", - .args_type = "", - .mhandler.cmd_new = qmp_marshal_query_cpus, - }, - -SQMP query-iothreads --------------- @@ -2968,15 +2198,6 @@ Example: ] } -EQMP - - { - .name = "query-iothreads", - .args_type = "", - .mhandler.cmd_new = qmp_marshal_query_iothreads, - }, - -SQMP query-pci --------- @@ -3073,7 +2294,7 @@ Example: }, "function":0, "regions":[ - + ] }, { @@ -3090,7 +2311,7 @@ Example: }, "function":0, "regions":[ - + ] }, { @@ -3185,15 +2406,6 @@ Example: Note: This example has been shortened as the real response is too long. -EQMP - - { - .name = "query-pci", - .args_type = "", - .mhandler.cmd_new = qmp_marshal_query_pci, - }, - -SQMP query-kvm --------- @@ -3209,15 +2421,6 @@ Example: -> { "execute": "query-kvm" } <- { "return": { "enabled": true, "present": true } } -EQMP - - { - .name = "query-kvm", - .args_type = "", - .mhandler.cmd_new = qmp_marshal_query_kvm, - }, - -SQMP query-status ------------ @@ -3249,15 +2452,6 @@ Example: -> { "execute": "query-status" } <- { "return": { "running": true, "singlestep": false, "status": "running" } } -EQMP - - { - .name = "query-status", - .args_type = "", - .mhandler.cmd_new = qmp_marshal_query_status, - }, - -SQMP query-mice ---------- @@ -3293,15 +2487,6 @@ Example: ] } -EQMP - - { - .name = "query-mice", - .args_type = "", - .mhandler.cmd_new = qmp_marshal_query_mice, - }, - -SQMP query-vnc --------- @@ -3356,20 +2541,6 @@ Example: } } -EQMP - - { - .name = "query-vnc", - .args_type = "", - .mhandler.cmd_new = qmp_marshal_query_vnc, - }, - { - .name = "query-vnc-servers", - .args_type = "", - .mhandler.cmd_new = qmp_marshal_query_vnc_servers, - }, - -SQMP query-spice ----------- @@ -3437,17 +2608,6 @@ Example: } } -EQMP - -#if defined(CONFIG_SPICE) - { - .name = "query-spice", - .args_type = "", - .mhandler.cmd_new = qmp_marshal_query_spice, - }, -#endif - -SQMP query-name ---------- @@ -3462,15 +2622,6 @@ Example: -> { "execute": "query-name" } <- { "return": { "name": "qemu-name" } } -EQMP - - { - .name = "query-name", - .args_type = "", - .mhandler.cmd_new = qmp_marshal_query_name, - }, - -SQMP query-uuid ---------- @@ -3485,15 +2636,6 @@ Example: -> { "execute": "query-uuid" } <- { "return": { "UUID": "550e8400-e29b-41d4-a716-446655440000" } } -EQMP - - { - .name = "query-uuid", - .args_type = "", - .mhandler.cmd_new = qmp_marshal_query_uuid, - }, - -SQMP query-command-line-options -------------------------- @@ -3534,15 +2676,6 @@ Example: ] } -EQMP - - { - .name = "query-command-line-options", - .args_type = "option:s?", - .mhandler.cmd_new = qmp_marshal_query_command_line_options, - }, - -SQMP query-migrate ------------- @@ -3562,8 +2695,8 @@ The main json-object contains the following: - "setup-time" amount of setup time in milliseconds _before_ the iterations begin but _after_ the QMP command is issued. This is designed to provide an accounting of any activities - (such as RDMA pinning) which may be expensive, but do not - actually occur during the iterative migration rounds + (such as RDMA pinning) which may be expensive, but do not + actually occur during the iterative migration rounds themselves. (json-int) - "downtime": only present when migration has finished correctly total amount in ms for downtime that happened (json-int) @@ -3712,15 +2845,6 @@ Examples: } } -EQMP - - { - .name = "query-migrate", - .args_type = "", - .mhandler.cmd_new = qmp_marshal_query_migrate, - }, - -SQMP migrate-set-capabilities ------------------------ @@ -3741,15 +2865,6 @@ Example: -> { "execute": "migrate-set-capabilities" , "arguments": { "capabilities": [ { "capability": "xbzrle", "state": true } ] } } -EQMP - - { - .name = "migrate-set-capabilities", - .args_type = "capabilities:q", - .params = "capability:s,state:b", - .mhandler.cmd_new = qmp_marshal_migrate_set_capabilities, - }, -SQMP query-migrate-capabilities -------------------------- @@ -3779,15 +2894,6 @@ Example: {"state": false, "capability": "postcopy-ram"} ]} -EQMP - - { - .name = "query-migrate-capabilities", - .args_type = "", - .mhandler.cmd_new = qmp_marshal_query_migrate_capabilities, - }, - -SQMP migrate-set-parameters ---------------------- @@ -3808,15 +2914,6 @@ Example: -> { "execute": "migrate-set-parameters" , "arguments": { "compress-level": 1 } } -EQMP - - { - .name = "migrate-set-parameters", - .args_type = - "compress-level:i?,compress-threads:i?,decompress-threads:i?,cpu-throttle-initial:i?,cpu-throttle-increment:i?", - .mhandler.cmd_new = qmp_marshal_migrate_set_parameters, - }, -SQMP query-migrate-parameters ------------------------ @@ -3846,15 +2943,6 @@ Example: } } -EQMP - - { - .name = "query-migrate-parameters", - .args_type = "", - .mhandler.cmd_new = qmp_marshal_query_migrate_parameters, - }, - -SQMP query-balloon ------------- @@ -3874,114 +2962,6 @@ Example: } } -EQMP - - { - .name = "query-balloon", - .args_type = "", - .mhandler.cmd_new = qmp_marshal_query_balloon, - }, - - { - .name = "query-block-jobs", - .args_type = "", - .mhandler.cmd_new = qmp_marshal_query_block_jobs, - }, - - { - .name = "qom-list", - .args_type = "path:s", - .mhandler.cmd_new = qmp_marshal_qom_list, - }, - - { - .name = "qom-set", - .args_type = "path:s,property:s,value:q", - .mhandler.cmd_new = qmp_marshal_qom_set, - }, - - { - .name = "qom-get", - .args_type = "path:s,property:s", - .mhandler.cmd_new = qmp_marshal_qom_get, - }, - - { - .name = "nbd-server-start", - .args_type = "addr:q,tls-creds:s?", - .mhandler.cmd_new = qmp_marshal_nbd_server_start, - }, - { - .name = "nbd-server-add", - .args_type = "device:B,writable:b?", - .mhandler.cmd_new = qmp_marshal_nbd_server_add, - }, - { - .name = "nbd-server-stop", - .args_type = "", - .mhandler.cmd_new = qmp_marshal_nbd_server_stop, - }, - - { - .name = "change-vnc-password", - .args_type = "password:s", - .mhandler.cmd_new = qmp_marshal_change_vnc_password, - }, - { - .name = "qom-list-types", - .args_type = "implements:s?,abstract:b?", - .mhandler.cmd_new = qmp_marshal_qom_list_types, - }, - - { - .name = "device-list-properties", - .args_type = "typename:s", - .mhandler.cmd_new = qmp_marshal_device_list_properties, - }, - - { - .name = "query-machines", - .args_type = "", - .mhandler.cmd_new = qmp_marshal_query_machines, - }, - - { - .name = "query-cpu-definitions", - .args_type = "", - .mhandler.cmd_new = qmp_marshal_query_cpu_definitions, - }, - - { - .name = "query-cpu-model-expansion", - .args_type = "type:s,model:q", - .mhandler.cmd_new = qmp_marshal_query_cpu_model_expansion, - }, - - { - .name = "query-cpu-model-comparison", - .args_type = "modela:q,modelb:q", - .mhandler.cmd_new = qmp_marshal_query_cpu_model_comparison, - }, - - { - .name = "query-cpu-model-baseline", - .args_type = "modela:q,modelb:q", - .mhandler.cmd_new = qmp_marshal_query_cpu_model_baseline, - }, - - { - .name = "query-target", - .args_type = "", - .mhandler.cmd_new = qmp_marshal_query_target, - }, - - { - .name = "query-tpm", - .args_type = "", - .mhandler.cmd_new = qmp_marshal_query_tpm, - }, - -SQMP query-tpm --------- @@ -4007,15 +2987,6 @@ Example: ] } -EQMP - - { - .name = "query-tpm-models", - .args_type = "", - .mhandler.cmd_new = qmp_marshal_query_tpm_models, - }, - -SQMP query-tpm-models ---------------- @@ -4028,15 +2999,6 @@ Example: -> { "execute": "query-tpm-models" } <- { "return": [ "tpm-tis" ] } -EQMP - - { - .name = "query-tpm-types", - .args_type = "", - .mhandler.cmd_new = qmp_marshal_query_tpm_types, - }, - -SQMP query-tpm-types --------------- @@ -4049,15 +3011,6 @@ Example: -> { "execute": "query-tpm-types" } <- { "return": [ "passthrough" ] } -EQMP - - { - .name = "chardev-add", - .args_type = "id:s,backend:q", - .mhandler.cmd_new = qmp_marshal_chardev_add, - }, - -SQMP chardev-add ---------------- @@ -4086,16 +3039,6 @@ Examples: "backend" : { "type" : "pty", "data" : {} } } } <- { "return": { "pty" : "/dev/pty/42" } } -EQMP - - { - .name = "chardev-remove", - .args_type = "id:s", - .mhandler.cmd_new = qmp_marshal_chardev_remove, - }, - - -SQMP chardev-remove -------------- @@ -4110,14 +3053,6 @@ Example: -> { "execute": "chardev-remove", "arguments": { "id" : "foo" } } <- { "return": {} } -EQMP - { - .name = "query-rx-filter", - .args_type = "name:s?", - .mhandler.cmd_new = qmp_marshal_query_rx_filter, - }, - -SQMP query-rx-filter --------------- @@ -4175,15 +3110,6 @@ Example: ] } -EQMP - - { - .name = "blockdev-add", - .args_type = "options:q", - .mhandler.cmd_new = qmp_marshal_blockdev_add, - }, - -SQMP blockdev-add ------------ @@ -4234,15 +3160,6 @@ Example (2): <- { "return": {} } -EQMP - - { - .name = "x-blockdev-del", - .args_type = "id:s?,node-name:s?", - .mhandler.cmd_new = qmp_marshal_x_blockdev_del, - }, - -SQMP x-blockdev-del ------------ Since 2.5 @@ -4291,15 +3208,6 @@ Example: } <- { "return": {} } -EQMP - - { - .name = "blockdev-open-tray", - .args_type = "device:s,force:b?", - .mhandler.cmd_new = qmp_marshal_blockdev_open_tray, - }, - -SQMP blockdev-open-tray ------------------ @@ -4339,15 +3247,6 @@ Example: <- { "return": {} } -EQMP - - { - .name = "blockdev-close-tray", - .args_type = "device:s", - .mhandler.cmd_new = qmp_marshal_blockdev_close_tray, - }, - -SQMP blockdev-close-tray ------------------- @@ -4374,15 +3273,6 @@ Example: <- { "return": {} } -EQMP - - { - .name = "x-blockdev-remove-medium", - .args_type = "device:s", - .mhandler.cmd_new = qmp_marshal_x_blockdev_remove_medium, - }, - -SQMP x-blockdev-remove-medium ------------------------ @@ -4422,15 +3312,6 @@ Example: <- { "return": {} } -EQMP - - { - .name = "x-blockdev-insert-medium", - .args_type = "device:s,node-name:s", - .mhandler.cmd_new = qmp_marshal_x_blockdev_insert_medium, - }, - -SQMP x-blockdev-insert-medium ------------------------ @@ -4462,15 +3343,6 @@ Example: <- { "return": {} } -EQMP - - { - .name = "x-blockdev-change", - .args_type = "parent:B,child:B?,node:B?", - .mhandler.cmd_new = qmp_marshal_x_blockdev_change, - }, - -SQMP x-blockdev-change ----------------- @@ -4515,17 +3387,8 @@ Delete a quorum's node "child": "children.1" } } <- { "return": {} } -EQMP - - { - .name = "query-named-block-nodes", - .args_type = "", - .mhandler.cmd_new = qmp_marshal_query_named_block_nodes, - }, - -SQMP -@query-named-block-nodes ------------------------- +query-named-block-nodes +----------------------- Return a list of BlockDeviceInfo for all the named block driver nodes @@ -4577,15 +3440,6 @@ Example: } } } ] } -EQMP - - { - .name = "blockdev-change-medium", - .args_type = "device:B,filename:F,format:s?,read-only-mode:s?", - .mhandler.cmd_new = qmp_marshal_blockdev_change_medium, - }, - -SQMP blockdev-change-medium ---------------------- @@ -4630,15 +3484,6 @@ Examples: <- { "return": {} } -EQMP - - { - .name = "query-memdev", - .args_type = "", - .mhandler.cmd_new = qmp_marshal_query_memdev, - }, - -SQMP query-memdev ------------ @@ -4668,16 +3513,7 @@ Example (1): ] } -EQMP - - { - .name = "query-memory-devices", - .args_type = "", - .mhandler.cmd_new = qmp_marshal_query_memory_devices, - }, - -SQMP -@query-memory-devices +query-memory-devices -------------------- Return a list of memory devices. @@ -4695,17 +3531,9 @@ Example: "slot": 0}, "type": "dimm" } ] } -EQMP - { - .name = "query-acpi-ospm-status", - .args_type = "", - .mhandler.cmd_new = qmp_marshal_query_acpi_ospm_status, - }, - -SQMP -@query-acpi-ospm-status --------------------- +query-acpi-ospm-status +---------------------- Return list of ACPIOSTInfo for devices that support status reporting via ACPI _OST method. @@ -4717,17 +3545,7 @@ Example: { "slot": "2", "slot-type": "DIMM", "source": 0, "status": 0}, { "slot": "3", "slot-type": "DIMM", "source": 0, "status": 0} ]} -EQMP -#if defined TARGET_I386 - { - .name = "rtc-reset-reinjection", - .args_type = "", - .mhandler.cmd_new = qmp_marshal_rtc_reset_reinjection, - }, -#endif - -SQMP rtc-reset-reinjection --------------------- @@ -4739,15 +3557,7 @@ Example: -> { "execute": "rtc-reset-reinjection" } <- { "return": {} } -EQMP - { - .name = "trace-event-get-state", - .args_type = "name:s,vcpu:i?", - .mhandler.cmd_new = qmp_marshal_trace_event_get_state, - }, - -SQMP trace-event-get-state --------------------- @@ -4771,15 +3581,7 @@ Example: -> { "execute": "trace-event-get-state", "arguments": { "name": "qemu_memalign" } } <- { "return": [ { "name": "qemu_memalign", "state": "disabled" } ] } -EQMP - { - .name = "trace-event-set-state", - .args_type = "name:s,enable:b,ignore-unavailable:b?,vcpu:i?", - .mhandler.cmd_new = qmp_marshal_trace_event_set_state, - }, - -SQMP trace-event-set-state --------------------- @@ -4806,17 +3608,9 @@ Example: -> { "execute": "trace-event-set-state", "arguments": { "name": "qemu_memalign", "enable": "true" } } <- { "return": {} } -EQMP - { - .name = "input-send-event", - .args_type = "console:i?,events:q", - .mhandler.cmd_new = qmp_marshal_input_send_event, - }, - -SQMP -@input-send-event ------------------ +input-send-event +---------------- Send input event to guest. @@ -4870,15 +3664,6 @@ Move mouse pointer to absolute coordinates (20000, 400). { "type": "abs", "data" : { "axis": "y", "value" : 400 } } ] } } <- { "return": {} } -EQMP - - { - .name = "block-set-write-threshold", - .args_type = "node-name:s,write-threshold:l", - .mhandler.cmd_new = qmp_marshal_block_set_write_threshold, - }, - -SQMP block-set-write-threshold ------------ @@ -4898,15 +3683,6 @@ Example: "write-threshold": 17179869184 } } <- { "return": {} } -EQMP - - { - .name = "query-rocker", - .args_type = "name:s", - .mhandler.cmd_new = qmp_marshal_query_rocker, - }, - -SQMP Show rocker switch ------------------ @@ -4919,15 +3695,6 @@ Example: -> { "execute": "query-rocker", "arguments": { "name": "sw1" } } <- { "return": {"name": "sw1", "ports": 2, "id": 1327446905938}} -EQMP - - { - .name = "query-rocker-ports", - .args_type = "name:s", - .mhandler.cmd_new = qmp_marshal_query_rocker_ports, - }, - -SQMP Show rocker switch ports ------------------------ @@ -4944,15 +3711,6 @@ Example: "autoneg": "off", "link-up": true, "speed": 10000} ]} -EQMP - - { - .name = "query-rocker-of-dpa-flows", - .args_type = "name:s,tbl-id:i?", - .mhandler.cmd_new = qmp_marshal_query_rocker_of_dpa_flows, - }, - -SQMP Show rocker switch OF-DPA flow tables ------------------------------------- @@ -4973,15 +3731,6 @@ Example: {...more...}, ]} -EQMP - - { - .name = "query-rocker-of-dpa-groups", - .args_type = "name:s,type:i?", - .mhandler.cmd_new = qmp_marshal_query_rocker_of_dpa_groups, - }, - -SQMP Show rocker OF-DPA group tables ------------------------------- @@ -5003,17 +3752,6 @@ Example: "pop-vlan": 1, "id": 251658240} ]} -EQMP - -#if defined TARGET_ARM - { - .name = "query-gic-capabilities", - .args_type = "", - .mhandler.cmd_new = qmp_marshal_query_gic_capabilities, - }, -#endif - -SQMP query-gic-capabilities --------------- @@ -5028,15 +3766,6 @@ Example: <- { "return": [{ "version": 2, "emulated": true, "kernel": false }, { "version": 3, "emulated": false, "kernel": true } ] } -EQMP - - { - .name = "query-hotpluggable-cpus", - .args_type = "", - .mhandler.cmd_new = qmp_marshal_query_hotpluggable_cpus, - }, - -SQMP Show existing/possible CPUs --------------------------- diff --git a/docs/writing-qmp-commands.txt b/docs/writing-qmp-commands.txt index 59aa77ae25..cfa6fe7c0d 100644 --- a/docs/writing-qmp-commands.txt +++ b/docs/writing-qmp-commands.txt @@ -119,17 +119,6 @@ There are a few things to be noticed: 5. Printing to the terminal is discouraged for QMP commands, we do it here because it's the easiest way to demonstrate a QMP command -Now a little hack is needed. As we're still using the old QMP server we need -to add the new command to its internal dispatch table. This step won't be -required in the near future. Open the qmp-commands.hx file and add the -following at the bottom: - - { - .name = "hello-world", - .args_type = "", - .mhandler.cmd_new = qmp_marshal_hello_world, - }, - You're done. Now build qemu, run it as suggested in the "Testing" section, and then type the following QMP command: @@ -174,21 +163,6 @@ There are two important details to be noticed: 2. The C implementation signature must follow the schema's argument ordering, which is defined by the "data" member -The last step is to update the qmp-commands.hx file: - - { - .name = "hello-world", - .args_type = "message:s?", - .mhandler.cmd_new = qmp_marshal_hello_world, - }, - -Notice that the "args_type" member got our "message" argument. The character -"s" stands for "string" and "?" means it's optional. This too must be ordered -according to the C implementation and schema file. You can look for more -examples in the qmp-commands.hx file if you need to define more arguments. - -Again, this step won't be required in the future. - Time to test our new version of the "hello-world" command. Build qemu, run it as described in the "Testing" section and then send two commands: @@ -337,7 +311,7 @@ we should add it to the hmp-commands.hx file: .args_type = "message:s?", .params = "hello-world [message]", .help = "Print message to the standard output", - .mhandler.cmd = hmp_hello_world, + .cmd = hmp_hello_world, }, STEXI @@ -454,14 +428,6 @@ There are a number of things to be noticed: 6. You have to include the "qmp-commands.h" header file in qemu-timer.c, otherwise qemu won't build -The last step is to add the correspoding entry in the qmp-commands.hx file: - - { - .name = "query-alarm-clock", - .args_type = "", - .mhandler.cmd_new = qmp_marshal_query_alarm_clock, - }, - Time to test the new command. Build qemu, run it as described in the "Testing" section and try this: @@ -518,7 +484,7 @@ in the monitor.c file. The entry for the "info alarmclock" follows: .args_type = "", .params = "", .help = "show information about the alarm clock", - .mhandler.info = hmp_info_alarm_clock, + .cmd = hmp_info_alarm_clock, }, To test this, run qemu and type "info alarmclock" in the user monitor. @@ -600,14 +566,6 @@ iteration of the loop. That's because the alarm timer method in use is the first element of the alarm_timers array. Also notice that QAPI lists are handled by hand and we return the head of the list. -To test this you have to add the corresponding qmp-commands.hx entry: - - { - .name = "query-alarm-methods", - .args_type = "", - .mhandler.cmd_new = qmp_marshal_query_alarm_methods, - }, - Now Build qemu, run it as explained in the "Testing" section and try our new command: diff --git a/hmp-commands-info.hx b/hmp-commands-info.hx index 74446c669e..19729e55ae 100644 --- a/hmp-commands-info.hx +++ b/hmp-commands-info.hx @@ -18,7 +18,7 @@ ETEXI .args_type = "", .params = "", .help = "show the version of QEMU", - .mhandler.cmd = hmp_info_version, + .cmd = hmp_info_version, }, STEXI @@ -32,7 +32,7 @@ ETEXI .args_type = "", .params = "", .help = "show the network state", - .mhandler.cmd = hmp_info_network, + .cmd = hmp_info_network, }, STEXI @@ -46,7 +46,7 @@ ETEXI .args_type = "", .params = "", .help = "show the character devices", - .mhandler.cmd = hmp_info_chardev, + .cmd = hmp_info_chardev, }, STEXI @@ -61,7 +61,7 @@ ETEXI .params = "[-n] [-v] [device]", .help = "show info of one block device or all block devices " "(-n: show named nodes; -v: show details)", - .mhandler.cmd = hmp_info_block, + .cmd = hmp_info_block, }, STEXI @@ -75,7 +75,7 @@ ETEXI .args_type = "", .params = "", .help = "show block device statistics", - .mhandler.cmd = hmp_info_blockstats, + .cmd = hmp_info_blockstats, }, STEXI @@ -89,7 +89,7 @@ ETEXI .args_type = "", .params = "", .help = "show progress of ongoing block device operations", - .mhandler.cmd = hmp_info_block_jobs, + .cmd = hmp_info_block_jobs, }, STEXI @@ -103,7 +103,7 @@ ETEXI .args_type = "", .params = "", .help = "show the cpu registers", - .mhandler.cmd = hmp_info_registers, + .cmd = hmp_info_registers, }, STEXI @@ -118,7 +118,7 @@ ETEXI .args_type = "", .params = "", .help = "show local apic state", - .mhandler.cmd = hmp_info_local_apic, + .cmd = hmp_info_local_apic, }, #endif @@ -134,7 +134,7 @@ ETEXI .args_type = "", .params = "", .help = "show io apic state", - .mhandler.cmd = hmp_info_io_apic, + .cmd = hmp_info_io_apic, }, #endif @@ -149,7 +149,7 @@ ETEXI .args_type = "", .params = "", .help = "show infos for each CPU", - .mhandler.cmd = hmp_info_cpus, + .cmd = hmp_info_cpus, }, STEXI @@ -163,7 +163,7 @@ ETEXI .args_type = "", .params = "", .help = "show the command line history", - .mhandler.cmd = hmp_info_history, + .cmd = hmp_info_history, }, STEXI @@ -180,11 +180,11 @@ ETEXI .params = "", .help = "show the interrupts statistics (if available)", #ifdef TARGET_SPARC - .mhandler.cmd = sun4m_hmp_info_irq, + .cmd = sun4m_hmp_info_irq, #elif defined(TARGET_LM32) - .mhandler.cmd = lm32_hmp_info_irq, + .cmd = lm32_hmp_info_irq, #else - .mhandler.cmd = hmp_info_irq, + .cmd = hmp_info_irq, #endif }, @@ -200,11 +200,11 @@ ETEXI .params = "", .help = "show i8259 (PIC) state", #ifdef TARGET_SPARC - .mhandler.cmd = sun4m_hmp_info_pic, + .cmd = sun4m_hmp_info_pic, #elif defined(TARGET_LM32) - .mhandler.cmd = lm32_hmp_info_pic, + .cmd = lm32_hmp_info_pic, #else - .mhandler.cmd = hmp_info_pic, + .cmd = hmp_info_pic, #endif }, #endif @@ -220,7 +220,7 @@ ETEXI .args_type = "", .params = "", .help = "show PCI info", - .mhandler.cmd = hmp_info_pci, + .cmd = hmp_info_pci, }, STEXI @@ -236,7 +236,7 @@ ETEXI .args_type = "", .params = "", .help = "show virtual to physical memory mappings", - .mhandler.cmd = hmp_info_tlb, + .cmd = hmp_info_tlb, }, #endif @@ -252,7 +252,7 @@ ETEXI .args_type = "", .params = "", .help = "show the active virtual memory mappings", - .mhandler.cmd = hmp_info_mem, + .cmd = hmp_info_mem, }, #endif @@ -267,7 +267,7 @@ ETEXI .args_type = "", .params = "", .help = "show memory tree", - .mhandler.cmd = hmp_info_mtree, + .cmd = hmp_info_mtree, }, STEXI @@ -281,7 +281,7 @@ ETEXI .args_type = "", .params = "", .help = "show dynamic compiler info", - .mhandler.cmd = hmp_info_jit, + .cmd = hmp_info_jit, }, STEXI @@ -295,7 +295,7 @@ ETEXI .args_type = "", .params = "", .help = "show dynamic compiler opcode counters", - .mhandler.cmd = hmp_info_opcount, + .cmd = hmp_info_opcount, }, STEXI @@ -309,7 +309,7 @@ ETEXI .args_type = "", .params = "", .help = "show KVM information", - .mhandler.cmd = hmp_info_kvm, + .cmd = hmp_info_kvm, }, STEXI @@ -323,7 +323,7 @@ ETEXI .args_type = "", .params = "", .help = "show NUMA information", - .mhandler.cmd = hmp_info_numa, + .cmd = hmp_info_numa, }, STEXI @@ -337,7 +337,7 @@ ETEXI .args_type = "", .params = "", .help = "show guest USB devices", - .mhandler.cmd = hmp_info_usb, + .cmd = hmp_info_usb, }, STEXI @@ -351,7 +351,7 @@ ETEXI .args_type = "", .params = "", .help = "show host USB devices", - .mhandler.cmd = hmp_info_usbhost, + .cmd = hmp_info_usbhost, }, STEXI @@ -365,7 +365,7 @@ ETEXI .args_type = "", .params = "", .help = "show profiling information", - .mhandler.cmd = hmp_info_profile, + .cmd = hmp_info_profile, }, STEXI @@ -379,7 +379,7 @@ ETEXI .args_type = "", .params = "", .help = "show capture information", - .mhandler.cmd = hmp_info_capture, + .cmd = hmp_info_capture, }, STEXI @@ -393,7 +393,7 @@ ETEXI .args_type = "", .params = "", .help = "show the currently saved VM snapshots", - .mhandler.cmd = hmp_info_snapshots, + .cmd = hmp_info_snapshots, }, STEXI @@ -407,7 +407,7 @@ ETEXI .args_type = "", .params = "", .help = "show the current VM status (running|paused)", - .mhandler.cmd = hmp_info_status, + .cmd = hmp_info_status, }, STEXI @@ -421,7 +421,7 @@ ETEXI .args_type = "", .params = "", .help = "show which guest mouse is receiving events", - .mhandler.cmd = hmp_info_mice, + .cmd = hmp_info_mice, }, STEXI @@ -435,7 +435,7 @@ ETEXI .args_type = "", .params = "", .help = "show the vnc server status", - .mhandler.cmd = hmp_info_vnc, + .cmd = hmp_info_vnc, }, STEXI @@ -450,7 +450,7 @@ ETEXI .args_type = "", .params = "", .help = "show the spice server status", - .mhandler.cmd = hmp_info_spice, + .cmd = hmp_info_spice, }, #endif @@ -465,7 +465,7 @@ ETEXI .args_type = "", .params = "", .help = "show the current VM name", - .mhandler.cmd = hmp_info_name, + .cmd = hmp_info_name, }, STEXI @@ -479,7 +479,7 @@ ETEXI .args_type = "", .params = "", .help = "show the current VM UUID", - .mhandler.cmd = hmp_info_uuid, + .cmd = hmp_info_uuid, }, STEXI @@ -493,7 +493,7 @@ ETEXI .args_type = "", .params = "", .help = "show CPU statistics", - .mhandler.cmd = hmp_info_cpustats, + .cmd = hmp_info_cpustats, }, STEXI @@ -508,7 +508,7 @@ ETEXI .args_type = "", .params = "", .help = "show user network stack connection states", - .mhandler.cmd = hmp_info_usernet, + .cmd = hmp_info_usernet, }, #endif @@ -523,7 +523,7 @@ ETEXI .args_type = "", .params = "", .help = "show migration status", - .mhandler.cmd = hmp_info_migrate, + .cmd = hmp_info_migrate, }, STEXI @@ -537,7 +537,7 @@ ETEXI .args_type = "", .params = "", .help = "show current migration capabilities", - .mhandler.cmd = hmp_info_migrate_capabilities, + .cmd = hmp_info_migrate_capabilities, }, STEXI @@ -551,7 +551,7 @@ ETEXI .args_type = "", .params = "", .help = "show current migration parameters", - .mhandler.cmd = hmp_info_migrate_parameters, + .cmd = hmp_info_migrate_parameters, }, STEXI @@ -565,7 +565,7 @@ ETEXI .args_type = "", .params = "", .help = "show current migration xbzrle cache size", - .mhandler.cmd = hmp_info_migrate_cache_size, + .cmd = hmp_info_migrate_cache_size, }, STEXI @@ -579,7 +579,7 @@ ETEXI .args_type = "", .params = "", .help = "show balloon information", - .mhandler.cmd = hmp_info_balloon, + .cmd = hmp_info_balloon, }, STEXI @@ -593,7 +593,7 @@ ETEXI .args_type = "", .params = "", .help = "show device tree", - .mhandler.cmd = hmp_info_qtree, + .cmd = hmp_info_qtree, }, STEXI @@ -607,7 +607,7 @@ ETEXI .args_type = "", .params = "", .help = "show qdev device model list", - .mhandler.cmd = hmp_info_qdm, + .cmd = hmp_info_qdm, }, STEXI @@ -621,7 +621,7 @@ ETEXI .args_type = "path:s?", .params = "[path]", .help = "show QOM composition tree", - .mhandler.cmd = hmp_info_qom_tree, + .cmd = hmp_info_qom_tree, }, STEXI @@ -635,7 +635,7 @@ ETEXI .args_type = "", .params = "", .help = "show roms", - .mhandler.cmd = hmp_info_roms, + .cmd = hmp_info_roms, }, STEXI @@ -650,7 +650,7 @@ ETEXI .params = "[name] [vcpu]", .help = "show available trace-events & their state " "(name: event name pattern; vcpu: vCPU to query, default is any)", - .mhandler.cmd = hmp_info_trace_events, + .cmd = hmp_info_trace_events, .command_completion = info_trace_events_completion, }, @@ -665,7 +665,7 @@ ETEXI .args_type = "", .params = "", .help = "show the TPM device", - .mhandler.cmd = hmp_info_tpm, + .cmd = hmp_info_tpm, }, STEXI @@ -679,7 +679,7 @@ ETEXI .args_type = "", .params = "", .help = "show memory backends", - .mhandler.cmd = hmp_info_memdev, + .cmd = hmp_info_memdev, }, STEXI @@ -693,7 +693,7 @@ ETEXI .args_type = "", .params = "", .help = "show memory devices", - .mhandler.cmd = hmp_info_memory_devices, + .cmd = hmp_info_memory_devices, }, STEXI @@ -707,7 +707,7 @@ ETEXI .args_type = "", .params = "", .help = "show iothreads", - .mhandler.cmd = hmp_info_iothreads, + .cmd = hmp_info_iothreads, }, STEXI @@ -721,7 +721,7 @@ ETEXI .args_type = "name:s", .params = "name", .help = "Show rocker switch", - .mhandler.cmd = hmp_rocker, + .cmd = hmp_rocker, }, STEXI @@ -735,7 +735,7 @@ ETEXI .args_type = "name:s", .params = "name", .help = "Show rocker ports", - .mhandler.cmd = hmp_rocker_ports, + .cmd = hmp_rocker_ports, }, STEXI @@ -749,7 +749,7 @@ ETEXI .args_type = "name:s,tbl_id:i?", .params = "name [tbl_id]", .help = "Show rocker OF-DPA flow tables", - .mhandler.cmd = hmp_rocker_of_dpa_flows, + .cmd = hmp_rocker_of_dpa_flows, }, STEXI @@ -763,7 +763,7 @@ ETEXI .args_type = "name:s,type:i?", .params = "name [type]", .help = "Show rocker OF-DPA groups", - .mhandler.cmd = hmp_rocker_of_dpa_groups, + .cmd = hmp_rocker_of_dpa_groups, }, STEXI @@ -778,7 +778,7 @@ ETEXI .args_type = "addr:l", .params = "address", .help = "Display the value of a storage key", - .mhandler.cmd = hmp_info_skeys, + .cmd = hmp_info_skeys, }, #endif @@ -793,7 +793,7 @@ ETEXI .args_type = "", .params = "", .help = "Display the latest dump status", - .mhandler.cmd = hmp_info_dump, + .cmd = hmp_info_dump, }, STEXI @@ -807,7 +807,7 @@ ETEXI .args_type = "", .params = "", .help = "Show information about hotpluggable CPUs", - .mhandler.cmd = hmp_hotpluggable_cpus, + .cmd = hmp_hotpluggable_cpus, }, STEXI diff --git a/hmp-commands.hx b/hmp-commands.hx index 74f32e515c..06bef470b9 100644 --- a/hmp-commands.hx +++ b/hmp-commands.hx @@ -14,7 +14,7 @@ ETEXI .args_type = "name:S?", .params = "[cmd]", .help = "show the help", - .mhandler.cmd = do_help_cmd, + .cmd = do_help_cmd, }, STEXI @@ -28,7 +28,7 @@ ETEXI .args_type = "device:B", .params = "device|all", .help = "commit changes to the disk images (if -snapshot is used) or backing files", - .mhandler.cmd = hmp_commit, + .cmd = hmp_commit, }, STEXI @@ -47,7 +47,7 @@ ETEXI .args_type = "", .params = "", .help = "quit the emulator", - .mhandler.cmd = hmp_quit, + .cmd = hmp_quit, }, STEXI @@ -61,7 +61,7 @@ ETEXI .args_type = "device:B,size:o", .params = "device size", .help = "resize a block image", - .mhandler.cmd = hmp_block_resize, + .cmd = hmp_block_resize, }, STEXI @@ -78,7 +78,7 @@ ETEXI .args_type = "device:B,speed:o?,base:s?", .params = "device [speed [base]]", .help = "copy data from a backing file into a block device", - .mhandler.cmd = hmp_block_stream, + .cmd = hmp_block_stream, }, STEXI @@ -92,7 +92,7 @@ ETEXI .args_type = "device:B,speed:o", .params = "device speed", .help = "set maximum speed for a background block operation", - .mhandler.cmd = hmp_block_job_set_speed, + .cmd = hmp_block_job_set_speed, }, STEXI @@ -107,7 +107,7 @@ ETEXI .params = "[-f] device", .help = "stop an active background block operation (use -f" "\n\t\t\t if the operation is currently paused)", - .mhandler.cmd = hmp_block_job_cancel, + .cmd = hmp_block_job_cancel, }, STEXI @@ -121,7 +121,7 @@ ETEXI .args_type = "device:B", .params = "device", .help = "stop an active background block operation", - .mhandler.cmd = hmp_block_job_complete, + .cmd = hmp_block_job_complete, }, STEXI @@ -136,7 +136,7 @@ ETEXI .args_type = "device:B", .params = "device", .help = "pause an active background block operation", - .mhandler.cmd = hmp_block_job_pause, + .cmd = hmp_block_job_pause, }, STEXI @@ -150,7 +150,7 @@ ETEXI .args_type = "device:B", .params = "device", .help = "resume a paused background block operation", - .mhandler.cmd = hmp_block_job_resume, + .cmd = hmp_block_job_resume, }, STEXI @@ -164,7 +164,7 @@ ETEXI .args_type = "force:-f,device:B", .params = "[-f] device", .help = "eject a removable medium (use -f to force it)", - .mhandler.cmd = hmp_eject, + .cmd = hmp_eject, }, STEXI @@ -178,7 +178,7 @@ ETEXI .args_type = "id:B", .params = "device", .help = "remove host block device", - .mhandler.cmd = hmp_drive_del, + .cmd = hmp_drive_del, }, STEXI @@ -197,7 +197,7 @@ ETEXI .args_type = "device:B,target:F,arg:s?,read-only-mode:s?", .params = "device filename [format [read-only-mode]]", .help = "change a removable medium, optional format", - .mhandler.cmd = hmp_change, + .cmd = hmp_change, }, STEXI @@ -256,7 +256,7 @@ ETEXI .args_type = "filename:F", .params = "filename", .help = "save screen into PPM image 'filename'", - .mhandler.cmd = hmp_screendump, + .cmd = hmp_screendump, }, STEXI @@ -270,7 +270,7 @@ ETEXI .args_type = "filename:F", .params = "filename", .help = "output logs to 'filename'", - .mhandler.cmd = hmp_logfile, + .cmd = hmp_logfile, }, STEXI @@ -285,7 +285,7 @@ ETEXI .params = "name on|off [vcpu]", .help = "changes status of a specific trace event " "(vcpu: vCPU to set, default is all)", - .mhandler.cmd = hmp_trace_event, + .cmd = hmp_trace_event, .command_completion = trace_event_completion, }, @@ -301,7 +301,7 @@ ETEXI .args_type = "op:s?,arg:F?", .params = "on|off|flush|set [arg]", .help = "open, close, or flush trace file, or set a new file name", - .mhandler.cmd = hmp_trace_file, + .cmd = hmp_trace_file, }, STEXI @@ -316,7 +316,7 @@ ETEXI .args_type = "items:s", .params = "item1[,...]", .help = "activate logging of the specified items", - .mhandler.cmd = hmp_log, + .cmd = hmp_log, }, STEXI @@ -330,7 +330,7 @@ ETEXI .args_type = "name:s?", .params = "[tag|id]", .help = "save a VM snapshot. If no tag or id are provided, a new snapshot is created", - .mhandler.cmd = hmp_savevm, + .cmd = hmp_savevm, }, STEXI @@ -347,7 +347,7 @@ ETEXI .args_type = "name:s", .params = "tag|id", .help = "restore a VM snapshot from its tag or id", - .mhandler.cmd = hmp_loadvm, + .cmd = hmp_loadvm, .command_completion = loadvm_completion, }, @@ -363,7 +363,7 @@ ETEXI .args_type = "name:s", .params = "tag|id", .help = "delete a VM snapshot from its tag or id", - .mhandler.cmd = hmp_delvm, + .cmd = hmp_delvm, .command_completion = delvm_completion, }, @@ -378,7 +378,7 @@ ETEXI .args_type = "option:s?", .params = "[on|off]", .help = "run emulation in singlestep mode or switch to normal mode", - .mhandler.cmd = hmp_singlestep, + .cmd = hmp_singlestep, }, STEXI @@ -393,7 +393,7 @@ ETEXI .args_type = "", .params = "", .help = "stop emulation", - .mhandler.cmd = hmp_stop, + .cmd = hmp_stop, }, STEXI @@ -407,7 +407,7 @@ ETEXI .args_type = "", .params = "", .help = "resume emulation", - .mhandler.cmd = hmp_cont, + .cmd = hmp_cont, }, STEXI @@ -421,7 +421,7 @@ ETEXI .args_type = "", .params = "", .help = "wakeup guest from suspend", - .mhandler.cmd = hmp_system_wakeup, + .cmd = hmp_system_wakeup, }, STEXI @@ -435,7 +435,7 @@ ETEXI .args_type = "device:s?", .params = "[device]", .help = "start gdbserver on given device (default 'tcp::1234'), stop with 'none'", - .mhandler.cmd = hmp_gdbserver, + .cmd = hmp_gdbserver, }, STEXI @@ -449,7 +449,7 @@ ETEXI .args_type = "fmt:/,addr:l", .params = "/fmt addr", .help = "virtual memory dump starting at 'addr'", - .mhandler.cmd = hmp_memory_dump, + .cmd = hmp_memory_dump, }, STEXI @@ -463,7 +463,7 @@ ETEXI .args_type = "fmt:/,addr:l", .params = "/fmt addr", .help = "physical memory dump starting at 'addr'", - .mhandler.cmd = hmp_physical_memory_dump, + .cmd = hmp_physical_memory_dump, }, STEXI @@ -530,7 +530,7 @@ ETEXI .args_type = "fmt:/,val:l", .params = "/fmt expr", .help = "print expression value (use $reg for CPU register access)", - .mhandler.cmd = do_print, + .cmd = do_print, }, STEXI @@ -545,7 +545,7 @@ ETEXI .args_type = "fmt:/,addr:i,index:i.", .params = "/fmt addr", .help = "I/O port read", - .mhandler.cmd = hmp_ioport_read, + .cmd = hmp_ioport_read, }, STEXI @@ -559,7 +559,7 @@ ETEXI .args_type = "fmt:/,addr:i,val:i", .params = "/fmt addr value", .help = "I/O port write", - .mhandler.cmd = hmp_ioport_write, + .cmd = hmp_ioport_write, }, STEXI @@ -573,7 +573,7 @@ ETEXI .args_type = "keys:s,hold-time:i?", .params = "keys [hold_ms]", .help = "send keys to the VM (e.g. 'sendkey ctrl-alt-f1', default hold time=100 ms)", - .mhandler.cmd = hmp_sendkey, + .cmd = hmp_sendkey, .command_completion = sendkey_completion, }, @@ -596,7 +596,7 @@ ETEXI .args_type = "", .params = "", .help = "reset the system", - .mhandler.cmd = hmp_system_reset, + .cmd = hmp_system_reset, }, STEXI @@ -610,7 +610,7 @@ ETEXI .args_type = "", .params = "", .help = "send system power down event", - .mhandler.cmd = hmp_system_powerdown, + .cmd = hmp_system_powerdown, }, STEXI @@ -624,7 +624,7 @@ ETEXI .args_type = "start:i,size:i", .params = "addr size", .help = "compute the checksum of a memory region", - .mhandler.cmd = hmp_sum, + .cmd = hmp_sum, }, STEXI @@ -638,7 +638,7 @@ ETEXI .args_type = "devname:s", .params = "device", .help = "add USB device (e.g. 'host:bus.addr' or 'host:vendor_id:product_id')", - .mhandler.cmd = hmp_usb_add, + .cmd = hmp_usb_add, }, STEXI @@ -653,7 +653,7 @@ ETEXI .args_type = "devname:s", .params = "device", .help = "remove USB device 'bus.addr'", - .mhandler.cmd = hmp_usb_del, + .cmd = hmp_usb_del, }, STEXI @@ -669,7 +669,7 @@ ETEXI .args_type = "device:O", .params = "driver[,prop=value][,...]", .help = "add device, like -device on the command line", - .mhandler.cmd = hmp_device_add, + .cmd = hmp_device_add, .command_completion = device_add_completion, }, @@ -684,7 +684,7 @@ ETEXI .args_type = "id:s", .params = "device", .help = "remove device", - .mhandler.cmd = hmp_device_del, + .cmd = hmp_device_del, .command_completion = device_del_completion, }, @@ -700,7 +700,7 @@ ETEXI .args_type = "index:i", .params = "index", .help = "set the default CPU", - .mhandler.cmd = hmp_cpu, + .cmd = hmp_cpu, }, STEXI @@ -714,7 +714,7 @@ ETEXI .args_type = "dx_str:s,dy_str:s,dz_str:s?", .params = "dx dy [dz]", .help = "send mouse move events", - .mhandler.cmd = hmp_mouse_move, + .cmd = hmp_mouse_move, }, STEXI @@ -729,7 +729,7 @@ ETEXI .args_type = "button_state:i", .params = "state", .help = "change mouse button state (1=L, 2=M, 4=R)", - .mhandler.cmd = hmp_mouse_button, + .cmd = hmp_mouse_button, }, STEXI @@ -743,7 +743,7 @@ ETEXI .args_type = "index:i", .params = "index", .help = "set which mouse device receives events", - .mhandler.cmd = hmp_mouse_set, + .cmd = hmp_mouse_set, }, STEXI @@ -761,7 +761,7 @@ ETEXI .args_type = "path:F,freq:i?,bits:i?,nchannels:i?", .params = "path [frequency [bits [channels]]]", .help = "capture audio to a wave file (default frequency=44100 bits=16 channels=2)", - .mhandler.cmd = hmp_wavcapture, + .cmd = hmp_wavcapture, }, STEXI @item wavcapture @var{filename} [@var{frequency} [@var{bits} [@var{channels}]]] @@ -782,7 +782,7 @@ ETEXI .args_type = "n:i", .params = "capture index", .help = "stop capture", - .mhandler.cmd = hmp_stopcapture, + .cmd = hmp_stopcapture, }, STEXI @item stopcapture @var{index} @@ -798,7 +798,7 @@ ETEXI .args_type = "val:l,size:i,filename:s", .params = "addr size file", .help = "save to disk virtual memory dump starting at 'addr' of size 'size'", - .mhandler.cmd = hmp_memsave, + .cmd = hmp_memsave, }, STEXI @@ -812,7 +812,7 @@ ETEXI .args_type = "val:l,size:i,filename:s", .params = "addr size file", .help = "save to disk physical memory dump starting at 'addr' of size 'size'", - .mhandler.cmd = hmp_pmemsave, + .cmd = hmp_pmemsave, }, STEXI @@ -826,7 +826,7 @@ ETEXI .args_type = "bootdevice:s", .params = "bootdevice", .help = "define new values for the boot device list", - .mhandler.cmd = hmp_boot_set, + .cmd = hmp_boot_set, }, STEXI @@ -844,7 +844,7 @@ ETEXI .args_type = "", .params = "", .help = "inject an NMI", - .mhandler.cmd = hmp_nmi, + .cmd = hmp_nmi, }, STEXI @item nmi @var{cpu} @@ -858,7 +858,7 @@ ETEXI .args_type = "device:s,data:s", .params = "device data", .help = "Write to a ring buffer character device", - .mhandler.cmd = hmp_ringbuf_write, + .cmd = hmp_ringbuf_write, .command_completion = ringbuf_write_completion, }, @@ -875,7 +875,7 @@ ETEXI .args_type = "device:s,size:i", .params = "device size", .help = "Read from a ring buffer character device", - .mhandler.cmd = hmp_ringbuf_read, + .cmd = hmp_ringbuf_read, .command_completion = ringbuf_write_completion, }, @@ -901,7 +901,7 @@ ETEXI " full copy of disk\n\t\t\t -i for migration without " "shared storage with incremental copy of disk " "(base image shared between src and destination)", - .mhandler.cmd = hmp_migrate, + .cmd = hmp_migrate, }, @@ -918,7 +918,7 @@ ETEXI .args_type = "", .params = "", .help = "cancel the current VM migration", - .mhandler.cmd = hmp_migrate_cancel, + .cmd = hmp_migrate_cancel, }, STEXI @@ -933,7 +933,7 @@ ETEXI .args_type = "uri:s", .params = "uri", .help = "Continue an incoming migration from an -incoming defer", - .mhandler.cmd = hmp_migrate_incoming, + .cmd = hmp_migrate_incoming, }, STEXI @@ -954,7 +954,7 @@ ETEXI "The cache size affects the number of cache misses." "In case of a high cache miss ratio you need to increase" " the cache size", - .mhandler.cmd = hmp_migrate_set_cache_size, + .cmd = hmp_migrate_set_cache_size, }, STEXI @@ -969,7 +969,7 @@ ETEXI .params = "value", .help = "set maximum speed (in bytes) for migrations. " "Defaults to MB if no size suffix is specified, ie. B/K/M/G/T", - .mhandler.cmd = hmp_migrate_set_speed, + .cmd = hmp_migrate_set_speed, }, STEXI @@ -983,7 +983,7 @@ ETEXI .args_type = "value:T", .params = "value", .help = "set maximum tolerated downtime (in seconds) for migrations", - .mhandler.cmd = hmp_migrate_set_downtime, + .cmd = hmp_migrate_set_downtime, }, STEXI @@ -997,7 +997,7 @@ ETEXI .args_type = "capability:s,state:b", .params = "capability state", .help = "Enable/Disable the usage of a capability for migration", - .mhandler.cmd = hmp_migrate_set_capability, + .cmd = hmp_migrate_set_capability, .command_completion = migrate_set_capability_completion, }, @@ -1012,7 +1012,7 @@ ETEXI .args_type = "parameter:s,value:s", .params = "parameter value", .help = "Set the parameter for migration", - .mhandler.cmd = hmp_migrate_set_parameter, + .cmd = hmp_migrate_set_parameter, .command_completion = migrate_set_parameter_completion, }, @@ -1029,7 +1029,7 @@ ETEXI .help = "Followup to a migration command to switch the migration" " to postcopy mode. The postcopy-ram capability must " "be set before the original migration command.", - .mhandler.cmd = hmp_migrate_start_postcopy, + .cmd = hmp_migrate_start_postcopy, }, STEXI @@ -1044,7 +1044,7 @@ ETEXI .args_type = "protocol:s,hostname:s,port:i?,tls-port:i?,cert-subject:s?", .params = "protocol hostname port tls-port cert-subject", .help = "set migration information for remote display", - .mhandler.cmd = hmp_client_migrate_info, + .cmd = hmp_client_migrate_info, }, STEXI @@ -1067,7 +1067,7 @@ ETEXI "-s: dump in kdump-compressed format, with snappy compression.\n\t\t\t" "begin: the starting physical address.\n\t\t\t" "length: the memory size, in bytes.", - .mhandler.cmd = hmp_dump_guest_memory, + .cmd = hmp_dump_guest_memory, }, @@ -1094,7 +1094,7 @@ ETEXI .args_type = "filename:F", .params = "", .help = "Save guest storage keys into file 'filename'.\n", - .mhandler.cmd = hmp_dump_skeys, + .cmd = hmp_dump_skeys, }, #endif @@ -1116,7 +1116,7 @@ ETEXI "The default format is qcow2. The -n flag requests QEMU\n\t\t\t" "to reuse the image found in new-image-file, instead of\n\t\t\t" "recreating it from scratch.", - .mhandler.cmd = hmp_snapshot_blkdev, + .cmd = hmp_snapshot_blkdev, }, STEXI @@ -1132,7 +1132,7 @@ ETEXI .help = "take an internal snapshot of device.\n\t\t\t" "The format of the image used by device must\n\t\t\t" "support it, such as qcow2.\n\t\t\t", - .mhandler.cmd = hmp_snapshot_blkdev_internal, + .cmd = hmp_snapshot_blkdev_internal, }, STEXI @@ -1150,7 +1150,7 @@ ETEXI "the snapshot matching both id and name.\n\t\t\t" "The format of the image used by device must\n\t\t\t" "support it, such as qcow2.\n\t\t\t", - .mhandler.cmd = hmp_snapshot_delete_blkdev_internal, + .cmd = hmp_snapshot_delete_blkdev_internal, }, STEXI @@ -1171,7 +1171,7 @@ ETEXI "in new-image-file, instead of recreating it from scratch.\n\t\t\t" "The -f flag requests QEMU to copy the whole disk,\n\t\t\t" "so that the result does not need a backing file.\n\t\t\t", - .mhandler.cmd = hmp_drive_mirror, + .cmd = hmp_drive_mirror, }, STEXI @item drive_mirror @@ -1194,7 +1194,7 @@ ETEXI "so that the result does not need a backing file.\n\t\t\t" "The -c flag requests QEMU to compress backup data\n\t\t\t" "(if the target format supports it).\n\t\t\t", - .mhandler.cmd = hmp_drive_backup, + .cmd = hmp_drive_backup, }, STEXI @item drive_backup @@ -1212,7 +1212,7 @@ ETEXI "[,snapshot=on|off][,cache=on|off]\n" "[,readonly=on|off][,copy-on-read=on|off]", .help = "add drive to PCI storage controller", - .mhandler.cmd = hmp_drive_add, + .cmd = hmp_drive_add, }, STEXI @@ -1236,7 +1236,7 @@ ETEXI " = error string or 32bit\n\t\t\t" " = 32bit x 4\n\t\t\t" " = 32bit x 4", - .mhandler.cmd = hmp_pcie_aer_inject_error, + .cmd = hmp_pcie_aer_inject_error, }, STEXI @@ -1250,7 +1250,7 @@ ETEXI .args_type = "device:s,opts:s?", .params = "tap|user|socket|vde|netmap|bridge|vhost-user|dump [options]", .help = "add host VLAN client", - .mhandler.cmd = hmp_host_net_add, + .cmd = hmp_host_net_add, .command_completion = host_net_add_completion, }, @@ -1265,7 +1265,7 @@ ETEXI .args_type = "vlan_id:i,device:s", .params = "vlan_id name", .help = "remove host VLAN client", - .mhandler.cmd = hmp_host_net_remove, + .cmd = hmp_host_net_remove, .command_completion = host_net_remove_completion, }, @@ -1280,7 +1280,7 @@ ETEXI .args_type = "netdev:O", .params = "[user|tap|socket|vde|bridge|hubport|netmap|vhost-user],id=str[,prop=value][,...]", .help = "add host network device", - .mhandler.cmd = hmp_netdev_add, + .cmd = hmp_netdev_add, .command_completion = netdev_add_completion, }, @@ -1295,7 +1295,7 @@ ETEXI .args_type = "id:s", .params = "id", .help = "remove host network device", - .mhandler.cmd = hmp_netdev_del, + .cmd = hmp_netdev_del, .command_completion = netdev_del_completion, }, @@ -1310,7 +1310,7 @@ ETEXI .args_type = "object:O", .params = "[qom-type=]type,id=str[,prop=value][,...]", .help = "create QOM object", - .mhandler.cmd = hmp_object_add, + .cmd = hmp_object_add, .command_completion = object_add_completion, }, @@ -1325,7 +1325,7 @@ ETEXI .args_type = "id:s", .params = "id", .help = "destroy QOM object", - .mhandler.cmd = hmp_object_del, + .cmd = hmp_object_del, .command_completion = object_del_completion, }, @@ -1341,7 +1341,7 @@ ETEXI .args_type = "arg1:s,arg2:s?,arg3:s?", .params = "[vlan_id name] [tcp|udp]:[hostaddr]:hostport-[guestaddr]:guestport", .help = "redirect TCP or UDP connections from host to guest (requires -net user)", - .mhandler.cmd = hmp_hostfwd_add, + .cmd = hmp_hostfwd_add, }, #endif STEXI @@ -1356,7 +1356,7 @@ ETEXI .args_type = "arg1:s,arg2:s?,arg3:s?", .params = "[vlan_id name] [tcp|udp]:[hostaddr]:hostport", .help = "remove host-to-guest TCP or UDP redirection", - .mhandler.cmd = hmp_hostfwd_remove, + .cmd = hmp_hostfwd_remove, }, #endif @@ -1371,7 +1371,7 @@ ETEXI .args_type = "value:M", .params = "target", .help = "request VM to change its memory allocation (in MB)", - .mhandler.cmd = hmp_balloon, + .cmd = hmp_balloon, }, STEXI @@ -1385,7 +1385,7 @@ ETEXI .args_type = "name:s,up:b", .params = "name on|off", .help = "change the link status of a network adapter", - .mhandler.cmd = hmp_set_link, + .cmd = hmp_set_link, .command_completion = set_link_completion, }, @@ -1400,7 +1400,7 @@ ETEXI .args_type = "action:s", .params = "[reset|shutdown|poweroff|pause|debug|none]", .help = "change watchdog action", - .mhandler.cmd = hmp_watchdog_action, + .cmd = hmp_watchdog_action, .command_completion = watchdog_action_completion, }, @@ -1415,7 +1415,7 @@ ETEXI .args_type = "aclname:s", .params = "aclname", .help = "list rules in the access control list", - .mhandler.cmd = hmp_acl_show, + .cmd = hmp_acl_show, }, STEXI @@ -1432,7 +1432,7 @@ ETEXI .args_type = "aclname:s,policy:s", .params = "aclname allow|deny", .help = "set default access control list policy", - .mhandler.cmd = hmp_acl_policy, + .cmd = hmp_acl_policy, }, STEXI @@ -1448,7 +1448,7 @@ ETEXI .args_type = "aclname:s,match:s,policy:s,index:i?", .params = "aclname match allow|deny [index]", .help = "add a match rule to the access control list", - .mhandler.cmd = hmp_acl_add, + .cmd = hmp_acl_add, }, STEXI @@ -1467,7 +1467,7 @@ ETEXI .args_type = "aclname:s,match:s", .params = "aclname match", .help = "remove a match rule from the access control list", - .mhandler.cmd = hmp_acl_remove, + .cmd = hmp_acl_remove, }, STEXI @@ -1481,7 +1481,7 @@ ETEXI .args_type = "aclname:s", .params = "aclname", .help = "reset the access control list", - .mhandler.cmd = hmp_acl_reset, + .cmd = hmp_acl_reset, }, STEXI @@ -1496,7 +1496,7 @@ ETEXI .args_type = "all:-a,writable:-w,uri:s", .params = "nbd_server_start [-a] [-w] host:port", .help = "serve block devices on the given host and port", - .mhandler.cmd = hmp_nbd_server_start, + .cmd = hmp_nbd_server_start, }, STEXI @item nbd_server_start @var{host}:@var{port} @@ -1512,7 +1512,7 @@ ETEXI .args_type = "writable:-w,device:B", .params = "nbd_server_add [-w] device", .help = "export a block device via NBD", - .mhandler.cmd = hmp_nbd_server_add, + .cmd = hmp_nbd_server_add, }, STEXI @item nbd_server_add @var{device} @@ -1527,7 +1527,7 @@ ETEXI .args_type = "", .params = "nbd_server_stop", .help = "stop serving block devices using the NBD protocol", - .mhandler.cmd = hmp_nbd_server_stop, + .cmd = hmp_nbd_server_stop, }, STEXI @item nbd_server_stop @@ -1543,7 +1543,7 @@ ETEXI .args_type = "broadcast:-b,cpu_index:i,bank:i,status:l,mcg_status:l,addr:l,misc:l", .params = "[-b] cpu bank status mcgstatus addr misc", .help = "inject a MCE on the given CPU [and broadcast to other CPUs with -b option]", - .mhandler.cmd = hmp_mce, + .cmd = hmp_mce, }, #endif @@ -1558,7 +1558,7 @@ ETEXI .args_type = "fdname:s", .params = "getfd name", .help = "receive a file descriptor via SCM rights and assign it a name", - .mhandler.cmd = hmp_getfd, + .cmd = hmp_getfd, }, STEXI @@ -1574,7 +1574,7 @@ ETEXI .args_type = "fdname:s", .params = "closefd name", .help = "close a file descriptor previously passed via SCM rights", - .mhandler.cmd = hmp_closefd, + .cmd = hmp_closefd, }, STEXI @@ -1590,7 +1590,7 @@ ETEXI .args_type = "device:B,password:s", .params = "block_passwd device password", .help = "set the password of encrypted block devices", - .mhandler.cmd = hmp_block_passwd, + .cmd = hmp_block_passwd, }, STEXI @@ -1604,7 +1604,7 @@ ETEXI .args_type = "device:B,bps:l,bps_rd:l,bps_wr:l,iops:l,iops_rd:l,iops_wr:l", .params = "device bps bps_rd bps_wr iops iops_rd iops_wr", .help = "change I/O throttle limits for a block drive", - .mhandler.cmd = hmp_block_set_io_throttle, + .cmd = hmp_block_set_io_throttle, }, STEXI @@ -1618,7 +1618,7 @@ ETEXI .args_type = "protocol:s,password:s,connected:s?", .params = "protocol password action-if-connected", .help = "set spice/vnc password", - .mhandler.cmd = hmp_set_password, + .cmd = hmp_set_password, }, STEXI @@ -1637,7 +1637,7 @@ ETEXI .args_type = "protocol:s,time:s", .params = "protocol time", .help = "set spice/vnc password expire-time", - .mhandler.cmd = hmp_expire_password, + .cmd = hmp_expire_password, }, STEXI @@ -1668,7 +1668,7 @@ ETEXI .args_type = "args:s", .params = "args", .help = "add chardev", - .mhandler.cmd = hmp_chardev_add, + .cmd = hmp_chardev_add, .command_completion = chardev_add_completion, }, @@ -1684,7 +1684,7 @@ ETEXI .args_type = "id:s", .params = "id", .help = "remove chardev", - .mhandler.cmd = hmp_chardev_remove, + .cmd = hmp_chardev_remove, .command_completion = chardev_remove_completion, }, @@ -1700,7 +1700,7 @@ ETEXI .args_type = "device:B,command:s", .params = "[device] \"[command]\"", .help = "run a qemu-io command on a block device", - .mhandler.cmd = hmp_qemu_io, + .cmd = hmp_qemu_io, }, STEXI @@ -1715,7 +1715,7 @@ ETEXI .args_type = "id:i", .params = "id", .help = "add cpu", - .mhandler.cmd = hmp_cpu_add, + .cmd = hmp_cpu_add, }, STEXI @@ -1729,7 +1729,7 @@ ETEXI .args_type = "path:s?", .params = "path", .help = "list QOM properties", - .mhandler.cmd = hmp_qom_list, + .cmd = hmp_qom_list, }, STEXI @@ -1742,7 +1742,7 @@ ETEXI .args_type = "path:s,property:s,value:s", .params = "path property value", .help = "set QOM property", - .mhandler.cmd = hmp_qom_set, + .cmd = hmp_qom_set, }, STEXI @@ -1755,8 +1755,8 @@ ETEXI .args_type = "item:s?", .params = "[subcommand]", .help = "show various information about the system state", - .mhandler.cmd = hmp_info_help, - .sub_table = info_cmds, + .cmd = hmp_info_help, + .sub_table = info_cmds, }, STEXI diff --git a/include/qapi/qmp/dispatch.h b/include/qapi/qmp/dispatch.h index 48c11b66d1..57651ea955 100644 --- a/include/qapi/qmp/dispatch.h +++ b/include/qapi/qmp/dispatch.h @@ -36,6 +36,7 @@ typedef struct QmpCommand void qmp_register_command(const char *name, QmpCommandFunc *fn, QmpCommandOptions options); +void qmp_unregister_command(const char *name); QmpCommand *qmp_find_command(const char *name); QObject *qmp_dispatch(QObject *request); void qmp_disable_command(const char *name); diff --git a/monitor.c b/monitor.c index 5c003731e2..8bb8bbfd15 100644 --- a/monitor.c +++ b/monitor.c @@ -79,6 +79,7 @@ #include "sysemu/block-backend.h" #include "sysemu/qtest.h" #include "qemu/cutils.h" +#include "qapi/qmp/dispatch.h" /* for hmp_info_irq/pic */ #if defined(TARGET_SPARC) @@ -129,13 +130,10 @@ typedef struct mon_cmd_t { const char *args_type; const char *params; const char *help; - union { - void (*cmd)(Monitor *mon, const QDict *qdict); - void (*cmd_new)(QDict *params, QObject **ret_data, Error **errp); - } mhandler; - /* @sub_table is a list of 2nd level of commands. If it do not exist, - * mhandler should be used. If it exist, sub_table[?].mhandler should be - * used, and mhandler of 1st level plays the role of help function. + void (*cmd)(Monitor *mon, const QDict *qdict); + /* @sub_table is a list of 2nd level of commands. If it does not exist, + * cmd should be used. If it exists, sub_table[?].cmd should be + * used, and cmd of 1st level plays the role of help function. */ struct mon_cmd_t *sub_table; void (*command_completion)(ReadLineState *rs, int nb_args, const char *str); @@ -168,7 +166,6 @@ struct MonFdset { }; typedef struct { - QObject *id; JSONMessageParser parser; /* * When a client connects, we're in capabilities negotiation mode. @@ -231,8 +228,6 @@ static int mon_refcount; static mon_cmd_t mon_cmds[]; static mon_cmd_t info_cmds[]; -static const mon_cmd_t qmp_cmds[]; - Monitor *cur_mon; static QEMUClockType event_clock_type = QEMU_CLOCK_REALTIME; @@ -403,49 +398,6 @@ static void monitor_json_emitter(Monitor *mon, const QObject *data) QDECREF(json); } -static QDict *build_qmp_error_dict(Error *err) -{ - QObject *obj; - - obj = qobject_from_jsonf("{ 'error': { 'class': %s, 'desc': %s } }", - QapiErrorClass_lookup[error_get_class(err)], - error_get_pretty(err)); - - return qobject_to_qdict(obj); -} - -static void monitor_protocol_emitter(Monitor *mon, QObject *data, - Error *err) -{ - QDict *qmp; - - trace_monitor_protocol_emitter(mon); - - if (!err) { - /* success response */ - qmp = qdict_new(); - if (data) { - qobject_incref(data); - qdict_put_obj(qmp, "return", data); - } else { - /* return an empty QDict by default */ - qdict_put(qmp, "return", qdict_new()); - } - } else { - /* error response */ - qmp = build_qmp_error_dict(err); - } - - if (mon->qmp.id) { - qdict_put_obj(qmp, "id", mon->qmp.id); - mon->qmp.id = NULL; - } - - monitor_json_emitter(mon, QOBJECT(qmp)); - QDECREF(qmp); -} - - static MonitorQAPIEventConf monitor_qapi_event_conf[QAPI_EVENT__MAX] = { /* Limit guest-triggerable events to 1 per second */ [QAPI_EVENT_RTC_CHANGE] = { 1000 * SCALE_MS }, @@ -617,7 +569,7 @@ static void monitor_qapi_event_init(void) qmp_event_set_func_emit(monitor_qapi_event_queue); } -static void qmp_capabilities(QDict *params, QObject **ret_data, Error **errp) +void qmp_qmp_capabilities(Error **errp) { cur_mon->qmp.in_command_mode = true; } @@ -956,21 +908,28 @@ static void hmp_info_help(Monitor *mon, const QDict *qdict) help_cmd(mon, "info"); } -CommandInfoList *qmp_query_commands(Error **errp) +static void query_commands_cb(QmpCommand *cmd, void *opaque) { - CommandInfoList *info, *cmd_list = NULL; - const mon_cmd_t *cmd; + CommandInfoList *info, **list = opaque; - for (cmd = qmp_cmds; cmd->name != NULL; cmd++) { - info = g_malloc0(sizeof(*info)); - info->value = g_malloc0(sizeof(*info->value)); - info->value->name = g_strdup(cmd->name); - - info->next = cmd_list; - cmd_list = info; + if (!cmd->enabled) { + return; } - return cmd_list; + info = g_malloc0(sizeof(*info)); + info->value = g_malloc0(sizeof(*info->value)); + info->value->name = g_strdup(cmd->name); + info->next = *list; + *list = info; +} + +CommandInfoList *qmp_query_commands(Error **errp) +{ + CommandInfoList *list = NULL; + + qmp_for_each_command(query_commands_cb, &list); + + return list; } EventInfoList *qmp_query_events(Error **errp) @@ -1007,6 +966,49 @@ static void qmp_query_qmp_schema(QDict *qdict, QObject **ret_data, *ret_data = qobject_from_json(qmp_schema_json); } +/* + * We used to define commands in qmp-commands.hx in addition to the + * QAPI schema. This permitted defining some of them only in certain + * configurations. query-commands has always reflected that (good, + * because it lets QMP clients figure out what's actually available), + * while query-qmp-schema never did (not so good). This function is a + * hack to keep the configuration-specific commands defined exactly as + * before, even though qmp-commands.hx is gone. + * + * FIXME Educate the QAPI schema on configuration-specific commands, + * and drop this hack. + */ +static void qmp_unregister_commands_hack(void) +{ +#ifndef CONFIG_SPICE + qmp_unregister_command("query-spice"); +#endif +#ifndef TARGET_I386 + qmp_unregister_command("rtc-reset-reinjection"); +#endif +#ifndef TARGET_S390X + qmp_unregister_command("dump-skeys"); +#endif +#ifndef TARGET_ARM + qmp_unregister_command("query-gic-capabilities"); +#endif +} + +static void qmp_init_marshal(void) +{ + qmp_register_command("query-qmp-schema", qmp_query_qmp_schema, + QCO_NO_OPTIONS); + qmp_register_command("device_add", qmp_device_add, + QCO_NO_OPTIONS); + qmp_register_command("netdev_add", qmp_netdev_add, + QCO_NO_OPTIONS); + + /* call it after the rest of qapi_init() */ + register_module_init(qmp_unregister_commands_hack, MODULE_INIT_QAPI); +} + +qapi_init(qmp_init_marshal); + /* set the current CPU defined by the user */ int monitor_set_cpu(int cpu_index) { @@ -2163,11 +2165,6 @@ static mon_cmd_t mon_cmds[] = { { NULL, NULL, }, }; -static const mon_cmd_t qmp_cmds[] = { -#include "qmp-commands-old.h" - { /* NULL */ }, -}; - /*******************************************************************/ static const char *pch; @@ -2518,11 +2515,6 @@ static const mon_cmd_t *search_dispatch_table(const mon_cmd_t *disp_table, return NULL; } -static const mon_cmd_t *qmp_find_cmd(const char *cmdname) -{ - return search_dispatch_table(qmp_cmds, cmdname); -} - /* * Parse command name from @cmdp according to command table @table. * If blank, return NULL. @@ -2954,7 +2946,7 @@ static void handle_hmp_command(Monitor *mon, const char *cmdline) return; } - cmd->mhandler.cmd(mon, qdict); + cmd->cmd(mon, qdict); QDECREF(qdict); } @@ -3653,219 +3645,26 @@ static int monitor_can_read(void *opaque) return (mon->suspend_cnt == 0) ? 1 : 0; } -static bool invalid_qmp_mode(const Monitor *mon, const mon_cmd_t *cmd, +static bool invalid_qmp_mode(const Monitor *mon, const char *cmd, Error **errp) { - bool is_cap = cmd->mhandler.cmd_new == qmp_capabilities; + bool is_cap = g_str_equal(cmd, "qmp_capabilities"); if (is_cap && mon->qmp.in_command_mode) { error_set(errp, ERROR_CLASS_COMMAND_NOT_FOUND, "Capabilities negotiation is already complete, command " - "'%s' ignored", cmd->name); + "'%s' ignored", cmd); return true; } if (!is_cap && !mon->qmp.in_command_mode) { error_set(errp, ERROR_CLASS_COMMAND_NOT_FOUND, "Expecting capabilities negotiation with " - "'qmp_capabilities' before command '%s'", cmd->name); + "'qmp_capabilities' before command '%s'", cmd); return true; } return false; } -/* - * Argument validation rules: - * - * 1. The argument must exist in cmd_args qdict - * 2. The argument type must be the expected one - * - * Special case: If the argument doesn't exist in cmd_args and - * the QMP_ACCEPT_UNKNOWNS flag is set, then the - * checking is skipped for it. - */ -static void check_client_args_type(const QDict *client_args, - const QDict *cmd_args, int flags, - Error **errp) -{ - const QDictEntry *ent; - - for (ent = qdict_first(client_args); ent;ent = qdict_next(client_args,ent)){ - QObject *obj; - QString *arg_type; - const QObject *client_arg = qdict_entry_value(ent); - const char *client_arg_name = qdict_entry_key(ent); - - obj = qdict_get(cmd_args, client_arg_name); - if (!obj) { - if (flags & QMP_ACCEPT_UNKNOWNS) { - /* handler accepts unknowns */ - continue; - } - /* client arg doesn't exist */ - error_setg(errp, QERR_INVALID_PARAMETER, client_arg_name); - return; - } - - arg_type = qobject_to_qstring(obj); - assert(arg_type != NULL); - - /* check if argument's type is correct */ - switch (qstring_get_str(arg_type)[0]) { - case 'F': - case 'B': - case 's': - if (qobject_type(client_arg) != QTYPE_QSTRING) { - error_setg(errp, QERR_INVALID_PARAMETER_TYPE, - client_arg_name, "string"); - return; - } - break; - case 'i': - case 'l': - case 'M': - case 'o': - if (qobject_type(client_arg) != QTYPE_QINT) { - error_setg(errp, QERR_INVALID_PARAMETER_TYPE, - client_arg_name, "int"); - return; - } - break; - case 'T': - if (qobject_type(client_arg) != QTYPE_QINT && - qobject_type(client_arg) != QTYPE_QFLOAT) { - error_setg(errp, QERR_INVALID_PARAMETER_TYPE, - client_arg_name, "number"); - return; - } - break; - case 'b': - case '-': - if (qobject_type(client_arg) != QTYPE_QBOOL) { - error_setg(errp, QERR_INVALID_PARAMETER_TYPE, - client_arg_name, "bool"); - return; - } - break; - case 'O': - assert(flags & QMP_ACCEPT_UNKNOWNS); - break; - case 'q': - /* Any QObject can be passed. */ - break; - case '/': - case '.': - /* - * These types are not supported by QMP and thus are not - * handled here. Fall through. - */ - default: - abort(); - } - } -} - -/* - * - Check if the client has passed all mandatory args - * - Set special flags for argument validation - */ -static void check_mandatory_args(const QDict *cmd_args, - const QDict *client_args, int *flags, - Error **errp) -{ - const QDictEntry *ent; - - for (ent = qdict_first(cmd_args); ent; ent = qdict_next(cmd_args, ent)) { - const char *cmd_arg_name = qdict_entry_key(ent); - QString *type = qobject_to_qstring(qdict_entry_value(ent)); - assert(type != NULL); - - if (qstring_get_str(type)[0] == 'O') { - assert((*flags & QMP_ACCEPT_UNKNOWNS) == 0); - *flags |= QMP_ACCEPT_UNKNOWNS; - } else if (qstring_get_str(type)[0] != '-' && - qstring_get_str(type)[1] != '?' && - !qdict_haskey(client_args, cmd_arg_name)) { - error_setg(errp, QERR_MISSING_PARAMETER, cmd_arg_name); - return; - } - } -} - -static QDict *qdict_from_args_type(const char *args_type) -{ - int i; - QDict *qdict; - QString *key, *type, *cur_qs; - - assert(args_type != NULL); - - qdict = qdict_new(); - - if (args_type == NULL || args_type[0] == '\0') { - /* no args, empty qdict */ - goto out; - } - - key = qstring_new(); - type = qstring_new(); - - cur_qs = key; - - for (i = 0;; i++) { - switch (args_type[i]) { - case ',': - case '\0': - qdict_put(qdict, qstring_get_str(key), type); - QDECREF(key); - if (args_type[i] == '\0') { - goto out; - } - type = qstring_new(); /* qdict has ref */ - cur_qs = key = qstring_new(); - break; - case ':': - cur_qs = type; - break; - default: - qstring_append_chr(cur_qs, args_type[i]); - break; - } - } - -out: - return qdict; -} - -/* - * Client argument checking rules: - * - * 1. Client must provide all mandatory arguments - * 2. Each argument provided by the client must be expected - * 3. Each argument provided by the client must have the type expected - * by the command - */ -static void qmp_check_client_args(const mon_cmd_t *cmd, QDict *client_args, - Error **errp) -{ - Error *err = NULL; - int flags; - QDict *cmd_args; - - cmd_args = qdict_from_args_type(cmd->args_type); - - flags = 0; - check_mandatory_args(cmd_args, client_args, &flags, &err); - if (err) { - goto out; - } - - check_client_args_type(client_args, cmd_args, flags, &err); - -out: - error_propagate(errp, err); - QDECREF(cmd_args); -} - /* * Input object checking rules * @@ -3924,65 +3723,58 @@ static QDict *qmp_check_input_obj(QObject *input_obj, Error **errp) static void handle_qmp_command(JSONMessageParser *parser, GQueue *tokens) { - Error *local_err = NULL; - QObject *obj, *data; - QDict *input, *args; - const mon_cmd_t *cmd; + QObject *req, *rsp = NULL, *id = NULL; + QDict *qdict = NULL; const char *cmd_name; Monitor *mon = cur_mon; + Error *err = NULL; - args = input = NULL; - data = NULL; - - obj = json_parser_parse(tokens, NULL); - if (!obj) { - // FIXME: should be triggered in json_parser_parse() - error_setg(&local_err, QERR_JSON_PARSING); + req = json_parser_parse_err(tokens, NULL, &err); + if (err || !req || qobject_type(req) != QTYPE_QDICT) { + if (!err) { + error_setg(&err, QERR_JSON_PARSING); + } goto err_out; } - input = qmp_check_input_obj(obj, &local_err); - if (!input) { - qobject_decref(obj); + qdict = qmp_check_input_obj(req, &err); + if (!qdict) { goto err_out; } - mon->qmp.id = qdict_get(input, "id"); - qobject_incref(mon->qmp.id); + id = qdict_get(qdict, "id"); + qobject_incref(id); + qdict_del(qdict, "id"); - cmd_name = qdict_get_str(input, "execute"); + cmd_name = qdict_get_str(qdict, "execute"); trace_handle_qmp_command(mon, cmd_name); - cmd = qmp_find_cmd(cmd_name); - if (!cmd) { - error_set(&local_err, ERROR_CLASS_COMMAND_NOT_FOUND, - "The command %s has not been found", cmd_name); - goto err_out; - } - if (invalid_qmp_mode(mon, cmd, &local_err)) { + + if (invalid_qmp_mode(mon, cmd_name, &err)) { goto err_out; } - obj = qdict_get(input, "arguments"); - if (!obj) { - args = qdict_new(); - } else { - args = qobject_to_qdict(obj); - QINCREF(args); - } - - qmp_check_client_args(cmd, args, &local_err); - if (local_err) { - goto err_out; - } - - cmd->mhandler.cmd_new(args, &data, &local_err); + rsp = qmp_dispatch(req); err_out: - monitor_protocol_emitter(mon, data, local_err); - qobject_decref(data); - error_free(local_err); - QDECREF(input); - QDECREF(args); + if (err) { + qdict = qdict_new(); + qdict_put_obj(qdict, "error", qmp_build_error_object(err)); + error_free(err); + rsp = QOBJECT(qdict); + } + + if (rsp) { + if (id) { + qdict_put_obj(qobject_to_qdict(rsp), "id", id); + id = NULL; + } + + monitor_json_emitter(mon, rsp); + } + + qobject_decref(id); + qobject_decref(rsp); + qobject_decref(req); } static void monitor_qmp_read(void *opaque, const uint8_t *buf, int size) @@ -4047,7 +3839,9 @@ static QObject *get_qmp_greeting(void) QObject *ver = NULL; qmp_marshal_query_version(NULL, &ver, NULL); - return qobject_from_jsonf("{'QMP':{'version': %p,'capabilities': []}}",ver); + + return qobject_from_jsonf("{'QMP': {'version': %p, 'capabilities': []}}", + ver); } static void monitor_qmp_event(void *opaque, int event) diff --git a/qapi-schema.json b/qapi-schema.json index f1a79f5ed9..e50706111c 100644 --- a/qapi-schema.json +++ b/qapi-schema.json @@ -20,6 +20,27 @@ # QAPI introspection { 'include': 'qapi/introspect.json' } +## +# @qmp_capabilities: +# +# Enable QMP capabilities. +# +# Arguments: None. +# +# Example: +# +# -> { "execute": "qmp_capabilities" } +# <- { "return": {} } +# +# Notes: This command is valid exactly when first connecting: it must be +# issued before any other command will be accepted, and will fail once the +# monitor is accepting other commands. (see qemu docs/qmp-spec.txt) +# +# Since: 0.13 +# +## +{ 'command': 'qmp_capabilities' } + ## # @LostTickPolicy: # @@ -2179,6 +2200,46 @@ ## { 'command': 'xen-set-global-dirty-log', 'data': { 'enable': 'bool' } } +## +# @device_add: +# +# @driver: the name of the new device's driver +# +# @bus: #optional the device's parent bus (device tree path) +# +# @id: the device's ID, must be unique +# +# Additional arguments depend on the type. +# +# Add a device. +# +# Notes: +# 1. For detailed information about this command, please refer to the +# 'docs/qdev-device-use.txt' file. +# +# 2. It's possible to list device properties by running QEMU with the +# "-device DEVICE,help" command-line argument, where DEVICE is the +# device's name +# +# Example: +# +# -> { "execute": "device_add", +# "arguments": { "driver": "e1000", "id": "net1", +# "bus": "pci.0", +# "mac": "52:54:00:12:34:56" } } +# <- { "return": {} } +# +# TODO This command effectively bypasses QAPI completely due to its +# "additional arguments" business. It shouldn't have been added to +# the schema in this form. It should be qapified properly, or +# replaced by a properly qapified command. +# +# Since: 0.13 +## +{ 'command': 'device_add', + 'data': {'driver': 'str', 'id': 'str'}, + 'gen': false } # so we can get the additional arguments + ## # @device_del: # diff --git a/qapi/qmp-registry.c b/qapi/qmp-registry.c index 68b24c98b0..e8053686f3 100644 --- a/qapi/qmp-registry.c +++ b/qapi/qmp-registry.c @@ -30,6 +30,14 @@ void qmp_register_command(const char *name, QmpCommandFunc *fn, QTAILQ_INSERT_TAIL(&qmp_commands, cmd, node); } +void qmp_unregister_command(const char *name) +{ + QmpCommand *cmd = qmp_find_command(name); + + QTAILQ_REMOVE(&qmp_commands, cmd, node); + g_free(cmd); +} + QmpCommand *qmp_find_command(const char *name) { QmpCommand *cmd; diff --git a/qmp.c b/qmp.c index dea8f81345..6733463fa2 100644 --- a/qmp.c +++ b/qmp.c @@ -51,21 +51,11 @@ NameInfo *qmp_query_name(Error **errp) VersionInfo *qmp_query_version(Error **errp) { VersionInfo *info = g_new0(VersionInfo, 1); - const char *version = QEMU_VERSION; - const char *tmp; - int err; info->qemu = g_new0(VersionTriple, 1); - err = qemu_strtoll(version, &tmp, 10, &info->qemu->major); - assert(err == 0); - tmp++; - - err = qemu_strtoll(tmp, &tmp, 10, &info->qemu->minor); - assert(err == 0); - tmp++; - - err = qemu_strtoll(tmp, &tmp, 10, &info->qemu->micro); - assert(err == 0); + info->qemu->major = QEMU_VERSION_MAJOR; + info->qemu->minor = QEMU_VERSION_MINOR; + info->qemu->micro = QEMU_VERSION_MICRO; info->package = g_strdup(QEMU_PKGVERSION); return info; diff --git a/scripts/create_config b/scripts/create_config index 1dd6a354f5..e6929dd61e 100755 --- a/scripts/create_config +++ b/scripts/create_config @@ -7,7 +7,13 @@ while read line; do case $line in VERSION=*) # configuration version=${line#*=} + major=$(echo "$version" | cut -d. -f1) + minor=$(echo "$version" | cut -d. -f2) + micro=$(echo "$version" | cut -d. -f3) echo "#define QEMU_VERSION \"$version\"" + echo "#define QEMU_VERSION_MAJOR $major" + echo "#define QEMU_VERSION_MINOR $minor" + echo "#define QEMU_VERSION_MICRO $micro" ;; qemu_*dir=*) # qemu-specific directory configuration name=${line%=*} diff --git a/scripts/qapi-commands.py b/scripts/qapi-commands.py index a06a2c4f9b..2f603b0c0e 100644 --- a/scripts/qapi-commands.py +++ b/scripts/qapi-commands.py @@ -84,10 +84,7 @@ static void qmp_marshal_output_%(c_name)s(%(c_type)s ret_in, QObject **ret_out, def gen_marshal_proto(name): - ret = 'void qmp_marshal_%s(QDict *args, QObject **ret, Error **errp)' % c_name(name) - if not middle_mode: - ret = 'static ' + ret - return ret + return 'void qmp_marshal_%s(QDict *args, QObject **ret, Error **errp)' % c_name(name) def gen_marshal_decl(name): @@ -98,6 +95,8 @@ def gen_marshal_decl(name): def gen_marshal(name, arg_type, boxed, ret_type): + have_args = arg_type and not arg_type.is_empty() + ret = mcgen(''' %(proto)s @@ -112,17 +111,31 @@ def gen_marshal(name, arg_type, boxed, ret_type): ''', c_type=ret_type.c_type()) - if arg_type and not arg_type.is_empty(): + if have_args: + visit_members = ('visit_type_%s_members(v, &arg, &err);' + % arg_type.c_name()) ret += mcgen(''' Visitor *v; %(c_name)s arg = {0}; +''', + c_name=arg_type.c_name()) + else: + visit_members = '' + ret += mcgen(''' + Visitor *v = NULL; + + if (args) { +''') + push_indent() + + ret += mcgen(''' v = qmp_input_visitor_new(QOBJECT(args), true); visit_start_struct(v, NULL, NULL, 0, &err); if (err) { goto out; } - visit_type_%(c_name)s_members(v, &arg, &err); + %(visit_members)s if (!err) { visit_check_struct(v, &err); } @@ -131,35 +144,47 @@ def gen_marshal(name, arg_type, boxed, ret_type): goto out; } ''', - c_name=arg_type.c_name()) + visit_members=visit_members) - else: + if not have_args: + pop_indent() ret += mcgen(''' - - (void)args; + } ''') ret += gen_call(name, arg_type, boxed, ret_type) - # 'goto out' produced above for arg_type, and by gen_call() for ret_type - if (arg_type and not arg_type.is_empty()) or ret_type: - ret += mcgen(''' + ret += mcgen(''' out: -''') - ret += mcgen(''' error_propagate(errp, err); -''') - if arg_type and not arg_type.is_empty(): - ret += mcgen(''' visit_free(v); +''') + + if have_args: + visit_members = ('visit_type_%s_members(v, &arg, NULL);' + % arg_type.c_name()) + else: + visit_members = '' + ret += mcgen(''' + if (args) { +''') + push_indent() + + ret += mcgen(''' v = qapi_dealloc_visitor_new(); visit_start_struct(v, NULL, NULL, 0, NULL); - visit_type_%(c_name)s_members(v, &arg, NULL); + %(visit_members)s visit_end_struct(v, NULL); visit_free(v); ''', - c_name=arg_type.c_name()) + visit_members=visit_members) + + if not have_args: + pop_indent() + ret += mcgen(''' + } +''') ret += mcgen(''' } @@ -209,8 +234,7 @@ class QAPISchemaGenCommandVisitor(QAPISchemaVisitor): self._visited_ret_types = set() def visit_end(self): - if not middle_mode: - self.defn += gen_registry(self._regy) + self.defn += gen_registry(self._regy) self._regy = None self._visited_ret_types = None @@ -222,21 +246,12 @@ class QAPISchemaGenCommandVisitor(QAPISchemaVisitor): if ret_type and ret_type not in self._visited_ret_types: self._visited_ret_types.add(ret_type) self.defn += gen_marshal_output(ret_type) - if middle_mode: - self.decl += gen_marshal_decl(name) + self.decl += gen_marshal_decl(name) self.defn += gen_marshal(name, arg_type, boxed, ret_type) - if not middle_mode: - self._regy += gen_register_command(name, success_response) + self._regy += gen_register_command(name, success_response) -middle_mode = False - -(input_file, output_dir, do_c, do_h, prefix, opts) = \ - parse_command_line("m", ["middle"]) - -for o, a in opts: - if o in ("-m", "--middle"): - middle_mode = True +(input_file, output_dir, do_c, do_h, prefix, opts) = parse_command_line() c_comment = ''' /* diff --git a/tests/test-qga.c b/tests/test-qga.c index 21f44f8915..40af64987a 100644 --- a/tests/test-qga.c +++ b/tests/test-qga.c @@ -198,6 +198,26 @@ static void test_qga_ping(gconstpointer fix) QDECREF(ret); } +static void test_qga_invalid_args(gconstpointer fix) +{ + const TestFixture *fixture = fix; + QDict *ret, *error; + const gchar *class, *desc; + + ret = qmp_fd(fixture->fd, "{'execute': 'guest-ping', " + "'arguments': {'foo': 42 }}"); + g_assert_nonnull(ret); + + error = qdict_get_qdict(ret, "error"); + class = qdict_get_try_str(error, "class"); + desc = qdict_get_try_str(error, "desc"); + + g_assert_cmpstr(class, ==, "GenericError"); + g_assert_cmpstr(desc, ==, "QMP input object member 'foo' is unexpected"); + + QDECREF(ret); +} + static void test_qga_invalid_cmd(gconstpointer fix) { const TestFixture *fixture = fix; @@ -911,6 +931,7 @@ int main(int argc, char **argv) g_test_add_data_func("/qga/file-write-read", &fix, test_qga_file_write_read); g_test_add_data_func("/qga/get-time", &fix, test_qga_get_time); g_test_add_data_func("/qga/invalid-cmd", &fix, test_qga_invalid_cmd); + g_test_add_data_func("/qga/invalid-args", &fix, test_qga_invalid_args); g_test_add_data_func("/qga/fsfreeze-status", &fix, test_qga_fsfreeze_status); diff --git a/tests/test-qmp-commands.c b/tests/test-qmp-commands.c index 261fd9e313..81cbe545c4 100644 --- a/tests/test-qmp-commands.c +++ b/tests/test-qmp-commands.c @@ -106,6 +106,7 @@ static void test_dispatch_cmd(void) static void test_dispatch_cmd_failure(void) { QDict *req = qdict_new(); + QDict *args = qdict_new(); QObject *resp; qdict_put_obj(req, "execute", QOBJECT(qstring_from_str("user_def_cmd2"))); @@ -116,6 +117,20 @@ static void test_dispatch_cmd_failure(void) qobject_decref(resp); QDECREF(req); + + /* check that with extra arguments it throws an error */ + req = qdict_new(); + qdict_put(args, "a", qint_from_int(66)); + qdict_put(req, "arguments", args); + + qdict_put_obj(req, "execute", QOBJECT(qstring_from_str("user_def_cmd"))); + + resp = qmp_dispatch(QOBJECT(req)); + assert(resp != NULL); + assert(qdict_haskey(qobject_to_qdict(resp), "error")); + + qobject_decref(resp); + QDECREF(req); } static QObject *test_qmp_dispatch(QDict *req) diff --git a/trace-events b/trace-events index 616cc52378..8d59631ae8 100644 --- a/trace-events +++ b/trace-events @@ -98,7 +98,6 @@ qemu_co_mutex_unlock_return(void *mutex, void *self) "mutex %p self %p" # monitor.c handle_qmp_command(void *mon, const char *cmd_name) "mon %p cmd_name \"%s\"" -monitor_protocol_emitter(void *mon) "mon %p" monitor_protocol_event_handler(uint32_t event, void *qdict) "event=%d data=%p" monitor_protocol_event_emit(uint32_t event, void *data) "event=%d data=%p" monitor_protocol_event_queue(uint32_t event, void *qdict, uint64_t rate) "event=%d data=%p rate=%" PRId64 diff --git a/vl.c b/vl.c index ad2664bbc4..fca0487167 100644 --- a/vl.c +++ b/vl.c @@ -2987,6 +2987,7 @@ int main(int argc, char **argv, char **envp) qemu_init_exec_dir(argv[0]); module_call_init(MODULE_INIT_QOM); + module_call_init(MODULE_INIT_QAPI); qemu_add_opts(&qemu_drive_opts); qemu_add_drive_opts(&qemu_legacy_drive_opts);