mirror of https://github.com/xqemu/xqemu.git
Merge remote-tracking branch 'remotes/qmp-unstable/queue/qmp' into staging
* remotes/qmp-unstable/queue/qmp: docs/qmp: Fix documentation of BLOCK_JOB_READY to match code char: report frontend open/closed state in 'query-chardev' virtio-serial: report frontend connection state via monitor qmp: add qmp-events.txt back qapi event: clean up in callers qapi script: clean up in scripts qapi: ignore generated event files qapi: move event defines Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
This commit is contained in:
commit
ac8076ac86
|
@ -26,6 +26,7 @@
|
||||||
/qapi-generated
|
/qapi-generated
|
||||||
/qapi-types.[ch]
|
/qapi-types.[ch]
|
||||||
/qapi-visit.[ch]
|
/qapi-visit.[ch]
|
||||||
|
/qapi-event.[ch]
|
||||||
/qmp-commands.h
|
/qmp-commands.h
|
||||||
/qmp-marshal.c
|
/qmp-marshal.c
|
||||||
/qemu-doc.html
|
/qemu-doc.html
|
||||||
|
|
2
Makefile
2
Makefile
|
@ -248,7 +248,7 @@ $(SRC_PATH)/qga/qapi-schema.json $(SRC_PATH)/scripts/qapi-commands.py $(qapi-py)
|
||||||
|
|
||||||
qapi-modules = $(SRC_PATH)/qapi-schema.json $(SRC_PATH)/qapi/common.json \
|
qapi-modules = $(SRC_PATH)/qapi-schema.json $(SRC_PATH)/qapi/common.json \
|
||||||
$(SRC_PATH)/qapi/block.json $(SRC_PATH)/qapi/block-core.json \
|
$(SRC_PATH)/qapi/block.json $(SRC_PATH)/qapi/block-core.json \
|
||||||
$(SRC_PATH)/qapi-event.json
|
$(SRC_PATH)/qapi/event.json
|
||||||
|
|
||||||
qapi-types.c qapi-types.h :\
|
qapi-types.c qapi-types.h :\
|
||||||
$(qapi-modules) $(SRC_PATH)/scripts/qapi-types.py $(qapi-py)
|
$(qapi-modules) $(SRC_PATH)/scripts/qapi-types.py $(qapi-py)
|
||||||
|
|
|
@ -218,10 +218,10 @@ An example command is:
|
||||||
=== Events ===
|
=== Events ===
|
||||||
|
|
||||||
Events are defined with the keyword 'event'. When 'data' is also specified,
|
Events are defined with the keyword 'event'. When 'data' is also specified,
|
||||||
additional info will be carried on. Finally there will be C API generated
|
additional info will be included in the event. Finally there will be C API
|
||||||
in qapi-event.h; when called by QEMU code, a message with timestamp will
|
generated in qapi-event.h; when called by QEMU code, a message with timestamp
|
||||||
be emitted on the wire. If timestamp is -1, it means failure to retrieve host
|
will be emitted on the wire. If timestamp is -1, it means failure to retrieve
|
||||||
time.
|
host time.
|
||||||
|
|
||||||
An example event is:
|
An example event is:
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,559 @@
|
||||||
|
QEMU Machine Protocol Events
|
||||||
|
============================
|
||||||
|
|
||||||
|
ACPI_DEVICE_OST
|
||||||
|
---------------
|
||||||
|
|
||||||
|
Emitted when guest executes ACPI _OST method.
|
||||||
|
|
||||||
|
- data: ACPIOSTInfo type as described in qapi-schema.json
|
||||||
|
|
||||||
|
{ "event": "ACPI_DEVICE_OST",
|
||||||
|
"data": { "device": "d1", "slot": "0", "slot-type": "DIMM", "source": 1, "status": 0 } }
|
||||||
|
|
||||||
|
BALLOON_CHANGE
|
||||||
|
--------------
|
||||||
|
|
||||||
|
Emitted when the guest changes the actual BALLOON level. This
|
||||||
|
value is equivalent to the 'actual' field return by the
|
||||||
|
'query-balloon' command
|
||||||
|
|
||||||
|
Data:
|
||||||
|
|
||||||
|
- "actual": actual level of the guest memory balloon in bytes (json-number)
|
||||||
|
|
||||||
|
Example:
|
||||||
|
|
||||||
|
{ "event": "BALLOON_CHANGE",
|
||||||
|
"data": { "actual": 944766976 },
|
||||||
|
"timestamp": { "seconds": 1267020223, "microseconds": 435656 } }
|
||||||
|
|
||||||
|
BLOCK_IMAGE_CORRUPTED
|
||||||
|
---------------------
|
||||||
|
|
||||||
|
Emitted when a disk image is being marked corrupt.
|
||||||
|
|
||||||
|
Data:
|
||||||
|
|
||||||
|
- "device": Device name (json-string)
|
||||||
|
- "msg": Informative message (e.g., reason for the corruption) (json-string)
|
||||||
|
- "offset": If the corruption resulted from an image access, this is the access
|
||||||
|
offset into the image (json-int)
|
||||||
|
- "size": If the corruption resulted from an image access, this is the access
|
||||||
|
size (json-int)
|
||||||
|
|
||||||
|
Example:
|
||||||
|
|
||||||
|
{ "event": "BLOCK_IMAGE_CORRUPTED",
|
||||||
|
"data": { "device": "ide0-hd0",
|
||||||
|
"msg": "Prevented active L1 table overwrite", "offset": 196608,
|
||||||
|
"size": 65536 },
|
||||||
|
"timestamp": { "seconds": 1378126126, "microseconds": 966463 } }
|
||||||
|
|
||||||
|
BLOCK_IO_ERROR
|
||||||
|
--------------
|
||||||
|
|
||||||
|
Emitted when a disk I/O error occurs.
|
||||||
|
|
||||||
|
Data:
|
||||||
|
|
||||||
|
- "device": device name (json-string)
|
||||||
|
- "operation": I/O operation (json-string, "read" or "write")
|
||||||
|
- "action": action that has been taken, it's one of the following (json-string):
|
||||||
|
"ignore": error has been ignored
|
||||||
|
"report": error has been reported to the device
|
||||||
|
"stop": the VM is going to stop because of the error
|
||||||
|
|
||||||
|
Example:
|
||||||
|
|
||||||
|
{ "event": "BLOCK_IO_ERROR",
|
||||||
|
"data": { "device": "ide0-hd1",
|
||||||
|
"operation": "write",
|
||||||
|
"action": "stop" },
|
||||||
|
"timestamp": { "seconds": 1265044230, "microseconds": 450486 } }
|
||||||
|
|
||||||
|
Note: If action is "stop", a STOP event will eventually follow the
|
||||||
|
BLOCK_IO_ERROR event.
|
||||||
|
|
||||||
|
BLOCK_JOB_CANCELLED
|
||||||
|
-------------------
|
||||||
|
|
||||||
|
Emitted when a block job has been cancelled.
|
||||||
|
|
||||||
|
Data:
|
||||||
|
|
||||||
|
- "type": Job type (json-string; "stream" for image streaming
|
||||||
|
"commit" for block commit)
|
||||||
|
- "device": Device name (json-string)
|
||||||
|
- "len": Maximum progress value (json-int)
|
||||||
|
- "offset": Current progress value (json-int)
|
||||||
|
On success this is equal to len.
|
||||||
|
On failure this is less than len.
|
||||||
|
- "speed": Rate limit, bytes per second (json-int)
|
||||||
|
|
||||||
|
Example:
|
||||||
|
|
||||||
|
{ "event": "BLOCK_JOB_CANCELLED",
|
||||||
|
"data": { "type": "stream", "device": "virtio-disk0",
|
||||||
|
"len": 10737418240, "offset": 134217728,
|
||||||
|
"speed": 0 },
|
||||||
|
"timestamp": { "seconds": 1267061043, "microseconds": 959568 } }
|
||||||
|
|
||||||
|
BLOCK_JOB_COMPLETED
|
||||||
|
-------------------
|
||||||
|
|
||||||
|
Emitted when a block job has completed.
|
||||||
|
|
||||||
|
Data:
|
||||||
|
|
||||||
|
- "type": Job type (json-string; "stream" for image streaming
|
||||||
|
"commit" for block commit)
|
||||||
|
- "device": Device name (json-string)
|
||||||
|
- "len": Maximum progress value (json-int)
|
||||||
|
- "offset": Current progress value (json-int)
|
||||||
|
On success this is equal to len.
|
||||||
|
On failure this is less than len.
|
||||||
|
- "speed": Rate limit, bytes per second (json-int)
|
||||||
|
- "error": Error message (json-string, optional)
|
||||||
|
Only present on failure. This field contains a human-readable
|
||||||
|
error message. There are no semantics other than that streaming
|
||||||
|
has failed and clients should not try to interpret the error
|
||||||
|
string.
|
||||||
|
|
||||||
|
Example:
|
||||||
|
|
||||||
|
{ "event": "BLOCK_JOB_COMPLETED",
|
||||||
|
"data": { "type": "stream", "device": "virtio-disk0",
|
||||||
|
"len": 10737418240, "offset": 10737418240,
|
||||||
|
"speed": 0 },
|
||||||
|
"timestamp": { "seconds": 1267061043, "microseconds": 959568 } }
|
||||||
|
|
||||||
|
BLOCK_JOB_ERROR
|
||||||
|
---------------
|
||||||
|
|
||||||
|
Emitted when a block job encounters an error.
|
||||||
|
|
||||||
|
Data:
|
||||||
|
|
||||||
|
- "device": device name (json-string)
|
||||||
|
- "operation": I/O operation (json-string, "read" or "write")
|
||||||
|
- "action": action that has been taken, it's one of the following (json-string):
|
||||||
|
"ignore": error has been ignored, the job may fail later
|
||||||
|
"report": error will be reported and the job canceled
|
||||||
|
"stop": error caused job to be paused
|
||||||
|
|
||||||
|
Example:
|
||||||
|
|
||||||
|
{ "event": "BLOCK_JOB_ERROR",
|
||||||
|
"data": { "device": "ide0-hd1",
|
||||||
|
"operation": "write",
|
||||||
|
"action": "stop" },
|
||||||
|
"timestamp": { "seconds": 1265044230, "microseconds": 450486 } }
|
||||||
|
|
||||||
|
BLOCK_JOB_READY
|
||||||
|
---------------
|
||||||
|
|
||||||
|
Emitted when a block job is ready to complete.
|
||||||
|
|
||||||
|
Data:
|
||||||
|
|
||||||
|
- "type": Job type (json-string; "stream" for image streaming
|
||||||
|
"commit" for block commit)
|
||||||
|
- "device": Device name (json-string)
|
||||||
|
- "len": Maximum progress value (json-int)
|
||||||
|
- "offset": Current progress value (json-int)
|
||||||
|
On success this is equal to len.
|
||||||
|
On failure this is less than len.
|
||||||
|
- "speed": Rate limit, bytes per second (json-int)
|
||||||
|
|
||||||
|
Example:
|
||||||
|
|
||||||
|
{ "event": "BLOCK_JOB_READY",
|
||||||
|
"data": { "device": "drive0", "type": "mirror", "speed": 0,
|
||||||
|
"len": 2097152, "offset": 2097152 }
|
||||||
|
"timestamp": { "seconds": 1265044230, "microseconds": 450486 } }
|
||||||
|
|
||||||
|
Note: The "ready to complete" status is always reset by a BLOCK_JOB_ERROR
|
||||||
|
event.
|
||||||
|
|
||||||
|
DEVICE_DELETED
|
||||||
|
--------------
|
||||||
|
|
||||||
|
Emitted whenever the device removal completion is acknowledged
|
||||||
|
by the guest.
|
||||||
|
At this point, it's safe to reuse the specified device ID.
|
||||||
|
Device removal can be initiated by the guest or by HMP/QMP commands.
|
||||||
|
|
||||||
|
Data:
|
||||||
|
|
||||||
|
- "device": device name (json-string, optional)
|
||||||
|
- "path": device path (json-string)
|
||||||
|
|
||||||
|
{ "event": "DEVICE_DELETED",
|
||||||
|
"data": { "device": "virtio-net-pci-0",
|
||||||
|
"path": "/machine/peripheral/virtio-net-pci-0" },
|
||||||
|
"timestamp": { "seconds": 1265044230, "microseconds": 450486 } }
|
||||||
|
|
||||||
|
DEVICE_TRAY_MOVED
|
||||||
|
-----------------
|
||||||
|
|
||||||
|
It's emitted whenever the tray of a removable device is moved by the guest
|
||||||
|
or by HMP/QMP commands.
|
||||||
|
|
||||||
|
Data:
|
||||||
|
|
||||||
|
- "device": device name (json-string)
|
||||||
|
- "tray-open": true if the tray has been opened or false if it has been closed
|
||||||
|
(json-bool)
|
||||||
|
|
||||||
|
{ "event": "DEVICE_TRAY_MOVED",
|
||||||
|
"data": { "device": "ide1-cd0",
|
||||||
|
"tray-open": true
|
||||||
|
},
|
||||||
|
"timestamp": { "seconds": 1265044230, "microseconds": 450486 } }
|
||||||
|
|
||||||
|
GUEST_PANICKED
|
||||||
|
--------------
|
||||||
|
|
||||||
|
Emitted when guest OS panic is detected.
|
||||||
|
|
||||||
|
Data:
|
||||||
|
|
||||||
|
- "action": Action that has been taken (json-string, currently always "pause").
|
||||||
|
|
||||||
|
Example:
|
||||||
|
|
||||||
|
{ "event": "GUEST_PANICKED",
|
||||||
|
"data": { "action": "pause" } }
|
||||||
|
|
||||||
|
NIC_RX_FILTER_CHANGED
|
||||||
|
---------------------
|
||||||
|
|
||||||
|
The event is emitted once until the query command is executed,
|
||||||
|
the first event will always be emitted.
|
||||||
|
|
||||||
|
Data:
|
||||||
|
|
||||||
|
- "name": net client name (json-string)
|
||||||
|
- "path": device path (json-string)
|
||||||
|
|
||||||
|
{ "event": "NIC_RX_FILTER_CHANGED",
|
||||||
|
"data": { "name": "vnet0",
|
||||||
|
"path": "/machine/peripheral/vnet0/virtio-backend" },
|
||||||
|
"timestamp": { "seconds": 1368697518, "microseconds": 326866 } }
|
||||||
|
}
|
||||||
|
|
||||||
|
QUORUM_FAILURE
|
||||||
|
--------------
|
||||||
|
|
||||||
|
Emitted by the Quorum block driver if it fails to establish a quorum.
|
||||||
|
|
||||||
|
Data:
|
||||||
|
|
||||||
|
- "reference": device name if defined else node name.
|
||||||
|
- "sector-num": Number of the first sector of the failed read operation.
|
||||||
|
- "sector-count": Failed read operation sector count.
|
||||||
|
|
||||||
|
Example:
|
||||||
|
|
||||||
|
{ "event": "QUORUM_FAILURE",
|
||||||
|
"data": { "reference": "usr1", "sector-num": 345435, "sector-count": 5 },
|
||||||
|
"timestamp": { "seconds": 1344522075, "microseconds": 745528 } }
|
||||||
|
|
||||||
|
QUORUM_REPORT_BAD
|
||||||
|
-----------------
|
||||||
|
|
||||||
|
Emitted to report a corruption of a Quorum file.
|
||||||
|
|
||||||
|
Data:
|
||||||
|
|
||||||
|
- "error": Error message (json-string, optional)
|
||||||
|
Only present on failure. This field contains a human-readable
|
||||||
|
error message. There are no semantics other than that the
|
||||||
|
block layer reported an error and clients should not try to
|
||||||
|
interpret the error string.
|
||||||
|
- "node-name": The graph node name of the block driver state.
|
||||||
|
- "sector-num": Number of the first sector of the failed read operation.
|
||||||
|
- "sector-count": Failed read operation sector count.
|
||||||
|
|
||||||
|
Example:
|
||||||
|
|
||||||
|
{ "event": "QUORUM_REPORT_BAD",
|
||||||
|
"data": { "node-name": "1.raw", "sector-num": 345435, "sector-count": 5 },
|
||||||
|
"timestamp": { "seconds": 1344522075, "microseconds": 745528 } }
|
||||||
|
|
||||||
|
RESET
|
||||||
|
-----
|
||||||
|
|
||||||
|
Emitted when the Virtual Machine is reseted.
|
||||||
|
|
||||||
|
Data: None.
|
||||||
|
|
||||||
|
Example:
|
||||||
|
|
||||||
|
{ "event": "RESET",
|
||||||
|
"timestamp": { "seconds": 1267041653, "microseconds": 9518 } }
|
||||||
|
|
||||||
|
RESUME
|
||||||
|
------
|
||||||
|
|
||||||
|
Emitted when the Virtual Machine resumes execution.
|
||||||
|
|
||||||
|
Data: None.
|
||||||
|
|
||||||
|
Example:
|
||||||
|
|
||||||
|
{ "event": "RESUME",
|
||||||
|
"timestamp": { "seconds": 1271770767, "microseconds": 582542 } }
|
||||||
|
|
||||||
|
RTC_CHANGE
|
||||||
|
----------
|
||||||
|
|
||||||
|
Emitted when the guest changes the RTC time.
|
||||||
|
|
||||||
|
Data:
|
||||||
|
|
||||||
|
- "offset": Offset between base RTC clock (as specified by -rtc base), and
|
||||||
|
new RTC clock value (json-number)
|
||||||
|
|
||||||
|
Example:
|
||||||
|
|
||||||
|
{ "event": "RTC_CHANGE",
|
||||||
|
"data": { "offset": 78 },
|
||||||
|
"timestamp": { "seconds": 1267020223, "microseconds": 435656 } }
|
||||||
|
|
||||||
|
SHUTDOWN
|
||||||
|
--------
|
||||||
|
|
||||||
|
Emitted when the Virtual Machine is powered down.
|
||||||
|
|
||||||
|
Data: None.
|
||||||
|
|
||||||
|
Example:
|
||||||
|
|
||||||
|
{ "event": "SHUTDOWN",
|
||||||
|
"timestamp": { "seconds": 1267040730, "microseconds": 682951 } }
|
||||||
|
|
||||||
|
Note: If the command-line option "-no-shutdown" has been specified, a STOP
|
||||||
|
event will eventually follow the SHUTDOWN event.
|
||||||
|
|
||||||
|
SPICE_CONNECTED, SPICE_DISCONNECTED
|
||||||
|
-----------------------------------
|
||||||
|
|
||||||
|
Emitted when a SPICE client connects or disconnects.
|
||||||
|
|
||||||
|
Data:
|
||||||
|
|
||||||
|
- "server": Server information (json-object)
|
||||||
|
- "host": IP address (json-string)
|
||||||
|
- "port": port number (json-string)
|
||||||
|
- "family": address family (json-string, "ipv4" or "ipv6")
|
||||||
|
- "client": Client information (json-object)
|
||||||
|
- "host": IP address (json-string)
|
||||||
|
- "port": port number (json-string)
|
||||||
|
- "family": address family (json-string, "ipv4" or "ipv6")
|
||||||
|
|
||||||
|
Example:
|
||||||
|
|
||||||
|
{ "timestamp": {"seconds": 1290688046, "microseconds": 388707},
|
||||||
|
"event": "SPICE_CONNECTED",
|
||||||
|
"data": {
|
||||||
|
"server": { "port": "5920", "family": "ipv4", "host": "127.0.0.1"},
|
||||||
|
"client": {"port": "52873", "family": "ipv4", "host": "127.0.0.1"}
|
||||||
|
}}
|
||||||
|
|
||||||
|
SPICE_INITIALIZED
|
||||||
|
-----------------
|
||||||
|
|
||||||
|
Emitted after initial handshake and authentication takes place (if any)
|
||||||
|
and the SPICE channel is up'n'running
|
||||||
|
|
||||||
|
Data:
|
||||||
|
|
||||||
|
- "server": Server information (json-object)
|
||||||
|
- "host": IP address (json-string)
|
||||||
|
- "port": port number (json-string)
|
||||||
|
- "family": address family (json-string, "ipv4" or "ipv6")
|
||||||
|
- "auth": authentication method (json-string, optional)
|
||||||
|
- "client": Client information (json-object)
|
||||||
|
- "host": IP address (json-string)
|
||||||
|
- "port": port number (json-string)
|
||||||
|
- "family": address family (json-string, "ipv4" or "ipv6")
|
||||||
|
- "connection-id": spice connection id. All channels with the same id
|
||||||
|
belong to the same spice session (json-int)
|
||||||
|
- "channel-type": channel type. "1" is the main control channel, filter for
|
||||||
|
this one if you want track spice sessions only (json-int)
|
||||||
|
- "channel-id": channel id. Usually "0", might be different needed when
|
||||||
|
multiple channels of the same type exist, such as multiple
|
||||||
|
display channels in a multihead setup (json-int)
|
||||||
|
- "tls": whevener the channel is encrypted (json-bool)
|
||||||
|
|
||||||
|
Example:
|
||||||
|
|
||||||
|
{ "timestamp": {"seconds": 1290688046, "microseconds": 417172},
|
||||||
|
"event": "SPICE_INITIALIZED",
|
||||||
|
"data": {"server": {"auth": "spice", "port": "5921",
|
||||||
|
"family": "ipv4", "host": "127.0.0.1"},
|
||||||
|
"client": {"port": "49004", "family": "ipv4", "channel-type": 3,
|
||||||
|
"connection-id": 1804289383, "host": "127.0.0.1",
|
||||||
|
"channel-id": 0, "tls": true}
|
||||||
|
}}
|
||||||
|
|
||||||
|
STOP
|
||||||
|
----
|
||||||
|
|
||||||
|
Emitted when the Virtual Machine is stopped.
|
||||||
|
|
||||||
|
Data: None.
|
||||||
|
|
||||||
|
Example:
|
||||||
|
|
||||||
|
{ "event": "STOP",
|
||||||
|
"timestamp": { "seconds": 1267041730, "microseconds": 281295 } }
|
||||||
|
|
||||||
|
SUSPEND
|
||||||
|
-------
|
||||||
|
|
||||||
|
Emitted when guest enters S3 state.
|
||||||
|
|
||||||
|
Data: None.
|
||||||
|
|
||||||
|
Example:
|
||||||
|
|
||||||
|
{ "event": "SUSPEND",
|
||||||
|
"timestamp": { "seconds": 1344456160, "microseconds": 309119 } }
|
||||||
|
|
||||||
|
SUSPEND_DISK
|
||||||
|
------------
|
||||||
|
|
||||||
|
Emitted when the guest makes a request to enter S4 state.
|
||||||
|
|
||||||
|
Data: None.
|
||||||
|
|
||||||
|
Example:
|
||||||
|
|
||||||
|
{ "event": "SUSPEND_DISK",
|
||||||
|
"timestamp": { "seconds": 1344456160, "microseconds": 309119 } }
|
||||||
|
|
||||||
|
Note: QEMU shuts down when entering S4 state.
|
||||||
|
|
||||||
|
VNC_CONNECTED
|
||||||
|
-------------
|
||||||
|
|
||||||
|
Emitted when a VNC client establishes a connection.
|
||||||
|
|
||||||
|
Data:
|
||||||
|
|
||||||
|
- "server": Server information (json-object)
|
||||||
|
- "host": IP address (json-string)
|
||||||
|
- "service": port number (json-string)
|
||||||
|
- "family": address family (json-string, "ipv4" or "ipv6")
|
||||||
|
- "auth": authentication method (json-string, optional)
|
||||||
|
- "client": Client information (json-object)
|
||||||
|
- "host": IP address (json-string)
|
||||||
|
- "service": port number (json-string)
|
||||||
|
- "family": address family (json-string, "ipv4" or "ipv6")
|
||||||
|
|
||||||
|
Example:
|
||||||
|
|
||||||
|
{ "event": "VNC_CONNECTED",
|
||||||
|
"data": {
|
||||||
|
"server": { "auth": "sasl", "family": "ipv4",
|
||||||
|
"service": "5901", "host": "0.0.0.0" },
|
||||||
|
"client": { "family": "ipv4", "service": "58425",
|
||||||
|
"host": "127.0.0.1" } },
|
||||||
|
"timestamp": { "seconds": 1262976601, "microseconds": 975795 } }
|
||||||
|
|
||||||
|
|
||||||
|
Note: This event is emitted before any authentication takes place, thus
|
||||||
|
the authentication ID is not provided.
|
||||||
|
|
||||||
|
VNC_DISCONNECTED
|
||||||
|
----------------
|
||||||
|
|
||||||
|
Emitted when the connection is closed.
|
||||||
|
|
||||||
|
Data:
|
||||||
|
|
||||||
|
- "server": Server information (json-object)
|
||||||
|
- "host": IP address (json-string)
|
||||||
|
- "service": port number (json-string)
|
||||||
|
- "family": address family (json-string, "ipv4" or "ipv6")
|
||||||
|
- "auth": authentication method (json-string, optional)
|
||||||
|
- "client": Client information (json-object)
|
||||||
|
- "host": IP address (json-string)
|
||||||
|
- "service": port number (json-string)
|
||||||
|
- "family": address family (json-string, "ipv4" or "ipv6")
|
||||||
|
- "x509_dname": TLS dname (json-string, optional)
|
||||||
|
- "sasl_username": SASL username (json-string, optional)
|
||||||
|
|
||||||
|
Example:
|
||||||
|
|
||||||
|
{ "event": "VNC_DISCONNECTED",
|
||||||
|
"data": {
|
||||||
|
"server": { "auth": "sasl", "family": "ipv4",
|
||||||
|
"service": "5901", "host": "0.0.0.0" },
|
||||||
|
"client": { "family": "ipv4", "service": "58425",
|
||||||
|
"host": "127.0.0.1", "sasl_username": "luiz" } },
|
||||||
|
"timestamp": { "seconds": 1262976601, "microseconds": 975795 } }
|
||||||
|
|
||||||
|
VNC_INITIALIZED
|
||||||
|
---------------
|
||||||
|
|
||||||
|
Emitted after authentication takes place (if any) and the VNC session is
|
||||||
|
made active.
|
||||||
|
|
||||||
|
Data:
|
||||||
|
|
||||||
|
- "server": Server information (json-object)
|
||||||
|
- "host": IP address (json-string)
|
||||||
|
- "service": port number (json-string)
|
||||||
|
- "family": address family (json-string, "ipv4" or "ipv6")
|
||||||
|
- "auth": authentication method (json-string, optional)
|
||||||
|
- "client": Client information (json-object)
|
||||||
|
- "host": IP address (json-string)
|
||||||
|
- "service": port number (json-string)
|
||||||
|
- "family": address family (json-string, "ipv4" or "ipv6")
|
||||||
|
- "x509_dname": TLS dname (json-string, optional)
|
||||||
|
- "sasl_username": SASL username (json-string, optional)
|
||||||
|
|
||||||
|
Example:
|
||||||
|
|
||||||
|
{ "event": "VNC_INITIALIZED",
|
||||||
|
"data": {
|
||||||
|
"server": { "auth": "sasl", "family": "ipv4",
|
||||||
|
"service": "5901", "host": "0.0.0.0"},
|
||||||
|
"client": { "family": "ipv4", "service": "46089",
|
||||||
|
"host": "127.0.0.1", "sasl_username": "luiz" } },
|
||||||
|
"timestamp": { "seconds": 1263475302, "microseconds": 150772 } }
|
||||||
|
|
||||||
|
WAKEUP
|
||||||
|
------
|
||||||
|
|
||||||
|
Emitted when the guest has woken up from S3 and is running.
|
||||||
|
|
||||||
|
Data: None.
|
||||||
|
|
||||||
|
Example:
|
||||||
|
|
||||||
|
{ "event": "WAKEUP",
|
||||||
|
"timestamp": { "seconds": 1344522075, "microseconds": 745528 } }
|
||||||
|
|
||||||
|
WATCHDOG
|
||||||
|
--------
|
||||||
|
|
||||||
|
Emitted when the watchdog device's timer is expired.
|
||||||
|
|
||||||
|
Data:
|
||||||
|
|
||||||
|
- "action": Action that has been taken, it's one of the following (json-string):
|
||||||
|
"reset", "shutdown", "poweroff", "pause", "debug", or "none"
|
||||||
|
|
||||||
|
Example:
|
||||||
|
|
||||||
|
{ "event": "WATCHDOG",
|
||||||
|
"data": { "action": "reset" },
|
||||||
|
"timestamp": { "seconds": 1267061043, "microseconds": 959568 } }
|
||||||
|
|
||||||
|
Note: If action is "reset", "shutdown", or "pause" the WATCHDOG event is
|
||||||
|
followed respectively by the RESET, SHUTDOWN, or STOP events.
|
|
@ -14,6 +14,7 @@
|
||||||
#include "qemu/error-report.h"
|
#include "qemu/error-report.h"
|
||||||
#include "trace.h"
|
#include "trace.h"
|
||||||
#include "hw/virtio/virtio-serial.h"
|
#include "hw/virtio/virtio-serial.h"
|
||||||
|
#include "qapi-event.h"
|
||||||
|
|
||||||
#define TYPE_VIRTIO_CONSOLE_SERIAL_PORT "virtserialport"
|
#define TYPE_VIRTIO_CONSOLE_SERIAL_PORT "virtserialport"
|
||||||
#define VIRTIO_CONSOLE(obj) \
|
#define VIRTIO_CONSOLE(obj) \
|
||||||
|
@ -81,11 +82,16 @@ static ssize_t flush_buf(VirtIOSerialPort *port,
|
||||||
static void set_guest_connected(VirtIOSerialPort *port, int guest_connected)
|
static void set_guest_connected(VirtIOSerialPort *port, int guest_connected)
|
||||||
{
|
{
|
||||||
VirtConsole *vcon = VIRTIO_CONSOLE(port);
|
VirtConsole *vcon = VIRTIO_CONSOLE(port);
|
||||||
|
DeviceState *dev = DEVICE(port);
|
||||||
|
|
||||||
if (!vcon->chr) {
|
if (vcon->chr) {
|
||||||
return;
|
qemu_chr_fe_set_open(vcon->chr, guest_connected);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (dev->id) {
|
||||||
|
qapi_event_send_vserport_change(dev->id, guest_connected,
|
||||||
|
&error_abort);
|
||||||
}
|
}
|
||||||
qemu_chr_fe_set_open(vcon->chr, guest_connected);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Readiness of the guest to accept data on a port */
|
/* Readiness of the guest to accept data on a port */
|
||||||
|
|
|
@ -106,7 +106,7 @@ int select_watchdog_action(const char *p)
|
||||||
*/
|
*/
|
||||||
void watchdog_perform_action(void)
|
void watchdog_perform_action(void)
|
||||||
{
|
{
|
||||||
switch(watchdog_action) {
|
switch (watchdog_action) {
|
||||||
case WDT_RESET: /* same as 'system_reset' in monitor */
|
case WDT_RESET: /* same as 'system_reset' in monitor */
|
||||||
qapi_event_send_watchdog(WATCHDOG_EXPIRATION_ACTION_RESET, &error_abort);
|
qapi_event_send_watchdog(WATCHDOG_EXPIRATION_ACTION_RESET, &error_abort);
|
||||||
qemu_system_reset_request();
|
qemu_system_reset_request();
|
||||||
|
|
|
@ -217,7 +217,7 @@ void block_job_pause(BlockJob *job);
|
||||||
void block_job_resume(BlockJob *job);
|
void block_job_resume(BlockJob *job);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* block_job_event_cancle:
|
* block_job_event_cancelled:
|
||||||
* @job: The job whose information is requested.
|
* @job: The job whose information is requested.
|
||||||
*
|
*
|
||||||
* Send a BLOCK_JOB_CANCELLED event for the specified job.
|
* Send a BLOCK_JOB_CANCELLED event for the specified job.
|
||||||
|
|
|
@ -570,6 +570,7 @@ monitor_qapi_event_throttle(QAPIEvent event, int64_t rate)
|
||||||
|
|
||||||
trace_monitor_protocol_event_throttle(event, rate);
|
trace_monitor_protocol_event_throttle(event, rate);
|
||||||
evstate->event = event;
|
evstate->event = event;
|
||||||
|
assert(rate * SCALE_MS <= INT64_MAX);
|
||||||
evstate->rate = rate * SCALE_MS;
|
evstate->rate = rate * SCALE_MS;
|
||||||
evstate->last = 0;
|
evstate->last = 0;
|
||||||
evstate->data = NULL;
|
evstate->data = NULL;
|
||||||
|
@ -585,9 +586,9 @@ static void monitor_qapi_event_init(void)
|
||||||
monitor_qapi_event_throttle(QAPI_EVENT_RTC_CHANGE, 1000);
|
monitor_qapi_event_throttle(QAPI_EVENT_RTC_CHANGE, 1000);
|
||||||
monitor_qapi_event_throttle(QAPI_EVENT_WATCHDOG, 1000);
|
monitor_qapi_event_throttle(QAPI_EVENT_WATCHDOG, 1000);
|
||||||
monitor_qapi_event_throttle(QAPI_EVENT_BALLOON_CHANGE, 1000);
|
monitor_qapi_event_throttle(QAPI_EVENT_BALLOON_CHANGE, 1000);
|
||||||
/* limit the rate of quorum events to avoid hammering the management */
|
|
||||||
monitor_qapi_event_throttle(QAPI_EVENT_QUORUM_REPORT_BAD, 1000);
|
monitor_qapi_event_throttle(QAPI_EVENT_QUORUM_REPORT_BAD, 1000);
|
||||||
monitor_qapi_event_throttle(QAPI_EVENT_QUORUM_FAILURE, 1000);
|
monitor_qapi_event_throttle(QAPI_EVENT_QUORUM_FAILURE, 1000);
|
||||||
|
monitor_qapi_event_throttle(QAPI_EVENT_VSERPORT_CHANGE, 1000);
|
||||||
|
|
||||||
qmp_event_set_func_emit(monitor_qapi_event_queue);
|
qmp_event_set_func_emit(monitor_qapi_event_queue);
|
||||||
}
|
}
|
||||||
|
|
|
@ -8,6 +8,9 @@
|
||||||
# QAPI block definitions
|
# QAPI block definitions
|
||||||
{ 'include': 'qapi/block.json' }
|
{ 'include': 'qapi/block.json' }
|
||||||
|
|
||||||
|
# QAPI event definitions
|
||||||
|
{ 'include': 'qapi/event.json' }
|
||||||
|
|
||||||
##
|
##
|
||||||
# LostTickPolicy:
|
# LostTickPolicy:
|
||||||
#
|
#
|
||||||
|
@ -211,12 +214,18 @@
|
||||||
#
|
#
|
||||||
# @filename: the filename of the character device
|
# @filename: the filename of the character device
|
||||||
#
|
#
|
||||||
|
# @frontend-open: shows whether the frontend device attached to this backend
|
||||||
|
# (eg. with the chardev=... option) is in open or closed state
|
||||||
|
# (since 2.1)
|
||||||
|
#
|
||||||
# Notes: @filename is encoded using the QEMU command line character device
|
# Notes: @filename is encoded using the QEMU command line character device
|
||||||
# encoding. See the QEMU man page for details.
|
# encoding. See the QEMU man page for details.
|
||||||
#
|
#
|
||||||
# Since: 0.14.0
|
# Since: 0.14.0
|
||||||
##
|
##
|
||||||
{ 'type': 'ChardevInfo', 'data': {'label': 'str', 'filename': 'str'} }
|
{ 'type': 'ChardevInfo', 'data': {'label': 'str',
|
||||||
|
'filename': 'str',
|
||||||
|
'frontend-open': 'bool'} }
|
||||||
|
|
||||||
##
|
##
|
||||||
# @query-chardev:
|
# @query-chardev:
|
||||||
|
@ -654,8 +663,9 @@
|
||||||
#
|
#
|
||||||
# @host: IP address
|
# @host: IP address
|
||||||
#
|
#
|
||||||
# @service: The service name of vnc port. This may depend on the host system's
|
# @service: The service name of the vnc port. This may depend on the host
|
||||||
# service database so symbolic names should not be relied on.
|
# system's service database so symbolic names should not be relied
|
||||||
|
# on.
|
||||||
#
|
#
|
||||||
# @family: address family
|
# @family: address family
|
||||||
#
|
#
|
||||||
|
@ -694,7 +704,7 @@
|
||||||
##
|
##
|
||||||
{ 'type': 'VncClientInfo',
|
{ 'type': 'VncClientInfo',
|
||||||
'base': 'VncBasicInfo',
|
'base': 'VncBasicInfo',
|
||||||
'data': { '*x509_dname' : 'str', '*sasl_username': 'str' } }
|
'data': { '*x509_dname': 'str', '*sasl_username': 'str' } }
|
||||||
|
|
||||||
##
|
##
|
||||||
# @VncInfo:
|
# @VncInfo:
|
||||||
|
@ -3458,5 +3468,3 @@
|
||||||
##
|
##
|
||||||
{ 'enum': 'GuestPanicAction',
|
{ 'enum': 'GuestPanicAction',
|
||||||
'data': [ 'pause' ] }
|
'data': [ 'pause' ] }
|
||||||
|
|
||||||
{ 'include': 'qapi-event.json' }
|
|
||||||
|
|
|
@ -1436,7 +1436,8 @@
|
||||||
# @device: device name
|
# @device: device name
|
||||||
#
|
#
|
||||||
# @msg: informative message for human consumption, such as the kind of
|
# @msg: informative message for human consumption, such as the kind of
|
||||||
# corruption being detected
|
# corruption being detected. It should not be parsed by machine as it is
|
||||||
|
# not guaranteed to be stable
|
||||||
#
|
#
|
||||||
# @offset: #optional, if the corruption resulted from an image access, this is
|
# @offset: #optional, if the corruption resulted from an image access, this is
|
||||||
# the access offset into the image
|
# the access offset into the image
|
||||||
|
|
|
@ -1,8 +1,8 @@
|
||||||
##
|
##
|
||||||
# @SHUTDOWN
|
# @SHUTDOWN
|
||||||
#
|
#
|
||||||
# Emitted when the virtual machine has shutdown, possibly indicating that QEMU
|
# Emitted when the virtual machine has shut down, indicating that qemu is
|
||||||
# is about about to exit.
|
# about to exit.
|
||||||
#
|
#
|
||||||
# Note: If the command-line option "-no-shutdown" has been specified, qemu will
|
# Note: If the command-line option "-no-shutdown" has been specified, qemu will
|
||||||
# not exit, and a STOP event will eventually follow the SHUTDOWN event
|
# not exit, and a STOP event will eventually follow the SHUTDOWN event
|
||||||
|
@ -316,3 +316,17 @@
|
||||||
{ 'event': 'QUORUM_REPORT_BAD',
|
{ 'event': 'QUORUM_REPORT_BAD',
|
||||||
'data': { '*error': 'str', 'node-name': 'str',
|
'data': { '*error': 'str', 'node-name': 'str',
|
||||||
'sector-num': 'int', 'sector-count': 'int' } }
|
'sector-num': 'int', 'sector-count': 'int' } }
|
||||||
|
|
||||||
|
##
|
||||||
|
# @VSERPORT_CHANGE
|
||||||
|
#
|
||||||
|
# Emitted when the guest opens or closes a virtio-serial port.
|
||||||
|
#
|
||||||
|
# @id: device identifier of the virtio-serial port
|
||||||
|
#
|
||||||
|
# @open: true if the guest has opened the virtio-serial port
|
||||||
|
#
|
||||||
|
# Since: 2.1
|
||||||
|
##
|
||||||
|
{ 'event': 'VSERPORT_CHANGE',
|
||||||
|
'data': { 'id': 'str', 'open': 'bool' } }
|
|
@ -3705,6 +3705,7 @@ ChardevInfoList *qmp_query_chardev(Error **errp)
|
||||||
info->value = g_malloc0(sizeof(*info->value));
|
info->value = g_malloc0(sizeof(*info->value));
|
||||||
info->value->label = g_strdup(chr->label);
|
info->value->label = g_strdup(chr->label);
|
||||||
info->value->filename = g_strdup(chr->filename);
|
info->value->filename = g_strdup(chr->filename);
|
||||||
|
info->value->frontend_open = chr->fe_open;
|
||||||
|
|
||||||
info->next = chr_list;
|
info->next = chr_list;
|
||||||
chr_list = info;
|
chr_list = info;
|
||||||
|
|
|
@ -1921,19 +1921,28 @@ Each json-object contain the following:
|
||||||
|
|
||||||
- "label": device's label (json-string)
|
- "label": device's label (json-string)
|
||||||
- "filename": device's file (json-string)
|
- "filename": device's file (json-string)
|
||||||
|
- "frontend-open": open/closed state of the frontend device attached to this
|
||||||
|
backend (json-bool)
|
||||||
|
|
||||||
Example:
|
Example:
|
||||||
|
|
||||||
-> { "execute": "query-chardev" }
|
-> { "execute": "query-chardev" }
|
||||||
<- {
|
<- {
|
||||||
"return":[
|
"return": [
|
||||||
{
|
{
|
||||||
"label":"monitor",
|
"label": "charchannel0",
|
||||||
"filename":"stdio"
|
"filename": "unix:/var/lib/libvirt/qemu/seabios.rhel6.agent,server",
|
||||||
|
"frontend-open": false
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"label":"serial0",
|
"label": "charmonitor",
|
||||||
"filename":"vc"
|
"filename": "unix:/var/lib/libvirt/qemu/seabios.rhel6.monitor,server",
|
||||||
|
"frontend-open": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "charserial0",
|
||||||
|
"filename": "pty:/dev/pts/2",
|
||||||
|
"frontend-open": true
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|
|
@ -26,9 +26,8 @@ def _generate_event_api_name(event_name, params):
|
||||||
api_name += "bool has_%s,\n" % c_var(argname)
|
api_name += "bool has_%s,\n" % c_var(argname)
|
||||||
api_name += "".ljust(l)
|
api_name += "".ljust(l)
|
||||||
|
|
||||||
if argentry == "str":
|
api_name += "%s %s,\n" % (c_type(argentry, is_param=True),
|
||||||
api_name += "const "
|
c_var(argname))
|
||||||
api_name += "%s %s,\n" % (c_type(argentry), c_var(argname))
|
|
||||||
api_name += "".ljust(l)
|
api_name += "".ljust(l)
|
||||||
|
|
||||||
api_name += "Error **errp)"
|
api_name += "Error **errp)"
|
||||||
|
|
|
@ -255,7 +255,7 @@ def check_event(expr, expr_info):
|
||||||
if structured:
|
if structured:
|
||||||
raise QAPIExprError(expr_info,
|
raise QAPIExprError(expr_info,
|
||||||
"Nested structure define in event is not "
|
"Nested structure define in event is not "
|
||||||
"supported now, event '%s', argname '%s'"
|
"supported, event '%s', argname '%s'"
|
||||||
% (expr['event'], argname))
|
% (expr['event'], argname))
|
||||||
|
|
||||||
def check_union(expr, expr_info):
|
def check_union(expr, expr_info):
|
||||||
|
|
|
@ -1 +1 @@
|
||||||
tests/qapi-schema/event-nest-struct.json:1: Nested structure define in event is not supported now, event 'EVENT_A', argname 'a'
|
tests/qapi-schema/event-nest-struct.json:1: Nested structure define in event is not supported, event 'EVENT_A', argname 'a'
|
||||||
|
|
Loading…
Reference in New Issue