This commit adds support for virtio-multitouch input devices. It
introduces the VIR_DOMAIN_INPUT_TYPE_MULTITOUCH type, adds the
QEMU multitouch capability, updates validation, updates command
building, and updates security labeling code to handle the new
device type.
Signed-off-by: Julio Faracco <jcfaracco@gmail.com>
---
src/conf/domain_audit.c | 1 +
src/conf/domain_conf.c | 2 ++
src/conf/domain_conf.h | 1 +
src/conf/domain_validate.c | 9 +++++++++
src/qemu/qemu_capabilities.c | 3 +++
src/qemu/qemu_capabilities.h | 1 +
src/qemu/qemu_command.c | 5 +++++
src/qemu/qemu_validate.c | 5 +++++
src/security/security_dac.c | 2 ++
src/security/security_selinux.c | 2 ++
10 files changed, 31 insertions(+)
diff --git a/src/conf/domain_audit.c b/src/conf/domain_audit.c
index 7a6bb02203..ae7e2fac82 100644
--- a/src/conf/domain_audit.c
+++ b/src/conf/domain_audit.c
@@ -926,6 +926,7 @@ virDomainAuditInput(virDomainObj *vm,
case VIR_DOMAIN_INPUT_TYPE_PASSTHROUGH:
case VIR_DOMAIN_INPUT_TYPE_EVDEV:
+ case VIR_DOMAIN_INPUT_TYPE_MULTITOUCH:
VIR_AUDIT(VIR_AUDIT_RECORD_RESOURCE, success,
"virt=%s resrc=evdev reason=%s %s uuid=%s path=%s",
virt, reason, vmname, uuidstr, VIR_AUDIT_STR(input->source.evdev));
diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
index 9672168df9..88b4e055fd 100644
--- a/src/conf/domain_conf.c
+++ b/src/conf/domain_conf.c
@@ -916,6 +916,7 @@ VIR_ENUM_IMPL(virDomainInput,
"keyboard",
"passthrough",
"evdev",
+ "multitouch",
);
VIR_ENUM_IMPL(virDomainInputBus,
@@ -2084,6 +2085,7 @@ const char *virDomainInputDefGetPath(virDomainInputDef *input)
case VIR_DOMAIN_INPUT_TYPE_PASSTHROUGH:
case VIR_DOMAIN_INPUT_TYPE_EVDEV:
+ case VIR_DOMAIN_INPUT_TYPE_MULTITOUCH:
return input->source.evdev;
}
return NULL;
diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h
index 83d49969d3..269649dd3c 100644
--- a/src/conf/domain_conf.h
+++ b/src/conf/domain_conf.h
@@ -1554,6 +1554,7 @@ typedef enum {
VIR_DOMAIN_INPUT_TYPE_KBD,
VIR_DOMAIN_INPUT_TYPE_PASSTHROUGH,
VIR_DOMAIN_INPUT_TYPE_EVDEV,
+ VIR_DOMAIN_INPUT_TYPE_MULTITOUCH,
VIR_DOMAIN_INPUT_TYPE_LAST
} virDomainInputType;
diff --git a/src/conf/domain_validate.c b/src/conf/domain_validate.c
index 4482203087..63e08567a6 100644
--- a/src/conf/domain_validate.c
+++ b/src/conf/domain_validate.c
@@ -2930,6 +2930,15 @@ virDomainInputDefValidate(const virDomainInputDef *input,
}
break;
+ case VIR_DOMAIN_INPUT_TYPE_MULTITOUCH:
+ if (input->bus != VIR_DOMAIN_INPUT_BUS_VIRTIO) {
+ virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
+ _("only bus 'virtio' is supported for 'multitouch' input devices"));
+ return -1;
+ }
+ break;
+
+
case VIR_DOMAIN_INPUT_TYPE_EVDEV:
if (input->bus != VIR_DOMAIN_INPUT_BUS_NONE) {
virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c
index f456e8a378..a5e19b8c01 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 */
);
@@ -1349,6 +1350,8 @@ struct virQEMUCapsStringFlags virQEMUCapsObjectTypes[] = {
{ "virtio-tablet-pci", QEMU_CAPS_VIRTIO_TABLET },
{ "virtio-input-host-device", QEMU_CAPS_VIRTIO_INPUT_HOST },
{ "virtio-input-host-pci", QEMU_CAPS_VIRTIO_INPUT_HOST },
+ { "virtio-multitouch-pci", QEMU_CAPS_VIRTIO_MULTITOUCH },
+ { "virtio-multitouch-device", QEMU_CAPS_VIRTIO_MULTITOUCH },
{ "mptsas1068", QEMU_CAPS_SCSI_MPTSAS1068 },
{ "pxb", QEMU_CAPS_DEVICE_PXB },
{ "pxb-pcie", QEMU_CAPS_DEVICE_PXB_PCIE },
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_command.c b/src/qemu/qemu_command.c
index e81efdfde7..369646a4c7 100644
--- a/src/qemu/qemu_command.c
+++ b/src/qemu/qemu_command.c
@@ -929,6 +929,10 @@ qemuBuildVirtioDevGetConfigDev(const virDomainDeviceDef *device,
*baseName = "virtio-input-host";
break;
+ case VIR_DOMAIN_INPUT_TYPE_MULTITOUCH:
+ *baseName = "virtio-multitouch";
+ break;
+
case VIR_DOMAIN_INPUT_TYPE_EVDEV:
case VIR_DOMAIN_INPUT_TYPE_LAST:
default:
@@ -4304,6 +4308,7 @@ qemuBuildInputVirtioDevProps(const virDomainDef *def,
switch ((virDomainInputType)dev->type) {
case VIR_DOMAIN_INPUT_TYPE_MOUSE:
case VIR_DOMAIN_INPUT_TYPE_TABLET:
+ case VIR_DOMAIN_INPUT_TYPE_MULTITOUCH:
case VIR_DOMAIN_INPUT_TYPE_KBD:
case VIR_DOMAIN_INPUT_TYPE_PASSTHROUGH:
break;
diff --git a/src/qemu/qemu_validate.c b/src/qemu/qemu_validate.c
index 184c23d307..44962fee92 100644
--- a/src/qemu/qemu_validate.c
+++ b/src/qemu/qemu_validate.c
@@ -5490,6 +5490,11 @@ qemuValidateDomainDeviceDefInput(const virDomainInputDef *input,
cap = QEMU_CAPS_INPUT_LINUX;
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_LAST:
default:
virReportEnumRangeError(virDomainInputType,
diff --git a/src/security/security_dac.c b/src/security/security_dac.c
index 2f788b872a..85e6954018 100644
--- a/src/security/security_dac.c
+++ b/src/security/security_dac.c
@@ -1830,6 +1830,7 @@ virSecurityDACSetInputLabel(virSecurityManager *mgr,
switch ((virDomainInputType)input->type) {
case VIR_DOMAIN_INPUT_TYPE_PASSTHROUGH:
case VIR_DOMAIN_INPUT_TYPE_EVDEV:
+ case VIR_DOMAIN_INPUT_TYPE_MULTITOUCH:
if (virSecurityDACGetIds(seclabel, priv, &user, &group, NULL, NULL) < 0)
return -1;
@@ -1858,6 +1859,7 @@ virSecurityDACRestoreInputLabel(virSecurityManager *mgr,
switch ((virDomainInputType)input->type) {
case VIR_DOMAIN_INPUT_TYPE_PASSTHROUGH:
+ case VIR_DOMAIN_INPUT_TYPE_MULTITOUCH:
case VIR_DOMAIN_INPUT_TYPE_EVDEV:
ret = virSecurityDACRestoreFileLabel(mgr, input->source.evdev);
break;
diff --git a/src/security/security_selinux.c b/src/security/security_selinux.c
index 2f3cc274a5..2d9aaa6e32 100644
--- a/src/security/security_selinux.c
+++ b/src/security/security_selinux.c
@@ -1597,6 +1597,7 @@ virSecuritySELinuxSetInputLabel(virSecurityManager *mgr,
switch ((virDomainInputType)input->type) {
case VIR_DOMAIN_INPUT_TYPE_PASSTHROUGH:
case VIR_DOMAIN_INPUT_TYPE_EVDEV:
+ case VIR_DOMAIN_INPUT_TYPE_MULTITOUCH:
if (virSecuritySELinuxSetFilecon(mgr, input->source.evdev,
seclabel->imagelabel, true) < 0)
return -1;
@@ -1626,6 +1627,7 @@ virSecuritySELinuxRestoreInputLabel(virSecurityManager *mgr,
switch ((virDomainInputType)input->type) {
case VIR_DOMAIN_INPUT_TYPE_PASSTHROUGH:
+ case VIR_DOMAIN_INPUT_TYPE_MULTITOUCH:
case VIR_DOMAIN_INPUT_TYPE_EVDEV:
return virSecuritySELinuxRestoreFileLabel(mgr, input->source.evdev, true, false);
--
2.52.0
On Wed, Jan 28, 2026 at 10:21:56 -0300, Julio Faracco wrote:
> This commit adds support for virtio-multitouch input devices. It
> introduces the VIR_DOMAIN_INPUT_TYPE_MULTITOUCH type, adds the
> QEMU multitouch capability, updates validation, updates command
> building, and updates security labeling code to handle the new
> device type.
>
> Signed-off-by: Julio Faracco <jcfaracco@gmail.com>
> ---
> src/conf/domain_audit.c | 1 +
> src/conf/domain_conf.c | 2 ++
> src/conf/domain_conf.h | 1 +
> src/conf/domain_validate.c | 9 +++++++++
> src/qemu/qemu_capabilities.c | 3 +++
> src/qemu/qemu_capabilities.h | 1 +
> src/qemu/qemu_command.c | 5 +++++
> src/qemu/qemu_validate.c | 5 +++++
> src/security/security_dac.c | 2 ++
> src/security/security_selinux.c | 2 ++
> 10 files changed, 31 insertions(+)
Testsuite fails after this patch:
TEST: qemucapabilitiestest
....!.!.!.!.!.!...!.!.!...!.!.!.!.!.!.!. 40
..!.!.!.!...!.!.!.!...!.......!...!.!. 78 FAIL
28 tests failed. Run them using:
VIR_TEST_DEBUG=1 VIR_TEST_RANGE=5,7,9,11,13,15,19,21,23,27,29,31,33,35,37,39,43,45,47,49,53,55,57,59,63,71,75,77 /home/pipo/build/libvirt/gcc/tests/qemucapabilitiestest
You forgot to include the corresponding changes to the detected
capability (by running VIR_TEST_REGENERATE_OUTPUT=1
build/tests/qemucapabilitiestest
For that reason we usually separate the addition of the capability to a
separate patch which must include the test changes.
© 2016 - 2026 Red Hat, Inc.