<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://linux-kvm.org/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Dorileo</id>
	<title>KVM - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://linux-kvm.org/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Dorileo"/>
	<link rel="alternate" type="text/html" href="https://linux-kvm.org/page/Special:Contributions/Dorileo"/>
	<updated>2026-05-20T10:36:49Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.39.5</generator>
	<entry>
		<id>https://linux-kvm.org/index.php?title=MonitorProtocol&amp;diff=2915</id>
		<title>MonitorProtocol</title>
		<link rel="alternate" type="text/html" href="https://linux-kvm.org/index.php?title=MonitorProtocol&amp;diff=2915"/>
		<updated>2010-03-15T16:48:21Z</updated>

		<summary type="html">&lt;p&gt;Dorileo: removed libvirt todo since it`s described on last editing&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= QEMU Monitor Protocol =&lt;br /&gt;
&lt;br /&gt;
The QEMU Monitor Protocol (QMP) allows applications to communicate with QEMU&#039;s Monitor.&lt;br /&gt;
&lt;br /&gt;
QMP is [http://www.json.org/ JSON]-based, its main features are:&lt;br /&gt;
&lt;br /&gt;
* Lightweight, text-based, easy to parse data format&lt;br /&gt;
* Asynchronous events support&lt;br /&gt;
&lt;br /&gt;
The [http://git.savannah.gnu.org/cgit/qemu.git/tree/QMP/README README] file explains how to use it and its full specification can be found [http://git.savannah.gnu.org/cgit/qemu.git/tree/QMP/qmp-spec.txt here].&lt;br /&gt;
&lt;br /&gt;
== General Status ==&lt;br /&gt;
&lt;br /&gt;
A &#039;&#039;&#039;preview&#039;&#039;&#039; version of QMP is available in QEMU version 0.12.&lt;br /&gt;
&lt;br /&gt;
However, QMP is still under development being considered unstable and incomplete. For more information about converted handlers, please check [[#Conversion Status]].&lt;br /&gt;
&lt;br /&gt;
== Examples ==&lt;br /&gt;
&lt;br /&gt;
In the following examples, &#039;C&#039; stands for &#039;Client&#039; and &#039;S&#039; stands for &#039;Server&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Server Greeting ===&lt;br /&gt;
&lt;br /&gt;
 S: {&amp;quot;QMP&amp;quot;: {&amp;quot;capabilities&amp;quot;: []}}&lt;br /&gt;
&lt;br /&gt;
=== Query version ===&lt;br /&gt;
&lt;br /&gt;
 C: { &amp;quot;execute&amp;quot;: &amp;quot;query-version&amp;quot; }&lt;br /&gt;
 S: {&amp;quot;return&amp;quot;: {&amp;quot;qemu&amp;quot;: &amp;quot;0.11.50&amp;quot;, &amp;quot;package&amp;quot;: &amp;quot;&amp;quot;}}&lt;br /&gt;
&lt;br /&gt;
=== Eject a device ===&lt;br /&gt;
&lt;br /&gt;
 C: { &amp;quot;execute&amp;quot;: &amp;quot;eject&amp;quot;, &amp;quot;arguments&amp;quot;: { &amp;quot;device&amp;quot;: &amp;quot;ide1-cd0&amp;quot; } }&lt;br /&gt;
 S: {&amp;quot;return&amp;quot;: {}}&lt;br /&gt;
&lt;br /&gt;
== Development ==&lt;br /&gt;
&lt;br /&gt;
Primary contact is [mailto:lcapitulino@redhat.com Luiz Capitulino], but all QMP-related discussions happen on the [http://lists.nongnu.org/mailman/listinfo/qemu-devel qemu-devel] mailing list.&lt;br /&gt;
&lt;br /&gt;
Next features, hot fixes and other patches are stored in the QMP unstable repository:&lt;br /&gt;
&lt;br /&gt;
http://repo.or.cz/w/qemu/qmp-unstable.git&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;NOTE&#039;&#039;&#039;: all branches in this repository are constantly &#039;&#039;rebased&#039;&#039; (master inclusive).&lt;br /&gt;
&lt;br /&gt;
== TODO ==&lt;br /&gt;
&lt;br /&gt;
* Convert all remaining commands&lt;br /&gt;
* High-level protocol documentation&lt;br /&gt;
* High-level internal documentation&lt;br /&gt;
* Improve internal API, currently it&#039;s too [http://lists.gnu.org/archive/html/qemu-devel/2009-12/msg02537.html low-level]&lt;br /&gt;
* Better QObjects and QMP debug support&lt;br /&gt;
* Array-based Monitor&#039;s command table&lt;br /&gt;
* Libqmp&lt;br /&gt;
&lt;br /&gt;
== Conversion Status ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;UPDATED&#039;&#039;&#039;: 2009-12-16&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
|Command&lt;br /&gt;
|Info&lt;br /&gt;
|-&lt;br /&gt;
|Handlers&lt;br /&gt;
|62&lt;br /&gt;
|36&lt;br /&gt;
|-&lt;br /&gt;
|Converted&lt;br /&gt;
|19&lt;br /&gt;
|15&lt;br /&gt;
|-&lt;br /&gt;
|Percentage&lt;br /&gt;
|30%&lt;br /&gt;
|41%&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The following tables have a per-function status. There is one table for &#039;&#039;command&#039;&#039; handlers and another one for &#039;&#039;info&#039;&#039; handlers.&lt;br /&gt;
&lt;br /&gt;
Status can be:&lt;br /&gt;
&lt;br /&gt;
* merged: already merged upstream&lt;br /&gt;
* converted: converted but not merged yet&lt;br /&gt;
* partial: merged, but error handling is incomplete&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;NOTE:&#039;&#039;&#039; Handlers used by [http://libvirt.org Libvirt] are marked with yellow.&lt;br /&gt;
&lt;br /&gt;
==== Command handlers ====&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|&#039;&#039;&#039;Handler name&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;Status&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;Version&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;Comments&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|do_acl_add()&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|do_acl_policy()&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|do_acl_remove()&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|do_acl_reset()&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|do_acl_show()&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|- style=&amp;quot;background-color:yellow;&amp;quot;&lt;br /&gt;
|do_balloon()&lt;br /&gt;
|merged&lt;br /&gt;
|0.12&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|do_block_set_passwd()&lt;br /&gt;
|merged&lt;br /&gt;
|0.12&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|do_boot_set()&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|- style=&amp;quot;background-color:yellow;&amp;quot;&lt;br /&gt;
|do_change()&lt;br /&gt;
|merged&lt;br /&gt;
|0.12&lt;br /&gt;
|&lt;br /&gt;
|- style=&amp;quot;background-color:yellow;&amp;quot;&lt;br /&gt;
|do_closefd()&lt;br /&gt;
|merged&lt;br /&gt;
|0.12&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|do_commit()&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|- style=&amp;quot;background-color:yellow;&amp;quot;&lt;br /&gt;
|do_cont()&lt;br /&gt;
|merged&lt;br /&gt;
|0.12&lt;br /&gt;
|&lt;br /&gt;
|- style=&amp;quot;background-color:yellow;&amp;quot;&lt;br /&gt;
|do_cpu_set()&lt;br /&gt;
|merged&lt;br /&gt;
|0.12.50&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|do_delvm()&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|- style=&amp;quot;background-color:yellow;&amp;quot;&lt;br /&gt;
|do_device_add()&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|- style=&amp;quot;background-color:yellow;&amp;quot;&lt;br /&gt;
|do_device_del()&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|- style=&amp;quot;background-color:yellow;&amp;quot;&lt;br /&gt;
|do_eject()&lt;br /&gt;
|merged&lt;br /&gt;
|0.12&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|do_gdbserver()&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|- style=&amp;quot;background-color:yellow;&amp;quot;&lt;br /&gt;
|do_getfd()&lt;br /&gt;
|merged&lt;br /&gt;
|0.12&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|do_help_cmd()&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|do_info()&lt;br /&gt;
|merged&lt;br /&gt;
|0.12&lt;br /&gt;
|as &#039;query-&#039; commands&lt;br /&gt;
|-&lt;br /&gt;
|do_inject_mce()&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|do_inject_nmi()&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|do_ioport_read()&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|do_ioport_write()&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|do_loadvm()&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|do_log()&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|do_logfile()&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|do_memory_dump()&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|- style=&amp;quot;background-color:yellow;&amp;quot;&lt;br /&gt;
|do_memory_save()&lt;br /&gt;
|merged&lt;br /&gt;
|0.12.50&lt;br /&gt;
|&lt;br /&gt;
|- style=&amp;quot;background-color:yellow;&amp;quot;&lt;br /&gt;
|do_migrate()&lt;br /&gt;
|partial&lt;br /&gt;
|0.12&lt;br /&gt;
|&lt;br /&gt;
|- style=&amp;quot;background-color:yellow;&amp;quot;&lt;br /&gt;
|do_migrate_cancel()&lt;br /&gt;
|merged&lt;br /&gt;
|0.12&lt;br /&gt;
|&lt;br /&gt;
|- style=&amp;quot;background-color:yellow;&amp;quot;&lt;br /&gt;
|do_migrate_set_downtime()&lt;br /&gt;
|merged&lt;br /&gt;
|0.12.50&lt;br /&gt;
|&lt;br /&gt;
|- style=&amp;quot;background-color:yellow;&amp;quot;&lt;br /&gt;
|do_migrate_set_speed()&lt;br /&gt;
|merged&lt;br /&gt;
|0.12.50&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|do_mouse_button()&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|do_mouse_move()&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|do_mouse_set()&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|- style=&amp;quot;background-color:yellow;&amp;quot;&lt;br /&gt;
|do_pci_device_hot_remove()&lt;br /&gt;
|partial&lt;br /&gt;
|0.12&lt;br /&gt;
|legacy, use device_del instead&lt;br /&gt;
|-&lt;br /&gt;
|do_physical_memory_dump()&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|- style=&amp;quot;background-color:yellow;&amp;quot;&lt;br /&gt;
|do_physical_memory_save()&lt;br /&gt;
|merged&lt;br /&gt;
|0.12.50&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|do_print()&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|do_quit()&lt;br /&gt;
|merged&lt;br /&gt;
|0.12&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|do_savevm()&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|do_screen_dump()&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|do_sendkey()&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|- style=&amp;quot;background-color:yellow;&amp;quot;&lt;br /&gt;
|do_set_link()&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|do_singlestep()&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|- style=&amp;quot;background-color:yellow;&amp;quot;&lt;br /&gt;
|do_stop()&lt;br /&gt;
|merged&lt;br /&gt;
|0.12&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|do_stop_capture()&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|do_sum()&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|- style=&amp;quot;background-color:yellow;&amp;quot;&lt;br /&gt;
|do_system_powerdown()&lt;br /&gt;
|merged&lt;br /&gt;
|0.12&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|do_system_reset()&lt;br /&gt;
|merged&lt;br /&gt;
|0.12&lt;br /&gt;
|&lt;br /&gt;
|- style=&amp;quot;background-color:yellow;&amp;quot;&lt;br /&gt;
|do_usb_add()&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|legacy, use device_add instead&lt;br /&gt;
|- style=&amp;quot;background-color:yellow;&amp;quot;&lt;br /&gt;
|do_usb_del()&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|legacy, use device_del instead&lt;br /&gt;
|-&lt;br /&gt;
|do_watchdog_action()&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|do_wav_capture()&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|- style=&amp;quot;background-color:yellow;&amp;quot;&lt;br /&gt;
|drive_hot_add()&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|- style=&amp;quot;background-color:yellow;&amp;quot;&lt;br /&gt;
|net_host_device_add()&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|consider do_netdev_add() instead&lt;br /&gt;
|- style=&amp;quot;background-color:yellow;&amp;quot;&lt;br /&gt;
|net_host_device_remove()&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|consider do_netdev_del() instead&lt;br /&gt;
|-&lt;br /&gt;
|net_slirp_hostfwd_add()&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|net_slirp_hostfwd_remove()&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|- style=&amp;quot;background-color:yellow;&amp;quot;&lt;br /&gt;
|pci_device_hot_add()&lt;br /&gt;
|partial&lt;br /&gt;
|0.12&lt;br /&gt;
|legacy, use device_add instead&lt;br /&gt;
|-&lt;br /&gt;
|do_chardev_add()&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|to be created&lt;br /&gt;
|-&lt;br /&gt;
|do_chardev_del()&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|to be created&lt;br /&gt;
|-&lt;br /&gt;
|do_blockdev_add()&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|to be created&lt;br /&gt;
|-&lt;br /&gt;
|do_blockdev_del()&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|to be created&lt;br /&gt;
|-&lt;br /&gt;
|do_netdev_add()&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|to be created&lt;br /&gt;
|-&lt;br /&gt;
|do_netdev_del()&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|to be created&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Info handlers ====&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|&#039;&#039;&#039;Handler name&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;Status&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;Version&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;Comments&#039;&#039;&#039;&lt;br /&gt;
|- style=&amp;quot;background-color:yellow;&amp;quot;&lt;br /&gt;
|bdrv_info()&lt;br /&gt;
|merged&lt;br /&gt;
|0.12&lt;br /&gt;
|&lt;br /&gt;
|- style=&amp;quot;background-color:yellow;&amp;quot;&lt;br /&gt;
|bdrv_info_stats()&lt;br /&gt;
|merged&lt;br /&gt;
|0.12&lt;br /&gt;
|&lt;br /&gt;
|- style=&amp;quot;background-color:yellow;&amp;quot;&lt;br /&gt;
|do_info_balloon()&lt;br /&gt;
|merged&lt;br /&gt;
|0.12&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|do_info_capture()&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|- style=&amp;quot;background-color:yellow;&amp;quot;&lt;br /&gt;
|do_info_cpus()&lt;br /&gt;
|merged&lt;br /&gt;
|0.12&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|do_info_cpu_stats()&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|do_info_history()&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|do_info_hpet()&lt;br /&gt;
|merged&lt;br /&gt;
|0.12&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|do_info_jit()&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|do_info_kvm()&lt;br /&gt;
|merged&lt;br /&gt;
|0.12&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|do_info_mice()&lt;br /&gt;
|merged&lt;br /&gt;
|0.12&lt;br /&gt;
|&lt;br /&gt;
|- style=&amp;quot;background-color:yellow;&amp;quot;&lt;br /&gt;
|do_info_migrate()&lt;br /&gt;
|merged&lt;br /&gt;
|0.12&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|do_info_name()&lt;br /&gt;
|merged&lt;br /&gt;
|0.12&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|do_info_network()&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|do_info_numa()&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|do_info_profile()&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|do_info_qdm()&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|do_info_qtree()&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|do_info_registers()&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|do_info_roms()&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|do_info_snapshots()&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|do_info_status()&lt;br /&gt;
|merged&lt;br /&gt;
|0.12&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|do_info_usernet()&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|do_info_uuid()&lt;br /&gt;
|merged&lt;br /&gt;
|0.12&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|do_info_version()&lt;br /&gt;
|merged&lt;br /&gt;
|0.12&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|do_info_vnc()&lt;br /&gt;
|merged&lt;br /&gt;
|0.12&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|irq_info()&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|mem_info()&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|- style=&amp;quot;background-color:yellow;&amp;quot;&lt;br /&gt;
|pci_info()&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|pcmcia_info()&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|pic_info()&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|qemu_chr_info()&lt;br /&gt;
|merged&lt;br /&gt;
|0.12&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|tlb_info()&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|usb_host_info()&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|- style=&amp;quot;background-color:yellow;&amp;quot;&lt;br /&gt;
|usb_info()&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Testing ==&lt;br /&gt;
&lt;br /&gt;
Unfortunately, there is no automated tool to test QMP correctness yet. Probably, the right thing to do is to integrate with [http://www.linux-kvm.org/page/KVM-Autotest kvm-autotest] but we still have to think how this should be done.&lt;br /&gt;
&lt;br /&gt;
Meanwhile, QMP testing is a low-level procedure which requires knowledge about the protocol and its implementation, so the first thing to do is to read the [http://git.savannah.gnu.org/cgit/qemu.git/tree/QMP/README README] and [http://git.savannah.gnu.org/cgit/qemu.git/tree/QMP/qmp-spec.txt spec] files.&lt;br /&gt;
&lt;br /&gt;
This section describes two ways of testing QMP:&lt;br /&gt;
&lt;br /&gt;
* By hand (difficult, only worth it if you&#039;re chasing a specific bug)&lt;br /&gt;
* Using qmp-shell script (automates part of the job)&lt;br /&gt;
&lt;br /&gt;
=== Libvirt ===&lt;br /&gt;
&lt;br /&gt;
1. Install [http://lloyd.github.com/yajl yajl-devel]  before running &#039;autogen.sh&#039;. Make sure the final summary of autogen.sh tells you that it found the yajl library. If you`re running Fedora 12(or above) just yum install yajl-devel.&lt;br /&gt;
&lt;br /&gt;
2. From a fresh checkout of [http://libvirt.org/git/?p=libvirt.git;a=summary GIT master] run the following:&lt;br /&gt;
&lt;br /&gt;
 ./autogen.sh --system --enable-compile-warnings=error&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;NOTE:&#039;&#039;&#039; The &#039;--system&#039; flag is a shortcut for compiling with the --prefix and other directories matching a system RPM build.&lt;br /&gt;
&lt;br /&gt;
3. Run &#039;make&#039; to build. There is no need to &#039;make install&#039; anything&lt;br /&gt;
especially since that would overwrite your RPM based install&lt;br /&gt;
&lt;br /&gt;
4. As root simply stop the current daemon &amp;amp; start the one you built&lt;br /&gt;
&lt;br /&gt;
 /etc/init.d/libvirtd stop&lt;br /&gt;
 $HOME/your/git/checkout/of/libvirt/daemon/libvirtd&lt;br /&gt;
&lt;br /&gt;
5. As root you can use the newly built virsh too&lt;br /&gt;
&lt;br /&gt;
 cd $HOME/your/git/checkout/of/libvirt/src&lt;br /&gt;
 ./virsh &amp;lt;BLAH&amp;gt;&lt;br /&gt;
&lt;br /&gt;
6. To enable QMP support, before you build edit &#039;&#039;&#039;src/qemu/qemu_conf.c&#039;&#039;&#039; and find:&lt;br /&gt;
&lt;br /&gt;
 #if 0&lt;br /&gt;
    if (version &amp;gt;= 13000)&lt;br /&gt;
        flags |= QEMUD_CMD_FLAG_MONITOR_JSON;&lt;br /&gt;
 #endif&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;NOTE:&#039;&#039;&#039; If enabled libvirt will use QMP as default monitor.&lt;br /&gt;
&lt;br /&gt;
7. Change that to an &#039;#if 1&#039;, and change the version to 12000 so it detects your GIT build of QEMU&lt;br /&gt;
&lt;br /&gt;
=== By hand ===&lt;br /&gt;
&lt;br /&gt;
1. Start QMP on a TCP socket, so that telnet can be used&lt;br /&gt;
&lt;br /&gt;
 qemu [...] -qmp tcp:localhost:4444,server&lt;br /&gt;
&lt;br /&gt;
2. Now, run telnet&lt;br /&gt;
&lt;br /&gt;
 telnet localhost 4444&lt;br /&gt;
&lt;br /&gt;
3. You should see the following prompt&lt;br /&gt;
&lt;br /&gt;
 {&amp;quot;QMP&amp;quot;: {&amp;quot;capabilities&amp;quot;: []}}&lt;br /&gt;
&lt;br /&gt;
4. Now you can issue commands. To get a list of QMP supported commands, run &#039;&#039;query-commands&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 { &amp;quot;execute&amp;quot;: &amp;quot;query-commands&amp;quot; }&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;NOTE:&#039;&#039;&#039; all &amp;quot;info&amp;quot; commands are available under QMP as &amp;quot;query-&amp;quot;, for example &amp;quot;info vnc&amp;quot; is &amp;quot;query-vnc&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
The output of &#039;&#039;query-commands&#039;&#039; is a JSON array of objects, each with a &#039;name&#039; key, which has the name of the supported command. QMP doesn&#039;t have user documentation yet, this means that, to find out which arguments a command accepts or what&#039;s its output, you will have to either check the [http://git.savannah.gnu.org/cgit/qemu.git/tree/qemu-monitor.hx qemu-monitor.hx] file and/or the function which implements the command.&lt;br /&gt;
&lt;br /&gt;
Yes, it&#039;s that low-level.&lt;br /&gt;
&lt;br /&gt;
=== qmp-shell script ===&lt;br /&gt;
&lt;br /&gt;
This script is available under the [http://git.savannah.gnu.org/cgit/qemu.git/tree/QMP QMP] directory in QEMU&#039;s source-tree. It automates a bit the testing work, as it can construct commands.&lt;br /&gt;
&lt;br /&gt;
1. Start QMP on a unix socket, like:&lt;br /&gt;
&lt;br /&gt;
 qemu [...] -qmp unix:./qmp-sock,server&lt;br /&gt;
&lt;br /&gt;
2. Run the script&lt;br /&gt;
&lt;br /&gt;
 qmp-shell ./qmp-sock&lt;br /&gt;
&lt;br /&gt;
3. You should get the following prompt&lt;br /&gt;
&lt;br /&gt;
 (QEMU)&lt;br /&gt;
&lt;br /&gt;
4. Now you can run commands. For example, let&#039;s change the VNC password:&lt;br /&gt;
&lt;br /&gt;
 (QEMU) change device=vnc target=password arg=&#039;1234&#039;&lt;br /&gt;
&lt;br /&gt;
So, it&#039;s needed to name the arguments and the script is not very smart. Again, to find out what arguments a command accepts, you have to either check the [http://git.savannah.gnu.org/cgit/qemu.git/tree/qemu-monitor.hx qemu-monitor.hx] file and/or the function which implements the command.&lt;br /&gt;
&lt;br /&gt;
Have fun!&lt;br /&gt;
&lt;br /&gt;
== History ==&lt;br /&gt;
&lt;br /&gt;
This was the fourth proposal for a Monitor protocol, past discussions can be found in the following links:&lt;br /&gt;
&lt;br /&gt;
* http://www.mail-archive.com/qemu-devel@nongnu.org/msg14593.html&lt;br /&gt;
* http://lists.gnu.org/archive/html/qemu-devel/2009-01/msg00655.html&lt;br /&gt;
* http://lists.gnu.org/archive/html/qemu-devel/2009-06/msg01584.html&lt;/div&gt;</summary>
		<author><name>Dorileo</name></author>
	</entry>
	<entry>
		<id>https://linux-kvm.org/index.php?title=MonitorProtocol&amp;diff=2914</id>
		<title>MonitorProtocol</title>
		<link rel="alternate" type="text/html" href="https://linux-kvm.org/index.php?title=MonitorProtocol&amp;diff=2914"/>
		<updated>2010-03-15T16:34:31Z</updated>

		<summary type="html">&lt;p&gt;Dorileo: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= QEMU Monitor Protocol =&lt;br /&gt;
&lt;br /&gt;
The QEMU Monitor Protocol (QMP) allows applications to communicate with QEMU&#039;s Monitor.&lt;br /&gt;
&lt;br /&gt;
QMP is [http://www.json.org/ JSON]-based, its main features are:&lt;br /&gt;
&lt;br /&gt;
* Lightweight, text-based, easy to parse data format&lt;br /&gt;
* Asynchronous events support&lt;br /&gt;
&lt;br /&gt;
The [http://git.savannah.gnu.org/cgit/qemu.git/tree/QMP/README README] file explains how to use it and its full specification can be found [http://git.savannah.gnu.org/cgit/qemu.git/tree/QMP/qmp-spec.txt here].&lt;br /&gt;
&lt;br /&gt;
== General Status ==&lt;br /&gt;
&lt;br /&gt;
A &#039;&#039;&#039;preview&#039;&#039;&#039; version of QMP is available in QEMU version 0.12.&lt;br /&gt;
&lt;br /&gt;
However, QMP is still under development being considered unstable and incomplete. For more information about converted handlers, please check [[#Conversion Status]].&lt;br /&gt;
&lt;br /&gt;
== Examples ==&lt;br /&gt;
&lt;br /&gt;
In the following examples, &#039;C&#039; stands for &#039;Client&#039; and &#039;S&#039; stands for &#039;Server&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Server Greeting ===&lt;br /&gt;
&lt;br /&gt;
 S: {&amp;quot;QMP&amp;quot;: {&amp;quot;capabilities&amp;quot;: []}}&lt;br /&gt;
&lt;br /&gt;
=== Query version ===&lt;br /&gt;
&lt;br /&gt;
 C: { &amp;quot;execute&amp;quot;: &amp;quot;query-version&amp;quot; }&lt;br /&gt;
 S: {&amp;quot;return&amp;quot;: {&amp;quot;qemu&amp;quot;: &amp;quot;0.11.50&amp;quot;, &amp;quot;package&amp;quot;: &amp;quot;&amp;quot;}}&lt;br /&gt;
&lt;br /&gt;
=== Eject a device ===&lt;br /&gt;
&lt;br /&gt;
 C: { &amp;quot;execute&amp;quot;: &amp;quot;eject&amp;quot;, &amp;quot;arguments&amp;quot;: { &amp;quot;device&amp;quot;: &amp;quot;ide1-cd0&amp;quot; } }&lt;br /&gt;
 S: {&amp;quot;return&amp;quot;: {}}&lt;br /&gt;
&lt;br /&gt;
== Development ==&lt;br /&gt;
&lt;br /&gt;
Primary contact is [mailto:lcapitulino@redhat.com Luiz Capitulino], but all QMP-related discussions happen on the [http://lists.nongnu.org/mailman/listinfo/qemu-devel qemu-devel] mailing list.&lt;br /&gt;
&lt;br /&gt;
Next features, hot fixes and other patches are stored in the QMP unstable repository:&lt;br /&gt;
&lt;br /&gt;
http://repo.or.cz/w/qemu/qmp-unstable.git&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;NOTE&#039;&#039;&#039;: all branches in this repository are constantly &#039;&#039;rebased&#039;&#039; (master inclusive).&lt;br /&gt;
&lt;br /&gt;
== TODO ==&lt;br /&gt;
&lt;br /&gt;
* Convert all remaining commands&lt;br /&gt;
* High-level protocol documentation&lt;br /&gt;
* High-level internal documentation&lt;br /&gt;
* Improve internal API, currently it&#039;s too [http://lists.gnu.org/archive/html/qemu-devel/2009-12/msg02537.html low-level]&lt;br /&gt;
* Better QObjects and QMP debug support&lt;br /&gt;
* Array-based Monitor&#039;s command table&lt;br /&gt;
* Libqmp&lt;br /&gt;
&lt;br /&gt;
== Conversion Status ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;UPDATED&#039;&#039;&#039;: 2009-12-16&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
|Command&lt;br /&gt;
|Info&lt;br /&gt;
|-&lt;br /&gt;
|Handlers&lt;br /&gt;
|62&lt;br /&gt;
|36&lt;br /&gt;
|-&lt;br /&gt;
|Converted&lt;br /&gt;
|19&lt;br /&gt;
|15&lt;br /&gt;
|-&lt;br /&gt;
|Percentage&lt;br /&gt;
|30%&lt;br /&gt;
|41%&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The following tables have a per-function status. There is one table for &#039;&#039;command&#039;&#039; handlers and another one for &#039;&#039;info&#039;&#039; handlers.&lt;br /&gt;
&lt;br /&gt;
Status can be:&lt;br /&gt;
&lt;br /&gt;
* merged: already merged upstream&lt;br /&gt;
* converted: converted but not merged yet&lt;br /&gt;
* partial: merged, but error handling is incomplete&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;NOTE:&#039;&#039;&#039; Handlers used by [http://libvirt.org Libvirt] are marked with yellow.&lt;br /&gt;
&lt;br /&gt;
==== Command handlers ====&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|&#039;&#039;&#039;Handler name&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;Status&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;Version&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;Comments&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|do_acl_add()&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|do_acl_policy()&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|do_acl_remove()&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|do_acl_reset()&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|do_acl_show()&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|- style=&amp;quot;background-color:yellow;&amp;quot;&lt;br /&gt;
|do_balloon()&lt;br /&gt;
|merged&lt;br /&gt;
|0.12&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|do_block_set_passwd()&lt;br /&gt;
|merged&lt;br /&gt;
|0.12&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|do_boot_set()&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|- style=&amp;quot;background-color:yellow;&amp;quot;&lt;br /&gt;
|do_change()&lt;br /&gt;
|merged&lt;br /&gt;
|0.12&lt;br /&gt;
|&lt;br /&gt;
|- style=&amp;quot;background-color:yellow;&amp;quot;&lt;br /&gt;
|do_closefd()&lt;br /&gt;
|merged&lt;br /&gt;
|0.12&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|do_commit()&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|- style=&amp;quot;background-color:yellow;&amp;quot;&lt;br /&gt;
|do_cont()&lt;br /&gt;
|merged&lt;br /&gt;
|0.12&lt;br /&gt;
|&lt;br /&gt;
|- style=&amp;quot;background-color:yellow;&amp;quot;&lt;br /&gt;
|do_cpu_set()&lt;br /&gt;
|merged&lt;br /&gt;
|0.12.50&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|do_delvm()&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|- style=&amp;quot;background-color:yellow;&amp;quot;&lt;br /&gt;
|do_device_add()&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|- style=&amp;quot;background-color:yellow;&amp;quot;&lt;br /&gt;
|do_device_del()&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|- style=&amp;quot;background-color:yellow;&amp;quot;&lt;br /&gt;
|do_eject()&lt;br /&gt;
|merged&lt;br /&gt;
|0.12&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|do_gdbserver()&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|- style=&amp;quot;background-color:yellow;&amp;quot;&lt;br /&gt;
|do_getfd()&lt;br /&gt;
|merged&lt;br /&gt;
|0.12&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|do_help_cmd()&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|do_info()&lt;br /&gt;
|merged&lt;br /&gt;
|0.12&lt;br /&gt;
|as &#039;query-&#039; commands&lt;br /&gt;
|-&lt;br /&gt;
|do_inject_mce()&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|do_inject_nmi()&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|do_ioport_read()&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|do_ioport_write()&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|do_loadvm()&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|do_log()&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|do_logfile()&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|do_memory_dump()&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|- style=&amp;quot;background-color:yellow;&amp;quot;&lt;br /&gt;
|do_memory_save()&lt;br /&gt;
|merged&lt;br /&gt;
|0.12.50&lt;br /&gt;
|&lt;br /&gt;
|- style=&amp;quot;background-color:yellow;&amp;quot;&lt;br /&gt;
|do_migrate()&lt;br /&gt;
|partial&lt;br /&gt;
|0.12&lt;br /&gt;
|&lt;br /&gt;
|- style=&amp;quot;background-color:yellow;&amp;quot;&lt;br /&gt;
|do_migrate_cancel()&lt;br /&gt;
|merged&lt;br /&gt;
|0.12&lt;br /&gt;
|&lt;br /&gt;
|- style=&amp;quot;background-color:yellow;&amp;quot;&lt;br /&gt;
|do_migrate_set_downtime()&lt;br /&gt;
|merged&lt;br /&gt;
|0.12.50&lt;br /&gt;
|&lt;br /&gt;
|- style=&amp;quot;background-color:yellow;&amp;quot;&lt;br /&gt;
|do_migrate_set_speed()&lt;br /&gt;
|merged&lt;br /&gt;
|0.12.50&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|do_mouse_button()&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|do_mouse_move()&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|do_mouse_set()&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|- style=&amp;quot;background-color:yellow;&amp;quot;&lt;br /&gt;
|do_pci_device_hot_remove()&lt;br /&gt;
|partial&lt;br /&gt;
|0.12&lt;br /&gt;
|legacy, use device_del instead&lt;br /&gt;
|-&lt;br /&gt;
|do_physical_memory_dump()&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|- style=&amp;quot;background-color:yellow;&amp;quot;&lt;br /&gt;
|do_physical_memory_save()&lt;br /&gt;
|merged&lt;br /&gt;
|0.12.50&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|do_print()&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|do_quit()&lt;br /&gt;
|merged&lt;br /&gt;
|0.12&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|do_savevm()&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|do_screen_dump()&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|do_sendkey()&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|- style=&amp;quot;background-color:yellow;&amp;quot;&lt;br /&gt;
|do_set_link()&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|do_singlestep()&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|- style=&amp;quot;background-color:yellow;&amp;quot;&lt;br /&gt;
|do_stop()&lt;br /&gt;
|merged&lt;br /&gt;
|0.12&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|do_stop_capture()&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|do_sum()&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|- style=&amp;quot;background-color:yellow;&amp;quot;&lt;br /&gt;
|do_system_powerdown()&lt;br /&gt;
|merged&lt;br /&gt;
|0.12&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|do_system_reset()&lt;br /&gt;
|merged&lt;br /&gt;
|0.12&lt;br /&gt;
|&lt;br /&gt;
|- style=&amp;quot;background-color:yellow;&amp;quot;&lt;br /&gt;
|do_usb_add()&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|legacy, use device_add instead&lt;br /&gt;
|- style=&amp;quot;background-color:yellow;&amp;quot;&lt;br /&gt;
|do_usb_del()&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|legacy, use device_del instead&lt;br /&gt;
|-&lt;br /&gt;
|do_watchdog_action()&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|do_wav_capture()&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|- style=&amp;quot;background-color:yellow;&amp;quot;&lt;br /&gt;
|drive_hot_add()&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|- style=&amp;quot;background-color:yellow;&amp;quot;&lt;br /&gt;
|net_host_device_add()&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|consider do_netdev_add() instead&lt;br /&gt;
|- style=&amp;quot;background-color:yellow;&amp;quot;&lt;br /&gt;
|net_host_device_remove()&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|consider do_netdev_del() instead&lt;br /&gt;
|-&lt;br /&gt;
|net_slirp_hostfwd_add()&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|net_slirp_hostfwd_remove()&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|- style=&amp;quot;background-color:yellow;&amp;quot;&lt;br /&gt;
|pci_device_hot_add()&lt;br /&gt;
|partial&lt;br /&gt;
|0.12&lt;br /&gt;
|legacy, use device_add instead&lt;br /&gt;
|-&lt;br /&gt;
|do_chardev_add()&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|to be created&lt;br /&gt;
|-&lt;br /&gt;
|do_chardev_del()&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|to be created&lt;br /&gt;
|-&lt;br /&gt;
|do_blockdev_add()&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|to be created&lt;br /&gt;
|-&lt;br /&gt;
|do_blockdev_del()&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|to be created&lt;br /&gt;
|-&lt;br /&gt;
|do_netdev_add()&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|to be created&lt;br /&gt;
|-&lt;br /&gt;
|do_netdev_del()&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|to be created&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Info handlers ====&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|&#039;&#039;&#039;Handler name&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;Status&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;Version&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;Comments&#039;&#039;&#039;&lt;br /&gt;
|- style=&amp;quot;background-color:yellow;&amp;quot;&lt;br /&gt;
|bdrv_info()&lt;br /&gt;
|merged&lt;br /&gt;
|0.12&lt;br /&gt;
|&lt;br /&gt;
|- style=&amp;quot;background-color:yellow;&amp;quot;&lt;br /&gt;
|bdrv_info_stats()&lt;br /&gt;
|merged&lt;br /&gt;
|0.12&lt;br /&gt;
|&lt;br /&gt;
|- style=&amp;quot;background-color:yellow;&amp;quot;&lt;br /&gt;
|do_info_balloon()&lt;br /&gt;
|merged&lt;br /&gt;
|0.12&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|do_info_capture()&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|- style=&amp;quot;background-color:yellow;&amp;quot;&lt;br /&gt;
|do_info_cpus()&lt;br /&gt;
|merged&lt;br /&gt;
|0.12&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|do_info_cpu_stats()&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|do_info_history()&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|do_info_hpet()&lt;br /&gt;
|merged&lt;br /&gt;
|0.12&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|do_info_jit()&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|do_info_kvm()&lt;br /&gt;
|merged&lt;br /&gt;
|0.12&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|do_info_mice()&lt;br /&gt;
|merged&lt;br /&gt;
|0.12&lt;br /&gt;
|&lt;br /&gt;
|- style=&amp;quot;background-color:yellow;&amp;quot;&lt;br /&gt;
|do_info_migrate()&lt;br /&gt;
|merged&lt;br /&gt;
|0.12&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|do_info_name()&lt;br /&gt;
|merged&lt;br /&gt;
|0.12&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|do_info_network()&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|do_info_numa()&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|do_info_profile()&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|do_info_qdm()&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|do_info_qtree()&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|do_info_registers()&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|do_info_roms()&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|do_info_snapshots()&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|do_info_status()&lt;br /&gt;
|merged&lt;br /&gt;
|0.12&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|do_info_usernet()&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|do_info_uuid()&lt;br /&gt;
|merged&lt;br /&gt;
|0.12&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|do_info_version()&lt;br /&gt;
|merged&lt;br /&gt;
|0.12&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|do_info_vnc()&lt;br /&gt;
|merged&lt;br /&gt;
|0.12&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|irq_info()&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|mem_info()&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|- style=&amp;quot;background-color:yellow;&amp;quot;&lt;br /&gt;
|pci_info()&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|pcmcia_info()&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|pic_info()&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|qemu_chr_info()&lt;br /&gt;
|merged&lt;br /&gt;
|0.12&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|tlb_info()&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|usb_host_info()&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|- style=&amp;quot;background-color:yellow;&amp;quot;&lt;br /&gt;
|usb_info()&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Testing ==&lt;br /&gt;
&lt;br /&gt;
Unfortunately, there is no automated tool to test QMP correctness yet. Probably, the right thing to do is to integrate with [http://www.linux-kvm.org/page/KVM-Autotest kvm-autotest] but we still have to think how this should be done.&lt;br /&gt;
&lt;br /&gt;
Meanwhile, QMP testing is a low-level procedure which requires knowledge about the protocol and its implementation, so the first thing to do is to read the [http://git.savannah.gnu.org/cgit/qemu.git/tree/QMP/README README] and [http://git.savannah.gnu.org/cgit/qemu.git/tree/QMP/qmp-spec.txt spec] files.&lt;br /&gt;
&lt;br /&gt;
This section describes two ways of testing QMP:&lt;br /&gt;
&lt;br /&gt;
* By hand (difficult, only worth it if you&#039;re chasing a specific bug)&lt;br /&gt;
* Using qmp-shell script (automates part of the job)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;TODO&#039;&#039;&#039;: libvirt should be far easier, describe it!&lt;br /&gt;
&lt;br /&gt;
=== Libvirt ===&lt;br /&gt;
&lt;br /&gt;
1. Install [http://lloyd.github.com/yajl yajl-devel]  before running &#039;autogen.sh&#039;. Make sure the final summary of autogen.sh tells you that it found the yajl library. If you`re running Fedora 12(or above) just yum install yajl-devel.&lt;br /&gt;
&lt;br /&gt;
2. From a fresh checkout of [http://libvirt.org/git/?p=libvirt.git;a=summary GIT master] run the following:&lt;br /&gt;
&lt;br /&gt;
 ./autogen.sh --system --enable-compile-warnings=error&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;NOTE:&#039;&#039;&#039; The &#039;--system&#039; flag is a shortcut for compiling with the --prefix and other directories matching a system RPM build.&lt;br /&gt;
&lt;br /&gt;
3. Run &#039;make&#039; to build. There is no need to &#039;make install&#039; anything&lt;br /&gt;
especially since that would overwrite your RPM based install&lt;br /&gt;
&lt;br /&gt;
4. As root simply stop the current daemon &amp;amp; start the one you built&lt;br /&gt;
&lt;br /&gt;
 /etc/init.d/libvirtd stop&lt;br /&gt;
 $HOME/your/git/checkout/of/libvirt/daemon/libvirtd&lt;br /&gt;
&lt;br /&gt;
5. As root you can use the newly built virsh too&lt;br /&gt;
&lt;br /&gt;
 cd $HOME/your/git/checkout/of/libvirt/src&lt;br /&gt;
 ./virsh &amp;lt;BLAH&amp;gt;&lt;br /&gt;
&lt;br /&gt;
6. To enable QMP support, before you build edit &#039;&#039;&#039;src/qemu/qemu_conf.c&#039;&#039;&#039; and find:&lt;br /&gt;
&lt;br /&gt;
 #if 0&lt;br /&gt;
    if (version &amp;gt;= 13000)&lt;br /&gt;
        flags |= QEMUD_CMD_FLAG_MONITOR_JSON;&lt;br /&gt;
 #endif&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;NOTE:&#039;&#039;&#039; If enabled libvirt will use QMP as default monitor.&lt;br /&gt;
&lt;br /&gt;
7. Change that to an &#039;#if 1&#039;, and change the version to 12000 so it detects your GIT build of QEMU&lt;br /&gt;
&lt;br /&gt;
=== By hand ===&lt;br /&gt;
&lt;br /&gt;
1. Start QMP on a TCP socket, so that telnet can be used&lt;br /&gt;
&lt;br /&gt;
 qemu [...] -qmp tcp:localhost:4444,server&lt;br /&gt;
&lt;br /&gt;
2. Now, run telnet&lt;br /&gt;
&lt;br /&gt;
 telnet localhost 4444&lt;br /&gt;
&lt;br /&gt;
3. You should see the following prompt&lt;br /&gt;
&lt;br /&gt;
 {&amp;quot;QMP&amp;quot;: {&amp;quot;capabilities&amp;quot;: []}}&lt;br /&gt;
&lt;br /&gt;
4. Now you can issue commands. To get a list of QMP supported commands, run &#039;&#039;query-commands&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 { &amp;quot;execute&amp;quot;: &amp;quot;query-commands&amp;quot; }&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;NOTE:&#039;&#039;&#039; all &amp;quot;info&amp;quot; commands are available under QMP as &amp;quot;query-&amp;quot;, for example &amp;quot;info vnc&amp;quot; is &amp;quot;query-vnc&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
The output of &#039;&#039;query-commands&#039;&#039; is a JSON array of objects, each with a &#039;name&#039; key, which has the name of the supported command. QMP doesn&#039;t have user documentation yet, this means that, to find out which arguments a command accepts or what&#039;s its output, you will have to either check the [http://git.savannah.gnu.org/cgit/qemu.git/tree/qemu-monitor.hx qemu-monitor.hx] file and/or the function which implements the command.&lt;br /&gt;
&lt;br /&gt;
Yes, it&#039;s that low-level.&lt;br /&gt;
&lt;br /&gt;
=== qmp-shell script ===&lt;br /&gt;
&lt;br /&gt;
This script is available under the [http://git.savannah.gnu.org/cgit/qemu.git/tree/QMP QMP] directory in QEMU&#039;s source-tree. It automates a bit the testing work, as it can construct commands.&lt;br /&gt;
&lt;br /&gt;
1. Start QMP on a unix socket, like:&lt;br /&gt;
&lt;br /&gt;
 qemu [...] -qmp unix:./qmp-sock,server&lt;br /&gt;
&lt;br /&gt;
2. Run the script&lt;br /&gt;
&lt;br /&gt;
 qmp-shell ./qmp-sock&lt;br /&gt;
&lt;br /&gt;
3. You should get the following prompt&lt;br /&gt;
&lt;br /&gt;
 (QEMU)&lt;br /&gt;
&lt;br /&gt;
4. Now you can run commands. For example, let&#039;s change the VNC password:&lt;br /&gt;
&lt;br /&gt;
 (QEMU) change device=vnc target=password arg=&#039;1234&#039;&lt;br /&gt;
&lt;br /&gt;
So, it&#039;s needed to name the arguments and the script is not very smart. Again, to find out what arguments a command accepts, you have to either check the [http://git.savannah.gnu.org/cgit/qemu.git/tree/qemu-monitor.hx qemu-monitor.hx] file and/or the function which implements the command.&lt;br /&gt;
&lt;br /&gt;
Have fun!&lt;br /&gt;
&lt;br /&gt;
== History ==&lt;br /&gt;
&lt;br /&gt;
This was the fourth proposal for a Monitor protocol, past discussions can be found in the following links:&lt;br /&gt;
&lt;br /&gt;
* http://www.mail-archive.com/qemu-devel@nongnu.org/msg14593.html&lt;br /&gt;
* http://lists.gnu.org/archive/html/qemu-devel/2009-01/msg00655.html&lt;br /&gt;
* http://lists.gnu.org/archive/html/qemu-devel/2009-06/msg01584.html&lt;/div&gt;</summary>
		<author><name>Dorileo</name></author>
	</entry>
</feed>