This commit introduces QEMU capability detection and validation for
virtio-multitouch devices.
1. Capability flag (QEMU_CAPS_VIRTIO_MULTITOUCH): A new capability flag is
defined in src/qemu/qemu_capabilities.h to track whether the QEMU binary
supports virtio-multitouch devices.
2. Device detection (src/qemu/qemu_capabilities.c): The capability probing
code is updated to detect the presence of "virtio-multitouch-device" and
"virtio-multitouch-pci" device types when querying QEMU. This allows
libvirt to determine at runtime whether the installed QEMU version
supports multitouch devices (available since QEMU 8.1.0).
3. Validation (src/qemu/qemu_validate.c): Validation logic is added to ensure
that multitouch devices are only used when QEMU supports them. If a domain
configuration specifies a multitouch device but QEMU lacks support, libvirt
will reject the configuration with a clear error message rather than
generating invalid command-line arguments.
This capability-based approach ensures that libvirt gracefully handles
different QEMU versions, allowing multitouch devices on newer QEMU while
preventing configuration errors on older versions.
Signed-off-by: Julio Faracco <jcfaracco@gmail.com>
---
src/qemu/qemu_capabilities.c | 3 +++
src/qemu/qemu_capabilities.h | 1 +
src/qemu/qemu_validate.c | 5 +++++
3 files changed, 9 insertions(+)
diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c
index 92b863a826..bc19aa1a5d 100644
--- a/src/qemu/qemu_capabilities.c
+++ b/src/qemu/qemu_capabilities.c
@@ -755,6 +755,7 @@ VIR_ENUM_IMPL(virQEMUCaps,
"disk-timed-stats", /* QEMU_CAPS_DISK_TIMED_STATS */
"query-accelerators", /* QEMU_CAPS_QUERY_ACCELERATORS */
"mshv", /* QEMU_CAPS_MSHV */
+ "virtio-multitouch", /* QEMU_CAPS_VIRTIO_MULTITOUCH */
);
@@ -1345,6 +1346,8 @@ struct virQEMUCapsStringFlags virQEMUCapsObjectTypes[] = {
{ "virtio-keyboard-pci", QEMU_CAPS_VIRTIO_KEYBOARD },
{ "virtio-mouse-device", QEMU_CAPS_VIRTIO_MOUSE },
{ "virtio-mouse-pci", QEMU_CAPS_VIRTIO_MOUSE },
+ { "virtio-multitouch-device", QEMU_CAPS_VIRTIO_MULTITOUCH },
+ { "virtio-multitouch-pci", QEMU_CAPS_VIRTIO_MULTITOUCH },
{ "virtio-tablet-device", QEMU_CAPS_VIRTIO_TABLET },
{ "virtio-tablet-pci", QEMU_CAPS_VIRTIO_TABLET },
{ "virtio-input-host-device", QEMU_CAPS_VIRTIO_INPUT_HOST },
diff --git a/src/qemu/qemu_capabilities.h b/src/qemu/qemu_capabilities.h
index f180844e66..44a3350cf9 100644
--- a/src/qemu/qemu_capabilities.h
+++ b/src/qemu/qemu_capabilities.h
@@ -730,6 +730,7 @@ typedef enum { /* virQEMUCapsFlags grouping marker for syntax-check */
QEMU_CAPS_DISK_TIMED_STATS, /* timed stats support ('stats-intervals' property of disk frontends) */
QEMU_CAPS_QUERY_ACCELERATORS, /* query-accelerators command */
QEMU_CAPS_MSHV, /* -accel mshv */
+ QEMU_CAPS_VIRTIO_MULTITOUCH, /* -device virtio-multitouch-{device,pci} */
QEMU_CAPS_LAST /* this must always be the last item */
} virQEMUCapsFlags;
diff --git a/src/qemu/qemu_validate.c b/src/qemu/qemu_validate.c
index 184c23d307..6589939290 100644
--- a/src/qemu/qemu_validate.c
+++ b/src/qemu/qemu_validate.c
@@ -5485,6 +5485,11 @@ qemuValidateDomainDeviceDefInput(const virDomainInputDef *input,
cap = QEMU_CAPS_VIRTIO_INPUT_HOST;
ccwCap = QEMU_CAPS_LAST;
break;
+ case VIR_DOMAIN_INPUT_TYPE_MULTITOUCH:
+ baseName = "virtio-multitouch";
+ cap = QEMU_CAPS_VIRTIO_MULTITOUCH;
+ ccwCap = QEMU_CAPS_LAST;
+ break;
case VIR_DOMAIN_INPUT_TYPE_EVDEV:
baseName = "input-linux";
cap = QEMU_CAPS_INPUT_LINUX;
--
2.52.0