This series introduces new QMP/HMP commands to dump the status of a a virtio device at different levels.
1. Main command HMP Only: x-debug-virtio [subcommand] Example: List all sub-commands: (qemu) x-debug-virtio x-debug-virtio query -- List all available virtio devices x-debug-virtio status path -- Display status of a given virtio device x-debug-virtio queue-status path queue -- Display status of a given virtio queue x-debug-virtio queue-element path queue [index] -- Display element of a given virtio queue 2. List available virtio devices in the machine HMP Form: x-debug-virtio query Example: (qemu) x-debug-virtio query /machine/peripheral-anon/device[3]/virtio-backend [virtio-net] /machine/peripheral-anon/device[1]/virtio-backend [virtio-serial] /machine/peripheral-anon/device[0]/virtio-backend [virtio-blk] QMP Form: { 'command': 'x-debug-query-virtio', 'returns': ['VirtioInfo'] } Example: -> { "execute": "x-debug-query-virtio" } <- { "return": [ { "path": "/machine/peripheral-anon/device[3]/virtio-backend", "type": "virtio-net" }, { "path": "/machine/peripheral-anon/device[1]/virtio-backend", "type": "virtio-serial" }, { "path": "/machine/peripheral-anon/device[0]/virtio-backend", "type": "virtio-blk" } ] } 3. Display status of a given virtio device HMP Form: x-debug-virtio status <path> Example: (qemu) x-debug-virtio status /machine/peripheral-anon/device[3]/virtio-backend /machine/peripheral-anon/device[3]/virtio-backend: Device Id: 1 Guest features: event-idx, indirect-desc, version-1 ctrl-mac-addr, guest-announce, ctrl-vlan, ctrl-rx, ctrl-vq, status, mrg-rxbuf, host-ufo, host-ecn, host-tso6, host-tso4, guest-ufo, guest-ecn, guest-tso6, guest-tso4, mac, ctrl-guest-offloads, guest-csum, csum Host features: event-idx, indirect-desc, bad-feature, version-1, any-layout, notify-on-empty gso, ctrl-mac-addr, guest-announce, ctrl-rx-extra, ctrl-vlan, ctrl-rx, ctrl-vq, status, mrg-rxbuf, host-ufo, host-ecn, host-tso6, host-tso4, guest-ufo, guest-ecn, guest-tso6, guest-tso4, mac, ctrl-guest-offloads, guest-csum, csum Backend features: Endianness: little VirtQueues: 3 QMP Form: { 'command': 'x-debug-virtio-status', 'data': { 'path': 'str' }, 'returns': 'VirtioStatus' } Example: -> { "execute": "x-debug-virtio-status", "arguments": { "path": "/machine/peripheral-anon/device[3]/virtio-backend" } } <- { "return": { "device-endian": "little", "device-id": 1, "backend-features": { "device": { "type": "virtio-net", "data": [] }, "unknown": 0, "transport": [] }, "num-vqs": 3, "guest-features": { "device": { "type": "virtio-net", "data": [ "ctrl-mac-addr", "guest-announce", "ctrl-vlan", "ctrl-rx", "ctrl-vq", "status", "mrg-rxbuf", "host-ufo", "host-ecn", "host-tso6", "host-tso4", "guest-ufo", "guest-ecn", "guest-tso6", "guest-tso4", "mac", "ctrl-guest-offloads", "guest-csum", "csum" ] }, "unknown": 0, "transport": [ "event-idx", "indirect-desc", "version-1" ] }, "host-features": { "device": { "type": "virtio-net", "data": [ "gso", "ctrl-mac-addr", "guest-announce", "ctrl-rx-extra", "ctrl-vlan", "ctrl-rx", "ctrl-vq", "status", "mrg-rxbuf", "host-ufo", "host-ecn", "host-tso6", "host-tso4", "guest-ufo", "guest-ecn", "guest-tso6", "guest-tso4", "mac", "ctrl-guest-offloads", "guest-csum", "csum" ] }, "unknown": 0, "transport": [ "event-idx", "indirect-desc", "bad-feature", "version-1", "any-layout", "notify-on-empty" ] } } } 4. Display status of a given virtio queue HMP Form: x-debug-virtio queue-status <path> <queue> Example: (qemu) x-debug-virtio queue-status /machine/peripheral-anon/device[3]/virtio-backend 0 /machine/peripheral-anon/device[3]/virtio-backend: index: 0 inuse: 0 last_avail_idx: 61 shadow_avail_idx: 292 signalled_used: 61 signalled_used_valid: 1 VRing: num: 256 num_default: 256 align: 4096 desc: 0x000000006c352000 avail: 0x000000006c353000 used: 0x000000006c353240 QMP Form: { 'command': 'x-debug-virtio-queue-status', 'data': { 'path': 'str', 'queue': 'uint16' }, 'returns': 'VirtQueueStatus' } Example: -> { "execute": "x-debug-virtio-queue-status", "arguments": { "path": "/machine/peripheral-anon/device[3]/virtio-backend", "queue": 0 } } <- { "return": { "signalled_used": 373, "inuse": 0, "vring_desc": 864411648, "vring_num_default": 256, "signalled_used_valid": 1, "vring_avail": 864415744, "last_avail_idx": 373, "queue_index": 0, "vring_used": 864416320, "shadow_avail_idx": 619, "used_idx": 373, "vring_num": 256, "vring_align": 4096 } } 5. Display element of a given virtio queue HMP Form: x-debug-virtio queue-element <path> <queue> [index] Example: Dump the information of the head element of the first queue of the first virtio device:: (qemu) x-debug-virtio queue-element/machine/peripheral-anon/device[3]/virtio-backend 0 index: 67 ndescs: 1 descs: addr 0x6fe69800 len 1536 (write) (qemu) xp/128bx 0x6fe69800 000000006fe69800: 0x02 0x00 0x00 0x00 0x00 0x00 0x00 0x00 000000006fe69808: 0x00 0x00 0x01 0x00 0x52 0x54 0x00 0x12 000000006fe69810: 0x34 0x56 0x52 0x54 0x00 0x09 0x51 0xde 000000006fe69818: 0x08 0x00 0x45 0x00 0x00 0x4c 0x8f 0x32 device[3] is a virtio-net device and we can see in the element buffer the MAC address of the card:: [root@localhost ~]# ip link show ens4 2: ens4: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP m0 link/ether 52:54:00:12:34:56 brd ff:ff:ff:ff:ff:ff and the MAC address of the gateway:: [root@localhost ~]# arp -a _gateway (192.168.122.1) at 52:54:00:09:51:de [ether] on ens4 QMP Form: { 'command': 'x-debug-virtio-queue-element', 'data': { 'path': 'str', 'queue': 'uint16', '*index': 'uint16' }, 'returns': 'VirtioQueueElement' } Example: -> { "execute": "x-debug-virtio-queue-element", "arguments": { "path": "/machine/peripheral-anon/device[3]/virtio-backend", "queue": 0 } } -> { "return": { "index": 109, "ndescs": 1, "descs": [ { "flags": [ "write" ], "len": 1536, "addr": 853145600 } ] } } v4: re-send series as v3 didn't reach qemu-devel v3: use qapi_free_VirtioInfoList() on the head of the list, not on the tail prefix the commands with x-debug- v2: introduce VirtioType enum use an enum for the endianness change field names to stick to naming conventions (s/_/-/) add a patch to decode feature bits don't check if the queue is empty to allow to displa old elements use enum for desc flags manage indirect desc decode device features in the HMP command Laurent Vivier (6): qmp: add QMP command x-debug-query-virtio qmp: add QMP command x-debug-virtio-status qmp: decode feature bits in virtio-status qmp: add QMP command x-debug-virtio-queue-status qmp: add QMP command x-debug-virtio-queue-element hmp: add x-debug-virtio commands Makefile | 2 +- Makefile.target | 7 +- docs/system/monitor.rst | 2 + hmp-commands-virtio.hx | 160 +++++++++++ hmp-commands.hx | 10 + hw/block/virtio-blk.c | 23 ++ hw/char/virtio-serial-bus.c | 11 + hw/display/virtio-gpu-base.c | 10 + hw/net/virtio-net.c | 35 +++ hw/scsi/virtio-scsi.c | 12 + hw/virtio/Makefile.objs | 2 + hw/virtio/virtio-balloon.c | 13 + hw/virtio/virtio-iommu.c | 14 + hw/virtio/virtio-stub.c | 34 +++ hw/virtio/virtio.c | 542 +++++++++++++++++++++++++++++++++++ include/hw/virtio/virtio.h | 14 + include/monitor/hmp.h | 4 + monitor/misc.c | 17 ++ qapi/Makefile.objs | 2 +- qapi/qapi-schema.json | 1 + qapi/virtio.json | 502 ++++++++++++++++++++++++++++++++ tests/qtest/qmp-cmd-test.c | 1 + 22 files changed, 1414 insertions(+), 4 deletions(-) create mode 100644 hmp-commands-virtio.hx create mode 100644 hw/virtio/virtio-stub.c create mode 100644 qapi/virtio.json -- 2.26.2