[PATCH 0/3] Introduce <input type='linux'>

Kristina Hanicova (3): qemu_capabilities: Add QEMU_CAPS_INPUT_LINUX conf: Parse/format XML input type 'linux' qemu: Build command line for object input-linux docs/formatdomain.rst | 30 +++++---- docs/schemas/domaincommon.rng | 20 ++++++ src/conf/domain_audit.c | 1 + src/conf/domain_conf.c | 61 ++++++++++++++++--- src/conf/domain_conf.h | 12 ++++ src/conf/domain_validate.c | 8 +++ src/libvirt_private.syms | 2 + src/qemu/qemu_capabilities.c | 2 + src/qemu/qemu_capabilities.h | 1 + src/qemu/qemu_cgroup.c | 2 + src/qemu/qemu_command.c | 27 +++++++- src/qemu/qemu_domain_address.c | 1 + src/qemu/qemu_hotplug.c | 1 + src/qemu/qemu_validate.c | 6 ++ src/security/security_apparmor.c | 1 + src/security/security_dac.c | 2 + src/security/security_selinux.c | 2 + src/security/virt-aa-helper.c | 3 +- .../caps_2.10.0.aarch64.xml | 1 + .../caps_2.10.0.ppc64.xml | 1 + .../caps_2.10.0.s390x.xml | 1 + .../caps_2.10.0.x86_64.xml | 1 + .../caps_2.11.0.s390x.xml | 1 + .../caps_2.11.0.x86_64.xml | 1 + .../caps_2.12.0.aarch64.xml | 1 + .../caps_2.12.0.ppc64.xml | 1 + .../caps_2.12.0.s390x.xml | 1 + .../caps_2.12.0.x86_64.xml | 1 + .../caps_2.6.0.aarch64.xml | 1 + .../qemucapabilitiesdata/caps_2.6.0.ppc64.xml | 1 + .../caps_2.6.0.x86_64.xml | 1 + .../qemucapabilitiesdata/caps_2.7.0.s390x.xml | 1 + .../caps_2.7.0.x86_64.xml | 1 + .../qemucapabilitiesdata/caps_2.8.0.s390x.xml | 1 + .../caps_2.8.0.x86_64.xml | 1 + .../qemucapabilitiesdata/caps_2.9.0.ppc64.xml | 1 + .../qemucapabilitiesdata/caps_2.9.0.s390x.xml | 1 + .../caps_2.9.0.x86_64.xml | 1 + .../qemucapabilitiesdata/caps_3.0.0.ppc64.xml | 1 + .../caps_3.0.0.riscv32.xml | 1 + .../caps_3.0.0.riscv64.xml | 1 + .../qemucapabilitiesdata/caps_3.0.0.s390x.xml | 1 + .../caps_3.0.0.x86_64.xml | 1 + .../qemucapabilitiesdata/caps_3.1.0.ppc64.xml | 1 + .../caps_3.1.0.x86_64.xml | 1 + .../caps_4.0.0.aarch64.xml | 1 + .../qemucapabilitiesdata/caps_4.0.0.ppc64.xml | 1 + .../caps_4.0.0.riscv32.xml | 1 + .../caps_4.0.0.riscv64.xml | 1 + .../qemucapabilitiesdata/caps_4.0.0.s390x.xml | 1 + .../caps_4.0.0.x86_64.xml | 1 + .../caps_4.1.0.x86_64.xml | 1 + .../caps_4.2.0.aarch64.xml | 1 + .../qemucapabilitiesdata/caps_4.2.0.ppc64.xml | 1 + .../qemucapabilitiesdata/caps_4.2.0.s390x.xml | 1 + .../caps_4.2.0.x86_64.xml | 1 + .../caps_5.0.0.aarch64.xml | 1 + .../qemucapabilitiesdata/caps_5.0.0.ppc64.xml | 1 + .../caps_5.0.0.riscv64.xml | 1 + .../caps_5.0.0.x86_64.xml | 1 + .../qemucapabilitiesdata/caps_5.1.0.sparc.xml | 1 + .../caps_5.1.0.x86_64.xml | 1 + .../caps_5.2.0.aarch64.xml | 1 + .../qemucapabilitiesdata/caps_5.2.0.ppc64.xml | 1 + .../caps_5.2.0.riscv64.xml | 1 + .../qemucapabilitiesdata/caps_5.2.0.s390x.xml | 1 + .../caps_5.2.0.x86_64.xml | 1 + .../caps_6.0.0.x86_64.xml | 1 + .../input-linux.x86_64-latest.args | 34 +++++++++++ tests/qemuxml2argvdata/input-linux.xml | 24 ++++++++ tests/qemuxml2xmloutdata/input-linux.xml | 1 + 71 files changed, 269 insertions(+), 22 deletions(-) create mode 100644 tests/qemuxml2argvdata/input-linux.x86_64-latest.args create mode 100644 tests/qemuxml2argvdata/input-linux.xml create mode 120000 tests/qemuxml2xmloutdata/input-linux.xml -- 2.30.2

Signed-off-by: Kristina Hanicova <khanicov@redhat.com> --- src/qemu/qemu_capabilities.c | 2 ++ src/qemu/qemu_capabilities.h | 1 + tests/qemucapabilitiesdata/caps_2.10.0.aarch64.xml | 1 + tests/qemucapabilitiesdata/caps_2.10.0.ppc64.xml | 1 + tests/qemucapabilitiesdata/caps_2.10.0.s390x.xml | 1 + tests/qemucapabilitiesdata/caps_2.10.0.x86_64.xml | 1 + tests/qemucapabilitiesdata/caps_2.11.0.s390x.xml | 1 + tests/qemucapabilitiesdata/caps_2.11.0.x86_64.xml | 1 + tests/qemucapabilitiesdata/caps_2.12.0.aarch64.xml | 1 + tests/qemucapabilitiesdata/caps_2.12.0.ppc64.xml | 1 + tests/qemucapabilitiesdata/caps_2.12.0.s390x.xml | 1 + tests/qemucapabilitiesdata/caps_2.12.0.x86_64.xml | 1 + tests/qemucapabilitiesdata/caps_2.6.0.aarch64.xml | 1 + tests/qemucapabilitiesdata/caps_2.6.0.ppc64.xml | 1 + tests/qemucapabilitiesdata/caps_2.6.0.x86_64.xml | 1 + tests/qemucapabilitiesdata/caps_2.7.0.s390x.xml | 1 + tests/qemucapabilitiesdata/caps_2.7.0.x86_64.xml | 1 + tests/qemucapabilitiesdata/caps_2.8.0.s390x.xml | 1 + tests/qemucapabilitiesdata/caps_2.8.0.x86_64.xml | 1 + tests/qemucapabilitiesdata/caps_2.9.0.ppc64.xml | 1 + tests/qemucapabilitiesdata/caps_2.9.0.s390x.xml | 1 + tests/qemucapabilitiesdata/caps_2.9.0.x86_64.xml | 1 + tests/qemucapabilitiesdata/caps_3.0.0.ppc64.xml | 1 + tests/qemucapabilitiesdata/caps_3.0.0.riscv32.xml | 1 + tests/qemucapabilitiesdata/caps_3.0.0.riscv64.xml | 1 + tests/qemucapabilitiesdata/caps_3.0.0.s390x.xml | 1 + tests/qemucapabilitiesdata/caps_3.0.0.x86_64.xml | 1 + tests/qemucapabilitiesdata/caps_3.1.0.ppc64.xml | 1 + tests/qemucapabilitiesdata/caps_3.1.0.x86_64.xml | 1 + tests/qemucapabilitiesdata/caps_4.0.0.aarch64.xml | 1 + tests/qemucapabilitiesdata/caps_4.0.0.ppc64.xml | 1 + tests/qemucapabilitiesdata/caps_4.0.0.riscv32.xml | 1 + tests/qemucapabilitiesdata/caps_4.0.0.riscv64.xml | 1 + tests/qemucapabilitiesdata/caps_4.0.0.s390x.xml | 1 + tests/qemucapabilitiesdata/caps_4.0.0.x86_64.xml | 1 + tests/qemucapabilitiesdata/caps_4.1.0.x86_64.xml | 1 + tests/qemucapabilitiesdata/caps_4.2.0.aarch64.xml | 1 + tests/qemucapabilitiesdata/caps_4.2.0.ppc64.xml | 1 + tests/qemucapabilitiesdata/caps_4.2.0.s390x.xml | 1 + tests/qemucapabilitiesdata/caps_4.2.0.x86_64.xml | 1 + tests/qemucapabilitiesdata/caps_5.0.0.aarch64.xml | 1 + tests/qemucapabilitiesdata/caps_5.0.0.ppc64.xml | 1 + tests/qemucapabilitiesdata/caps_5.0.0.riscv64.xml | 1 + tests/qemucapabilitiesdata/caps_5.0.0.x86_64.xml | 1 + tests/qemucapabilitiesdata/caps_5.1.0.sparc.xml | 1 + tests/qemucapabilitiesdata/caps_5.1.0.x86_64.xml | 1 + tests/qemucapabilitiesdata/caps_5.2.0.aarch64.xml | 1 + tests/qemucapabilitiesdata/caps_5.2.0.ppc64.xml | 1 + tests/qemucapabilitiesdata/caps_5.2.0.riscv64.xml | 1 + tests/qemucapabilitiesdata/caps_5.2.0.s390x.xml | 1 + tests/qemucapabilitiesdata/caps_5.2.0.x86_64.xml | 1 + tests/qemucapabilitiesdata/caps_6.0.0.x86_64.xml | 1 + 52 files changed, 53 insertions(+) diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c index 7971a9c557..2188358c54 100644 --- a/src/qemu/qemu_capabilities.c +++ b/src/qemu/qemu_capabilities.c @@ -629,6 +629,7 @@ VIR_ENUM_IMPL(virQEMUCaps, /* 400 */ "compat-deprecated", "acpi-index", + "input-linux", ); @@ -1347,6 +1348,7 @@ struct virQEMUCapsStringFlags virQEMUCapsObjectTypes[] = { { "am53c974", QEMU_CAPS_SCSI_AM53C974 }, { "virtio-pmem-pci", QEMU_CAPS_DEVICE_VIRTIO_PMEM_PCI }, { "vhost-user-blk", QEMU_CAPS_DEVICE_VHOST_USER_BLK }, + { "input-linux", QEMU_CAPS_INPUT_LINUX }, }; diff --git a/src/qemu/qemu_capabilities.h b/src/qemu/qemu_capabilities.h index f54aad5dfd..f98695f6b8 100644 --- a/src/qemu/qemu_capabilities.h +++ b/src/qemu/qemu_capabilities.h @@ -609,6 +609,7 @@ typedef enum { /* virQEMUCapsFlags grouping marker for syntax-check */ /* 400 */ QEMU_CAPS_COMPAT_DEPRECATED, /* -compat deprecated-(input|output) is supported */ QEMU_CAPS_ACPI_INDEX, /* PCI device 'acpi-index' property */ + QEMU_CAPS_INPUT_LINUX, /* -object input-linux */ QEMU_CAPS_LAST /* this must always be the last item */ } virQEMUCapsFlags; diff --git a/tests/qemucapabilitiesdata/caps_2.10.0.aarch64.xml b/tests/qemucapabilitiesdata/caps_2.10.0.aarch64.xml index cce5233a14..2a1a827bb5 100644 --- a/tests/qemucapabilitiesdata/caps_2.10.0.aarch64.xml +++ b/tests/qemucapabilitiesdata/caps_2.10.0.aarch64.xml @@ -150,6 +150,7 @@ <flag name='dc390'/> <flag name='am53c974'/> <flag name='vnc-opts'/> + <flag name='input-linux'/> <version>2010000</version> <kvmVersion>0</kvmVersion> <microcodeVersion>61700287</microcodeVersion> diff --git a/tests/qemucapabilitiesdata/caps_2.10.0.ppc64.xml b/tests/qemucapabilitiesdata/caps_2.10.0.ppc64.xml index 94ea063d05..9767f5f55f 100644 --- a/tests/qemucapabilitiesdata/caps_2.10.0.ppc64.xml +++ b/tests/qemucapabilitiesdata/caps_2.10.0.ppc64.xml @@ -150,6 +150,7 @@ <flag name='dc390'/> <flag name='am53c974'/> <flag name='vnc-opts'/> + <flag name='input-linux'/> <version>2010000</version> <kvmVersion>0</kvmVersion> <microcodeVersion>42900287</microcodeVersion> diff --git a/tests/qemucapabilitiesdata/caps_2.10.0.s390x.xml b/tests/qemucapabilitiesdata/caps_2.10.0.s390x.xml index 42e77c7ef1..69778040cf 100644 --- a/tests/qemucapabilitiesdata/caps_2.10.0.s390x.xml +++ b/tests/qemucapabilitiesdata/caps_2.10.0.s390x.xml @@ -114,6 +114,7 @@ <flag name='migration-param.downtime'/> <flag name='fsdev.createmode'/> <flag name='vnc-opts'/> + <flag name='input-linux'/> <version>2010000</version> <kvmVersion>0</kvmVersion> <microcodeVersion>39100287</microcodeVersion> diff --git a/tests/qemucapabilitiesdata/caps_2.10.0.x86_64.xml b/tests/qemucapabilitiesdata/caps_2.10.0.x86_64.xml index 8027baf181..9af50c8527 100644 --- a/tests/qemucapabilitiesdata/caps_2.10.0.x86_64.xml +++ b/tests/qemucapabilitiesdata/caps_2.10.0.x86_64.xml @@ -195,6 +195,7 @@ <flag name='am53c974'/> <flag name='cpu-max'/> <flag name='vnc-opts'/> + <flag name='input-linux'/> <version>2010000</version> <kvmVersion>0</kvmVersion> <microcodeVersion>43100287</microcodeVersion> diff --git a/tests/qemucapabilitiesdata/caps_2.11.0.s390x.xml b/tests/qemucapabilitiesdata/caps_2.11.0.s390x.xml index 23ccb98c2a..cda75ae9c0 100644 --- a/tests/qemucapabilitiesdata/caps_2.11.0.s390x.xml +++ b/tests/qemucapabilitiesdata/caps_2.11.0.s390x.xml @@ -122,6 +122,7 @@ <flag name='migration-param.xbzrle-cache-size'/> <flag name='fsdev.createmode'/> <flag name='vnc-opts'/> + <flag name='input-linux'/> <version>2011000</version> <kvmVersion>0</kvmVersion> <microcodeVersion>39100288</microcodeVersion> diff --git a/tests/qemucapabilitiesdata/caps_2.11.0.x86_64.xml b/tests/qemucapabilitiesdata/caps_2.11.0.x86_64.xml index 5e310a452b..159217c201 100644 --- a/tests/qemucapabilitiesdata/caps_2.11.0.x86_64.xml +++ b/tests/qemucapabilitiesdata/caps_2.11.0.x86_64.xml @@ -202,6 +202,7 @@ <flag name='am53c974'/> <flag name='cpu-max'/> <flag name='vnc-opts'/> + <flag name='input-linux'/> <version>2011000</version> <kvmVersion>0</kvmVersion> <microcodeVersion>43100288</microcodeVersion> diff --git a/tests/qemucapabilitiesdata/caps_2.12.0.aarch64.xml b/tests/qemucapabilitiesdata/caps_2.12.0.aarch64.xml index f9d85560b6..0088f47cd3 100644 --- a/tests/qemucapabilitiesdata/caps_2.12.0.aarch64.xml +++ b/tests/qemucapabilitiesdata/caps_2.12.0.aarch64.xml @@ -170,6 +170,7 @@ <flag name='cpu-max'/> <flag name='vnc-opts'/> <flag name='rotation-rate'/> + <flag name='input-linux'/> <version>2012000</version> <kvmVersion>0</kvmVersion> <microcodeVersion>61700289</microcodeVersion> diff --git a/tests/qemucapabilitiesdata/caps_2.12.0.ppc64.xml b/tests/qemucapabilitiesdata/caps_2.12.0.ppc64.xml index 2b274dbbce..92ea60a801 100644 --- a/tests/qemucapabilitiesdata/caps_2.12.0.ppc64.xml +++ b/tests/qemucapabilitiesdata/caps_2.12.0.ppc64.xml @@ -170,6 +170,7 @@ <flag name='vhost-user-blk'/> <flag name='cpu-max'/> <flag name='vnc-opts'/> + <flag name='input-linux'/> <version>2011090</version> <kvmVersion>0</kvmVersion> <microcodeVersion>42900289</microcodeVersion> diff --git a/tests/qemucapabilitiesdata/caps_2.12.0.s390x.xml b/tests/qemucapabilitiesdata/caps_2.12.0.s390x.xml index f74a4a807a..6f3a76eab5 100644 --- a/tests/qemucapabilitiesdata/caps_2.12.0.s390x.xml +++ b/tests/qemucapabilitiesdata/caps_2.12.0.s390x.xml @@ -135,6 +135,7 @@ <flag name='fsdev.createmode'/> <flag name='vhost-user-blk'/> <flag name='vnc-opts'/> + <flag name='input-linux'/> <version>2012000</version> <kvmVersion>0</kvmVersion> <microcodeVersion>39100289</microcodeVersion> diff --git a/tests/qemucapabilitiesdata/caps_2.12.0.x86_64.xml b/tests/qemucapabilitiesdata/caps_2.12.0.x86_64.xml index f160c7d16e..c97bc78e0f 100644 --- a/tests/qemucapabilitiesdata/caps_2.12.0.x86_64.xml +++ b/tests/qemucapabilitiesdata/caps_2.12.0.x86_64.xml @@ -213,6 +213,7 @@ <flag name='vhost-user-blk'/> <flag name='cpu-max'/> <flag name='vnc-opts'/> + <flag name='input-linux'/> <version>2011090</version> <kvmVersion>0</kvmVersion> <microcodeVersion>43100289</microcodeVersion> diff --git a/tests/qemucapabilitiesdata/caps_2.6.0.aarch64.xml b/tests/qemucapabilitiesdata/caps_2.6.0.aarch64.xml index 6e398921c0..5680290131 100644 --- a/tests/qemucapabilitiesdata/caps_2.6.0.aarch64.xml +++ b/tests/qemucapabilitiesdata/caps_2.6.0.aarch64.xml @@ -130,6 +130,7 @@ <flag name='dc390'/> <flag name='am53c974'/> <flag name='vnc-opts'/> + <flag name='input-linux'/> <version>2006000</version> <kvmVersion>0</kvmVersion> <microcodeVersion>61700244</microcodeVersion> diff --git a/tests/qemucapabilitiesdata/caps_2.6.0.ppc64.xml b/tests/qemucapabilitiesdata/caps_2.6.0.ppc64.xml index 597e1a6a21..5f5ef75baa 100644 --- a/tests/qemucapabilitiesdata/caps_2.6.0.ppc64.xml +++ b/tests/qemucapabilitiesdata/caps_2.6.0.ppc64.xml @@ -126,6 +126,7 @@ <flag name='dc390'/> <flag name='am53c974'/> <flag name='vnc-opts'/> + <flag name='input-linux'/> <version>2006000</version> <kvmVersion>0</kvmVersion> <microcodeVersion>42900244</microcodeVersion> diff --git a/tests/qemucapabilitiesdata/caps_2.6.0.x86_64.xml b/tests/qemucapabilitiesdata/caps_2.6.0.x86_64.xml index b57e1f0d23..7ce889bb7f 100644 --- a/tests/qemucapabilitiesdata/caps_2.6.0.x86_64.xml +++ b/tests/qemucapabilitiesdata/caps_2.6.0.x86_64.xml @@ -159,6 +159,7 @@ <flag name='dc390'/> <flag name='am53c974'/> <flag name='vnc-opts'/> + <flag name='input-linux'/> <version>2006000</version> <kvmVersion>0</kvmVersion> <microcodeVersion>43100244</microcodeVersion> diff --git a/tests/qemucapabilitiesdata/caps_2.7.0.s390x.xml b/tests/qemucapabilitiesdata/caps_2.7.0.s390x.xml index 5e5aef04f8..f6aefbec19 100644 --- a/tests/qemucapabilitiesdata/caps_2.7.0.s390x.xml +++ b/tests/qemucapabilitiesdata/caps_2.7.0.s390x.xml @@ -95,6 +95,7 @@ <flag name='tcg'/> <flag name='fw_cfg'/> <flag name='vnc-opts'/> + <flag name='input-linux'/> <version>2007000</version> <kvmVersion>0</kvmVersion> <microcodeVersion>39100245</microcodeVersion> diff --git a/tests/qemucapabilitiesdata/caps_2.7.0.x86_64.xml b/tests/qemucapabilitiesdata/caps_2.7.0.x86_64.xml index 5574c3b941..4d7809294e 100644 --- a/tests/qemucapabilitiesdata/caps_2.7.0.x86_64.xml +++ b/tests/qemucapabilitiesdata/caps_2.7.0.x86_64.xml @@ -164,6 +164,7 @@ <flag name='dc390'/> <flag name='am53c974'/> <flag name='vnc-opts'/> + <flag name='input-linux'/> <version>2007000</version> <kvmVersion>0</kvmVersion> <microcodeVersion>43100245</microcodeVersion> diff --git a/tests/qemucapabilitiesdata/caps_2.8.0.s390x.xml b/tests/qemucapabilitiesdata/caps_2.8.0.s390x.xml index 5525610a36..8f3d12c67d 100644 --- a/tests/qemucapabilitiesdata/caps_2.8.0.s390x.xml +++ b/tests/qemucapabilitiesdata/caps_2.8.0.s390x.xml @@ -102,6 +102,7 @@ <flag name='migration-param.bandwidth'/> <flag name='migration-param.downtime'/> <flag name='vnc-opts'/> + <flag name='input-linux'/> <version>2007093</version> <kvmVersion>0</kvmVersion> <microcodeVersion>39100246</microcodeVersion> diff --git a/tests/qemucapabilitiesdata/caps_2.8.0.x86_64.xml b/tests/qemucapabilitiesdata/caps_2.8.0.x86_64.xml index d9a102886a..330b814141 100644 --- a/tests/qemucapabilitiesdata/caps_2.8.0.x86_64.xml +++ b/tests/qemucapabilitiesdata/caps_2.8.0.x86_64.xml @@ -169,6 +169,7 @@ <flag name='dc390'/> <flag name='am53c974'/> <flag name='vnc-opts'/> + <flag name='input-linux'/> <version>2008000</version> <kvmVersion>0</kvmVersion> <microcodeVersion>43100246</microcodeVersion> diff --git a/tests/qemucapabilitiesdata/caps_2.9.0.ppc64.xml b/tests/qemucapabilitiesdata/caps_2.9.0.ppc64.xml index d5098c3dfb..95b4aea647 100644 --- a/tests/qemucapabilitiesdata/caps_2.9.0.ppc64.xml +++ b/tests/qemucapabilitiesdata/caps_2.9.0.ppc64.xml @@ -141,6 +141,7 @@ <flag name='dc390'/> <flag name='am53c974'/> <flag name='vnc-opts'/> + <flag name='input-linux'/> <version>2009000</version> <kvmVersion>0</kvmVersion> <microcodeVersion>42900247</microcodeVersion> diff --git a/tests/qemucapabilitiesdata/caps_2.9.0.s390x.xml b/tests/qemucapabilitiesdata/caps_2.9.0.s390x.xml index d985f4e9ec..d344da947a 100644 --- a/tests/qemucapabilitiesdata/caps_2.9.0.s390x.xml +++ b/tests/qemucapabilitiesdata/caps_2.9.0.s390x.xml @@ -107,6 +107,7 @@ <flag name='migration-param.bandwidth'/> <flag name='migration-param.downtime'/> <flag name='vnc-opts'/> + <flag name='input-linux'/> <version>2009000</version> <kvmVersion>0</kvmVersion> <microcodeVersion>39100247</microcodeVersion> diff --git a/tests/qemucapabilitiesdata/caps_2.9.0.x86_64.xml b/tests/qemucapabilitiesdata/caps_2.9.0.x86_64.xml index 8f41622c44..0514f4a5a4 100644 --- a/tests/qemucapabilitiesdata/caps_2.9.0.x86_64.xml +++ b/tests/qemucapabilitiesdata/caps_2.9.0.x86_64.xml @@ -188,6 +188,7 @@ <flag name='am53c974'/> <flag name='cpu-max'/> <flag name='vnc-opts'/> + <flag name='input-linux'/> <version>2009000</version> <kvmVersion>0</kvmVersion> <microcodeVersion>43100247</microcodeVersion> diff --git a/tests/qemucapabilitiesdata/caps_3.0.0.ppc64.xml b/tests/qemucapabilitiesdata/caps_3.0.0.ppc64.xml index 09291babd6..55a59fc39e 100644 --- a/tests/qemucapabilitiesdata/caps_3.0.0.ppc64.xml +++ b/tests/qemucapabilitiesdata/caps_3.0.0.ppc64.xml @@ -172,6 +172,7 @@ <flag name='vhost-user-blk'/> <flag name='cpu-max'/> <flag name='vnc-opts'/> + <flag name='input-linux'/> <version>2012050</version> <kvmVersion>0</kvmVersion> <microcodeVersion>42900239</microcodeVersion> diff --git a/tests/qemucapabilitiesdata/caps_3.0.0.riscv32.xml b/tests/qemucapabilitiesdata/caps_3.0.0.riscv32.xml index 1c67d1b0a2..b1ee620f88 100644 --- a/tests/qemucapabilitiesdata/caps_3.0.0.riscv32.xml +++ b/tests/qemucapabilitiesdata/caps_3.0.0.riscv32.xml @@ -105,6 +105,7 @@ <flag name='fsdev.createmode'/> <flag name='vhost-user-blk'/> <flag name='vnc-opts'/> + <flag name='input-linux'/> <version>3000000</version> <kvmVersion>0</kvmVersion> <microcodeVersion>0</microcodeVersion> diff --git a/tests/qemucapabilitiesdata/caps_3.0.0.riscv64.xml b/tests/qemucapabilitiesdata/caps_3.0.0.riscv64.xml index 018747e385..927015fb32 100644 --- a/tests/qemucapabilitiesdata/caps_3.0.0.riscv64.xml +++ b/tests/qemucapabilitiesdata/caps_3.0.0.riscv64.xml @@ -105,6 +105,7 @@ <flag name='fsdev.createmode'/> <flag name='vhost-user-blk'/> <flag name='vnc-opts'/> + <flag name='input-linux'/> <version>3000000</version> <kvmVersion>0</kvmVersion> <microcodeVersion>0</microcodeVersion> diff --git a/tests/qemucapabilitiesdata/caps_3.0.0.s390x.xml b/tests/qemucapabilitiesdata/caps_3.0.0.s390x.xml index fd5279987a..c41a35a9a0 100644 --- a/tests/qemucapabilitiesdata/caps_3.0.0.s390x.xml +++ b/tests/qemucapabilitiesdata/caps_3.0.0.s390x.xml @@ -138,6 +138,7 @@ <flag name='fsdev.createmode'/> <flag name='vhost-user-blk'/> <flag name='vnc-opts'/> + <flag name='input-linux'/> <version>3000000</version> <kvmVersion>0</kvmVersion> <microcodeVersion>39100239</microcodeVersion> diff --git a/tests/qemucapabilitiesdata/caps_3.0.0.x86_64.xml b/tests/qemucapabilitiesdata/caps_3.0.0.x86_64.xml index 8bf6c831b1..84612b5932 100644 --- a/tests/qemucapabilitiesdata/caps_3.0.0.x86_64.xml +++ b/tests/qemucapabilitiesdata/caps_3.0.0.x86_64.xml @@ -219,6 +219,7 @@ <flag name='vhost-user-blk'/> <flag name='cpu-max'/> <flag name='vnc-opts'/> + <flag name='input-linux'/> <version>3000000</version> <kvmVersion>0</kvmVersion> <microcodeVersion>43100239</microcodeVersion> diff --git a/tests/qemucapabilitiesdata/caps_3.1.0.ppc64.xml b/tests/qemucapabilitiesdata/caps_3.1.0.ppc64.xml index 0464a8e456..c249f68dfe 100644 --- a/tests/qemucapabilitiesdata/caps_3.1.0.ppc64.xml +++ b/tests/qemucapabilitiesdata/caps_3.1.0.ppc64.xml @@ -177,6 +177,7 @@ <flag name='vhost-user-blk'/> <flag name='cpu-max'/> <flag name='vnc-opts'/> + <flag name='input-linux'/> <version>3000091</version> <kvmVersion>0</kvmVersion> <microcodeVersion>42900240</microcodeVersion> diff --git a/tests/qemucapabilitiesdata/caps_3.1.0.x86_64.xml b/tests/qemucapabilitiesdata/caps_3.1.0.x86_64.xml index 1a3177d561..25d0453de2 100644 --- a/tests/qemucapabilitiesdata/caps_3.1.0.x86_64.xml +++ b/tests/qemucapabilitiesdata/caps_3.1.0.x86_64.xml @@ -222,6 +222,7 @@ <flag name='vhost-user-blk'/> <flag name='cpu-max'/> <flag name='vnc-opts'/> + <flag name='input-linux'/> <version>3000092</version> <kvmVersion>0</kvmVersion> <microcodeVersion>43100240</microcodeVersion> diff --git a/tests/qemucapabilitiesdata/caps_4.0.0.aarch64.xml b/tests/qemucapabilitiesdata/caps_4.0.0.aarch64.xml index 8f8d09eda0..30a5996869 100644 --- a/tests/qemucapabilitiesdata/caps_4.0.0.aarch64.xml +++ b/tests/qemucapabilitiesdata/caps_4.0.0.aarch64.xml @@ -185,6 +185,7 @@ <flag name='memory-backend-file.x-use-canonical-path-for-ramblock-id'/> <flag name='vnc-opts'/> <flag name='rotation-rate'/> + <flag name='input-linux'/> <version>4000000</version> <kvmVersion>0</kvmVersion> <microcodeVersion>61700240</microcodeVersion> diff --git a/tests/qemucapabilitiesdata/caps_4.0.0.ppc64.xml b/tests/qemucapabilitiesdata/caps_4.0.0.ppc64.xml index 3c32aceaf9..7fb574f203 100644 --- a/tests/qemucapabilitiesdata/caps_4.0.0.ppc64.xml +++ b/tests/qemucapabilitiesdata/caps_4.0.0.ppc64.xml @@ -193,6 +193,7 @@ <flag name='memory-backend-file.x-use-canonical-path-for-ramblock-id'/> <flag name='vnc-opts'/> <flag name='rotation-rate'/> + <flag name='input-linux'/> <version>4000000</version> <kvmVersion>0</kvmVersion> <microcodeVersion>42900240</microcodeVersion> diff --git a/tests/qemucapabilitiesdata/caps_4.0.0.riscv32.xml b/tests/qemucapabilitiesdata/caps_4.0.0.riscv32.xml index 3741f75aff..ffcd98e219 100644 --- a/tests/qemucapabilitiesdata/caps_4.0.0.riscv32.xml +++ b/tests/qemucapabilitiesdata/caps_4.0.0.riscv32.xml @@ -185,6 +185,7 @@ <flag name='memory-backend-file.x-use-canonical-path-for-ramblock-id'/> <flag name='vnc-opts'/> <flag name='rotation-rate'/> + <flag name='input-linux'/> <version>4000000</version> <kvmVersion>0</kvmVersion> <microcodeVersion>0</microcodeVersion> diff --git a/tests/qemucapabilitiesdata/caps_4.0.0.riscv64.xml b/tests/qemucapabilitiesdata/caps_4.0.0.riscv64.xml index c2ee65a232..dcb282c2d5 100644 --- a/tests/qemucapabilitiesdata/caps_4.0.0.riscv64.xml +++ b/tests/qemucapabilitiesdata/caps_4.0.0.riscv64.xml @@ -185,6 +185,7 @@ <flag name='memory-backend-file.x-use-canonical-path-for-ramblock-id'/> <flag name='vnc-opts'/> <flag name='rotation-rate'/> + <flag name='input-linux'/> <version>4000000</version> <kvmVersion>0</kvmVersion> <microcodeVersion>0</microcodeVersion> diff --git a/tests/qemucapabilitiesdata/caps_4.0.0.s390x.xml b/tests/qemucapabilitiesdata/caps_4.0.0.s390x.xml index 3b25aabf93..2c8b9245e7 100644 --- a/tests/qemucapabilitiesdata/caps_4.0.0.s390x.xml +++ b/tests/qemucapabilitiesdata/caps_4.0.0.s390x.xml @@ -149,6 +149,7 @@ <flag name='memory-backend-file.x-use-canonical-path-for-ramblock-id'/> <flag name='vnc-opts'/> <flag name='rotation-rate'/> + <flag name='input-linux'/> <version>4000000</version> <kvmVersion>0</kvmVersion> <microcodeVersion>39100240</microcodeVersion> diff --git a/tests/qemucapabilitiesdata/caps_4.0.0.x86_64.xml b/tests/qemucapabilitiesdata/caps_4.0.0.x86_64.xml index 5c2511eaa7..710ed0a57a 100644 --- a/tests/qemucapabilitiesdata/caps_4.0.0.x86_64.xml +++ b/tests/qemucapabilitiesdata/caps_4.0.0.x86_64.xml @@ -230,6 +230,7 @@ <flag name='memory-backend-file.x-use-canonical-path-for-ramblock-id'/> <flag name='vnc-opts'/> <flag name='rotation-rate'/> + <flag name='input-linux'/> <version>4000000</version> <kvmVersion>0</kvmVersion> <microcodeVersion>43100240</microcodeVersion> diff --git a/tests/qemucapabilitiesdata/caps_4.1.0.x86_64.xml b/tests/qemucapabilitiesdata/caps_4.1.0.x86_64.xml index 49d5fc5578..6696c77f22 100644 --- a/tests/qemucapabilitiesdata/caps_4.1.0.x86_64.xml +++ b/tests/qemucapabilitiesdata/caps_4.1.0.x86_64.xml @@ -237,6 +237,7 @@ <flag name='memory-backend-file.x-use-canonical-path-for-ramblock-id'/> <flag name='vnc-opts'/> <flag name='rotation-rate'/> + <flag name='input-linux'/> <version>4001000</version> <kvmVersion>0</kvmVersion> <microcodeVersion>43100241</microcodeVersion> diff --git a/tests/qemucapabilitiesdata/caps_4.2.0.aarch64.xml b/tests/qemucapabilitiesdata/caps_4.2.0.aarch64.xml index eeeb27797b..d5d58a4223 100644 --- a/tests/qemucapabilitiesdata/caps_4.2.0.aarch64.xml +++ b/tests/qemucapabilitiesdata/caps_4.2.0.aarch64.xml @@ -200,6 +200,7 @@ <flag name='audiodev'/> <flag name='blockdev-backup'/> <flag name='rotation-rate'/> + <flag name='input-linux'/> <version>4001050</version> <kvmVersion>0</kvmVersion> <microcodeVersion>61700242</microcodeVersion> diff --git a/tests/qemucapabilitiesdata/caps_4.2.0.ppc64.xml b/tests/qemucapabilitiesdata/caps_4.2.0.ppc64.xml index d18776778d..44319bf34e 100644 --- a/tests/qemucapabilitiesdata/caps_4.2.0.ppc64.xml +++ b/tests/qemucapabilitiesdata/caps_4.2.0.ppc64.xml @@ -200,6 +200,7 @@ <flag name='vnc-opts'/> <flag name='audiodev'/> <flag name='rotation-rate'/> + <flag name='input-linux'/> <version>4001050</version> <kvmVersion>0</kvmVersion> <microcodeVersion>42900242</microcodeVersion> diff --git a/tests/qemucapabilitiesdata/caps_4.2.0.s390x.xml b/tests/qemucapabilitiesdata/caps_4.2.0.s390x.xml index 67c6f9248c..2eeb1f4f5b 100644 --- a/tests/qemucapabilitiesdata/caps_4.2.0.s390x.xml +++ b/tests/qemucapabilitiesdata/caps_4.2.0.s390x.xml @@ -162,6 +162,7 @@ <flag name='audiodev'/> <flag name='blockdev-backup'/> <flag name='rotation-rate'/> + <flag name='input-linux'/> <version>4002000</version> <kvmVersion>0</kvmVersion> <microcodeVersion>39100242</microcodeVersion> diff --git a/tests/qemucapabilitiesdata/caps_4.2.0.x86_64.xml b/tests/qemucapabilitiesdata/caps_4.2.0.x86_64.xml index 28f6666f7f..64b07c9645 100644 --- a/tests/qemucapabilitiesdata/caps_4.2.0.x86_64.xml +++ b/tests/qemucapabilitiesdata/caps_4.2.0.x86_64.xml @@ -248,6 +248,7 @@ <flag name='audiodev'/> <flag name='blockdev-backup'/> <flag name='rotation-rate'/> + <flag name='input-linux'/> <version>4002000</version> <kvmVersion>0</kvmVersion> <microcodeVersion>43100242</microcodeVersion> diff --git a/tests/qemucapabilitiesdata/caps_5.0.0.aarch64.xml b/tests/qemucapabilitiesdata/caps_5.0.0.aarch64.xml index 68ccaf6219..711684c17a 100644 --- a/tests/qemucapabilitiesdata/caps_5.0.0.aarch64.xml +++ b/tests/qemucapabilitiesdata/caps_5.0.0.aarch64.xml @@ -210,6 +210,7 @@ <flag name='audiodev'/> <flag name='blockdev-backup'/> <flag name='rotation-rate'/> + <flag name='input-linux'/> <version>5000000</version> <kvmVersion>0</kvmVersion> <microcodeVersion>61700241</microcodeVersion> diff --git a/tests/qemucapabilitiesdata/caps_5.0.0.ppc64.xml b/tests/qemucapabilitiesdata/caps_5.0.0.ppc64.xml index 3dd4139263..ffbc10e297 100644 --- a/tests/qemucapabilitiesdata/caps_5.0.0.ppc64.xml +++ b/tests/qemucapabilitiesdata/caps_5.0.0.ppc64.xml @@ -219,6 +219,7 @@ <flag name='audiodev'/> <flag name='blockdev-backup'/> <flag name='rotation-rate'/> + <flag name='input-linux'/> <version>5000000</version> <kvmVersion>0</kvmVersion> <microcodeVersion>42900241</microcodeVersion> diff --git a/tests/qemucapabilitiesdata/caps_5.0.0.riscv64.xml b/tests/qemucapabilitiesdata/caps_5.0.0.riscv64.xml index 5993348d6b..b80bd359ed 100644 --- a/tests/qemucapabilitiesdata/caps_5.0.0.riscv64.xml +++ b/tests/qemucapabilitiesdata/caps_5.0.0.riscv64.xml @@ -205,6 +205,7 @@ <flag name='audiodev'/> <flag name='blockdev-backup'/> <flag name='rotation-rate'/> + <flag name='input-linux'/> <version>5000000</version> <kvmVersion>0</kvmVersion> <microcodeVersion>0</microcodeVersion> diff --git a/tests/qemucapabilitiesdata/caps_5.0.0.x86_64.xml b/tests/qemucapabilitiesdata/caps_5.0.0.x86_64.xml index 9467e4cfeb..3a491d0fe3 100644 --- a/tests/qemucapabilitiesdata/caps_5.0.0.x86_64.xml +++ b/tests/qemucapabilitiesdata/caps_5.0.0.x86_64.xml @@ -255,6 +255,7 @@ <flag name='audiodev'/> <flag name='blockdev-backup'/> <flag name='rotation-rate'/> + <flag name='input-linux'/> <version>5000000</version> <kvmVersion>0</kvmVersion> <microcodeVersion>43100241</microcodeVersion> diff --git a/tests/qemucapabilitiesdata/caps_5.1.0.sparc.xml b/tests/qemucapabilitiesdata/caps_5.1.0.sparc.xml index a4838def4d..60c40d2733 100644 --- a/tests/qemucapabilitiesdata/caps_5.1.0.sparc.xml +++ b/tests/qemucapabilitiesdata/caps_5.1.0.sparc.xml @@ -120,6 +120,7 @@ <flag name='audiodev'/> <flag name='blockdev-backup'/> <flag name='rotation-rate'/> + <flag name='input-linux'/> <version>5001000</version> <kvmVersion>0</kvmVersion> <microcodeVersion>0</microcodeVersion> diff --git a/tests/qemucapabilitiesdata/caps_5.1.0.x86_64.xml b/tests/qemucapabilitiesdata/caps_5.1.0.x86_64.xml index 12bb9a1b0f..4470c04f2c 100644 --- a/tests/qemucapabilitiesdata/caps_5.1.0.x86_64.xml +++ b/tests/qemucapabilitiesdata/caps_5.1.0.x86_64.xml @@ -257,6 +257,7 @@ <flag name='audiodev'/> <flag name='blockdev-backup'/> <flag name='rotation-rate'/> + <flag name='input-linux'/> <version>5001000</version> <kvmVersion>0</kvmVersion> <microcodeVersion>43100242</microcodeVersion> diff --git a/tests/qemucapabilitiesdata/caps_5.2.0.aarch64.xml b/tests/qemucapabilitiesdata/caps_5.2.0.aarch64.xml index d88f7c989a..3f8a3df3da 100644 --- a/tests/qemucapabilitiesdata/caps_5.2.0.aarch64.xml +++ b/tests/qemucapabilitiesdata/caps_5.2.0.aarch64.xml @@ -214,6 +214,7 @@ <flag name='audiodev'/> <flag name='blockdev-backup'/> <flag name='rotation-rate'/> + <flag name='input-linux'/> <version>5002000</version> <kvmVersion>0</kvmVersion> <microcodeVersion>61700243</microcodeVersion> diff --git a/tests/qemucapabilitiesdata/caps_5.2.0.ppc64.xml b/tests/qemucapabilitiesdata/caps_5.2.0.ppc64.xml index 673d8b38ad..22b8b226b7 100644 --- a/tests/qemucapabilitiesdata/caps_5.2.0.ppc64.xml +++ b/tests/qemucapabilitiesdata/caps_5.2.0.ppc64.xml @@ -221,6 +221,7 @@ <flag name='audiodev'/> <flag name='blockdev-backup'/> <flag name='rotation-rate'/> + <flag name='input-linux'/> <version>5002000</version> <kvmVersion>0</kvmVersion> <microcodeVersion>42900243</microcodeVersion> diff --git a/tests/qemucapabilitiesdata/caps_5.2.0.riscv64.xml b/tests/qemucapabilitiesdata/caps_5.2.0.riscv64.xml index da2320fd69..4bd52ce9e8 100644 --- a/tests/qemucapabilitiesdata/caps_5.2.0.riscv64.xml +++ b/tests/qemucapabilitiesdata/caps_5.2.0.riscv64.xml @@ -207,6 +207,7 @@ <flag name='audiodev'/> <flag name='blockdev-backup'/> <flag name='rotation-rate'/> + <flag name='input-linux'/> <version>5002000</version> <kvmVersion>0</kvmVersion> <microcodeVersion>0</microcodeVersion> diff --git a/tests/qemucapabilitiesdata/caps_5.2.0.s390x.xml b/tests/qemucapabilitiesdata/caps_5.2.0.s390x.xml index a54b9bb096..e562db9d73 100644 --- a/tests/qemucapabilitiesdata/caps_5.2.0.s390x.xml +++ b/tests/qemucapabilitiesdata/caps_5.2.0.s390x.xml @@ -169,6 +169,7 @@ <flag name='audiodev'/> <flag name='blockdev-backup'/> <flag name='rotation-rate'/> + <flag name='input-linux'/> <version>5002000</version> <kvmVersion>0</kvmVersion> <microcodeVersion>39100243</microcodeVersion> diff --git a/tests/qemucapabilitiesdata/caps_5.2.0.x86_64.xml b/tests/qemucapabilitiesdata/caps_5.2.0.x86_64.xml index 2fee135b1e..ff21bfcb48 100644 --- a/tests/qemucapabilitiesdata/caps_5.2.0.x86_64.xml +++ b/tests/qemucapabilitiesdata/caps_5.2.0.x86_64.xml @@ -258,6 +258,7 @@ <flag name='audiodev'/> <flag name='blockdev-backup'/> <flag name='rotation-rate'/> + <flag name='input-linux'/> <version>5002000</version> <kvmVersion>0</kvmVersion> <microcodeVersion>43100243</microcodeVersion> diff --git a/tests/qemucapabilitiesdata/caps_6.0.0.x86_64.xml b/tests/qemucapabilitiesdata/caps_6.0.0.x86_64.xml index 8cc949d735..11e427511e 100644 --- a/tests/qemucapabilitiesdata/caps_6.0.0.x86_64.xml +++ b/tests/qemucapabilitiesdata/caps_6.0.0.x86_64.xml @@ -263,6 +263,7 @@ <flag name='rotation-rate'/> <flag name='compat-deprecated'/> <flag name='acpi-index'/> + <flag name='input-linux'/> <version>5002092</version> <kvmVersion>0</kvmVersion> <microcodeVersion>43100242</microcodeVersion> -- 2.30.2

Signed-off-by: Kristina Hanicova <khanicov@redhat.com> --- docs/formatdomain.rst | 30 +++++++----- docs/schemas/domaincommon.rng | 20 ++++++++ src/conf/domain_audit.c | 1 + src/conf/domain_conf.c | 61 ++++++++++++++++++++---- src/conf/domain_conf.h | 12 +++++ src/conf/domain_validate.c | 8 ++++ src/libvirt_private.syms | 2 + src/qemu/qemu_cgroup.c | 2 + src/qemu/qemu_command.c | 1 + src/qemu/qemu_domain_address.c | 1 + src/qemu/qemu_hotplug.c | 1 + src/qemu/qemu_validate.c | 6 +++ src/security/security_apparmor.c | 1 + src/security/security_dac.c | 2 + src/security/security_selinux.c | 2 + src/security/virt-aa-helper.c | 3 +- tests/qemuxml2argvdata/input-linux.xml | 24 ++++++++++ tests/qemuxml2xmloutdata/input-linux.xml | 1 + 18 files changed, 157 insertions(+), 21 deletions(-) create mode 100644 tests/qemuxml2argvdata/input-linux.xml create mode 120000 tests/qemuxml2xmloutdata/input-linux.xml diff --git a/docs/formatdomain.rst b/docs/formatdomain.rst index 282176c4f4..337d07dbfb 100644 --- a/docs/formatdomain.rst +++ b/docs/formatdomain.rst @@ -5728,26 +5728,34 @@ to provide a graphics tablet for absolute cursor movement. <input type='passthrough' bus='virtio'> <source evdev='/dev/input/event1'/> </input> + <input type='linux'> + <source evdev='/dev/input/event1234' grab='all' repeat='on'/> + </input> </devices> ... ``input`` The ``input`` element has one mandatory attribute, the ``type`` whose value - can be 'mouse', 'tablet', ( :since:`since 1.2.2` ) 'keyboard' or ( - :since:`since 1.3.0` ) 'passthrough'. The tablet provides absolute cursor - movement, while the mouse uses relative movement. The optional ``bus`` - attribute can be used to refine the exact device type. It takes values "xen" - (paravirtualized), "ps2" and "usb" or ( :since:`since 1.3.0` ) "virtio". + can be 'mouse', 'tablet', ( :since:`since 1.2.2` ) 'keyboard', ( + :since:`since 1.3.0` ) 'passthrough' or ( :since:`since 7.4.0` ) 'linux'. + The tablet provides absolute cursor movement, while the mouse uses relative + movement. The optional ``bus`` attribute can be used to refine the exact + device type. It takes values "xen" (paravirtualized), "ps2" and "usb" or ( + :since:`since 1.3.0` ) "virtio". The ``input`` element has an optional sub-element ``<address>`` which can tie the device to a particular PCI slot, `documented above <#elementsAddress>`__. On S390, ``address`` can be used to provide a CCW address for an input device ( -:since:`since 4.2.0` ). For type ``passthrough``, the mandatory sub-element -``source`` must have an ``evdev`` attribute containing the absolute path to the -event device passed through to guests. (KVM only) :since:`Since 5.2.0` , the -``input`` element accepts a ``model`` attribute which has the values 'virtio', -'virtio-transitional' and 'virtio-non-transitional'. See `Virtio transitional -devices <#elementsVirtioTransitional>`__ for more details. +:since:`since 4.2.0` ). For types ``passthrough`` and ``linux``, the mandatory +sub-element ``source`` must have an ``evdev`` attribute containing the absolute +path to the event device passed through to guests. For type ``linux``, +``sorce`` can have two optional attributes ``grab`` with value 'all' which when +enabled grabs all input devices instead of just one and ``repeat`` with value +'on' to enable auto-repeat events ( :since:`Since 7.4.0` ) (KVM only) +:since:`Since 5.2.0` , the ``input`` element accepts a ``model`` attribute +which has the values 'virtio', 'virtio-transitional' and +'virtio-non-transitional'. See `Virtio transitional devices +<#elementsVirtioTransitional>`__ for more details. The subelement ``driver`` can be used to tune the virtio options of the device: `Virtio-specific options <#elementsVirtio>`__ can also be set. ( :since:`Since diff --git a/docs/schemas/domaincommon.rng b/docs/schemas/domaincommon.rng index a2e5c50c1d..80b1961b5e 100644 --- a/docs/schemas/domaincommon.rng +++ b/docs/schemas/domaincommon.rng @@ -5443,6 +5443,26 @@ </attribute> </element> </group> + <group> + <attribute name="type"> + <value>linux</value> + </attribute> + <element name="source"> + <attribute name="evdev"> + <ref name="absFilePath"/> + </attribute> + <optional> + <attribute name="grab"> + <value>all</value> + </attribute> + </optional> + <optional> + <attribute name="repeat"> + <value>on</value> + </attribute> + </optional> + </element> + </group> </choice> <optional> <attribute name="model"> diff --git a/src/conf/domain_audit.c b/src/conf/domain_audit.c index b1226fd5dc..ac8f59ec30 100644 --- a/src/conf/domain_audit.c +++ b/src/conf/domain_audit.c @@ -956,6 +956,7 @@ virDomainAuditInput(virDomainObj *vm, break; case VIR_DOMAIN_INPUT_TYPE_PASSTHROUGH: + case VIR_DOMAIN_INPUT_TYPE_LINUX: 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 9d98f487ea..5709f5506c 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -864,6 +864,7 @@ VIR_ENUM_IMPL(virDomainInput, "tablet", "keyboard", "passthrough", + "linux", ); VIR_ENUM_IMPL(virDomainInputBus, @@ -873,6 +874,7 @@ VIR_ENUM_IMPL(virDomainInputBus, "xen", "parallels", "virtio", + "none", ); VIR_ENUM_IMPL(virDomainInputModel, @@ -883,6 +885,12 @@ VIR_ENUM_IMPL(virDomainInputModel, "virtio-non-transitional", ); +VIR_ENUM_IMPL(virDomainInputSourceGrab, + VIR_DOMAIN_INPUT_SOURCE_GRAB_LAST, + "default", + "all", +); + VIR_ENUM_IMPL(virDomainGraphics, VIR_DOMAIN_GRAPHICS_TYPE_LAST, "sdl", @@ -1898,6 +1906,7 @@ const char *virDomainInputDefGetPath(virDomainInputDef *input) return NULL; case VIR_DOMAIN_INPUT_TYPE_PASSTHROUGH: + case VIR_DOMAIN_INPUT_TYPE_LINUX: return input->source.evdev; } return NULL; @@ -12136,10 +12145,10 @@ virDomainInputDefParseXML(virDomainXMLOption *xmlopt, { VIR_XPATH_NODE_AUTORESTORE(ctxt) virDomainInputDef *def; - g_autofree char *evdev = NULL; g_autofree char *type = NULL; g_autofree char *bus = NULL; g_autofree char *model = NULL; + xmlNodePtr source = NULL; def = g_new0(virDomainInputDef, 1); @@ -12241,6 +12250,8 @@ virDomainInputDefParseXML(virDomainXMLOption *xmlopt, } else if (ARCH_IS_S390(dom->os.arch) || def->type == VIR_DOMAIN_INPUT_TYPE_PASSTHROUGH) { def->bus = VIR_DOMAIN_INPUT_BUS_VIRTIO; + } else if (def->type == VIR_DOMAIN_INPUT_TYPE_LINUX) { + def->bus = VIR_DOMAIN_INPUT_BUS_NONE; } else { def->bus = VIR_DOMAIN_INPUT_BUS_USB; } @@ -12265,12 +12276,31 @@ virDomainInputDefParseXML(virDomainXMLOption *xmlopt, goto error; } - if ((evdev = virXPathString("string(./source/@evdev)", ctxt))) - def->source.evdev = virFileSanitizePath(evdev); - if (def->type == VIR_DOMAIN_INPUT_TYPE_PASSTHROUGH && !def->source.evdev) { - virReportError(VIR_ERR_XML_ERROR, "%s", - _("Missing evdev path for input device passthrough")); - goto error; + if ((source = virXPathNode("./source", ctxt))) { + g_autofree char *evdev = virXMLPropString(source, "evdev"); + + if (evdev) + def->source.evdev = virFileSanitizePath(evdev); + + if (def->type == VIR_DOMAIN_INPUT_TYPE_PASSTHROUGH || + def->type == VIR_DOMAIN_INPUT_TYPE_LINUX) { + if (!def->source.evdev) { + virReportError(VIR_ERR_XML_ERROR, "%s", + _("Missing evdev path for input device")); + goto error; + } + } + + if (def->type == VIR_DOMAIN_INPUT_TYPE_LINUX) { + if (virXMLPropEnum(source, "grab", + virDomainInputSourceGrabTypeFromString, + VIR_XML_PROP_NONZERO, &def->source.grab) < 0) + goto error; + + if (virXMLPropTristateSwitch(source, "repeat", + VIR_XML_PROP_NONE, &def->source.repeat) < 0) + goto error; + } } if (virDomainVirtioOptionsParseXML(virXPathNode("./driver", ctxt), @@ -26906,9 +26936,12 @@ virDomainInputDefFormat(virBuffer *buf, { const char *type = virDomainInputTypeToString(def->type); const char *bus = virDomainInputBusTypeToString(def->bus); + const char *grab = virDomainInputSourceGrabTypeToString(def->source.grab); + const char *repeat = virTristateSwitchTypeToString(def->source.repeat); g_auto(virBuffer) attrBuf = VIR_BUFFER_INITIALIZER; g_auto(virBuffer) childBuf = VIR_BUFFER_INIT_CHILD(buf); g_auto(virBuffer) driverAttrBuf = VIR_BUFFER_INITIALIZER; + g_auto(virBuffer) sourceAttrBuf = VIR_BUFFER_INITIALIZER; /* don't format keyboard into migratable XML for backward compatibility */ if (flags & VIR_DOMAIN_DEF_FORMAT_MIGRATABLE && @@ -26928,7 +26961,9 @@ virDomainInputDefFormat(virBuffer *buf, return -1; } - virBufferAsprintf(&attrBuf, " type='%s' bus='%s'", type, bus); + virBufferAsprintf(&attrBuf, " type='%s'", type); + if (def->bus != VIR_DOMAIN_INPUT_BUS_NONE) + virBufferAsprintf(&attrBuf, " bus='%s'", bus); if (def->model) { const char *model = virDomainInputModelTypeToString(def->model); @@ -26946,7 +26981,15 @@ virDomainInputDefFormat(virBuffer *buf, virXMLFormatElement(&childBuf, "driver", &driverAttrBuf, NULL); - virBufferEscapeString(&childBuf, "<source evdev='%s'/>\n", def->source.evdev); + virBufferEscapeString(&sourceAttrBuf, " evdev='%s'", def->source.evdev); + + if (def->source.grab) + virBufferAsprintf(&sourceAttrBuf, " grab='%s'", grab); + if (def->source.repeat) + virBufferAsprintf(&sourceAttrBuf, " repeat='%s'", repeat); + + virXMLFormatElement(&childBuf, "source", &sourceAttrBuf, NULL); + virDomainDeviceInfoFormat(&childBuf, &def->info, flags); virXMLFormatElement(buf, "input", &attrBuf, &childBuf); diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h index 85c318d027..5107f0f3a1 100644 --- a/src/conf/domain_conf.h +++ b/src/conf/domain_conf.h @@ -1388,6 +1388,7 @@ typedef enum { VIR_DOMAIN_INPUT_TYPE_TABLET, VIR_DOMAIN_INPUT_TYPE_KBD, VIR_DOMAIN_INPUT_TYPE_PASSTHROUGH, + VIR_DOMAIN_INPUT_TYPE_LINUX, VIR_DOMAIN_INPUT_TYPE_LAST } virDomainInputType; @@ -1398,6 +1399,7 @@ typedef enum { VIR_DOMAIN_INPUT_BUS_XEN, VIR_DOMAIN_INPUT_BUS_PARALLELS, /* pseudo device for VNC in containers */ VIR_DOMAIN_INPUT_BUS_VIRTIO, + VIR_DOMAIN_INPUT_BUS_NONE, VIR_DOMAIN_INPUT_BUS_LAST } virDomainInputBus; @@ -1411,12 +1413,21 @@ typedef enum { VIR_DOMAIN_INPUT_MODEL_LAST } virDomainInputModel; +typedef enum { + VIR_DOMAIN_INPUT_SOURCE_GRAB_DEFAULT, + VIR_DOMAIN_INPUT_SOURCE_GRAB_ALL, + + VIR_DOMAIN_INPUT_SOURCE_GRAB_LAST +} virDomainInputSourceGrab; + struct _virDomainInputDef { int type; int bus; int model; /* virDomainInputModel */ struct { char *evdev; + virDomainInputSourceGrab grab; + virTristateSwitch repeat; } source; virDomainDeviceInfo info; virDomainVirtioOptions *virtio; @@ -3843,6 +3854,7 @@ VIR_ENUM_DECL(virDomainRedirdevBus); VIR_ENUM_DECL(virDomainInput); VIR_ENUM_DECL(virDomainInputBus); VIR_ENUM_DECL(virDomainInputModel); +VIR_ENUM_DECL(virDomainInputSourceGrab); VIR_ENUM_DECL(virDomainGraphics); VIR_ENUM_DECL(virDomainGraphicsListen); VIR_ENUM_DECL(virDomainGraphicsAuthConnected); diff --git a/src/conf/domain_validate.c b/src/conf/domain_validate.c index 686b9e8d16..05286e91d6 100644 --- a/src/conf/domain_validate.c +++ b/src/conf/domain_validate.c @@ -1961,6 +1961,14 @@ virDomainInputDefValidate(const virDomainInputDef *input) } break; + case VIR_DOMAIN_INPUT_TYPE_LINUX: + if (input->bus != VIR_DOMAIN_INPUT_BUS_NONE) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("input linux doesn't support bus element")); + return -1; + } + break; + case VIR_DOMAIN_INPUT_TYPE_LAST: default: virReportEnumRangeError(virDomainInputType, input->type); diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms index 9f761c2c00..044f95494e 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -475,6 +475,8 @@ virDomainInputBusTypeToString; virDomainInputDefFind; virDomainInputDefFree; virDomainInputDefGetPath; +virDomainInputSourceGrabTypeFromString; +virDomainInputSourceGrabTypeToString; virDomainInputTypeToString; virDomainIOMMUModelTypeFromString; virDomainIOMMUModelTypeToString; diff --git a/src/qemu/qemu_cgroup.c b/src/qemu/qemu_cgroup.c index 0e8835fb86..7845d74376 100644 --- a/src/qemu/qemu_cgroup.c +++ b/src/qemu/qemu_cgroup.c @@ -362,6 +362,7 @@ qemuSetupInputCgroup(virDomainObj *vm, switch (dev->type) { case VIR_DOMAIN_INPUT_TYPE_PASSTHROUGH: + case VIR_DOMAIN_INPUT_TYPE_LINUX: VIR_DEBUG("Process path '%s' for input device", dev->source.evdev); ret = virCgroupAllowDevicePath(priv->cgroup, dev->source.evdev, VIR_CGROUP_DEVICE_RW, false); @@ -385,6 +386,7 @@ qemuTeardownInputCgroup(virDomainObj *vm, switch (dev->type) { case VIR_DOMAIN_INPUT_TYPE_PASSTHROUGH: + case VIR_DOMAIN_INPUT_TYPE_LINUX: VIR_DEBUG("Process path '%s' for input device", dev->source.evdev); ret = virCgroupDenyDevicePath(priv->cgroup, dev->source.evdev, VIR_CGROUP_DEVICE_RWM, false); diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c index d7f1c715b6..1ca330b840 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c @@ -4018,6 +4018,7 @@ qemuBuildVirtioInputDevStr(const virDomainDef *def, return NULL; } break; + case VIR_DOMAIN_INPUT_TYPE_LINUX: case VIR_DOMAIN_INPUT_TYPE_LAST: default: virReportEnumRangeError(virDomainInputType, dev->type); diff --git a/src/qemu/qemu_domain_address.c b/src/qemu/qemu_domain_address.c index e66efb3d1f..5f76120943 100644 --- a/src/qemu/qemu_domain_address.c +++ b/src/qemu/qemu_domain_address.c @@ -973,6 +973,7 @@ qemuDomainDeviceCalculatePCIConnectFlags(virDomainDeviceDef *dev, case VIR_DOMAIN_INPUT_BUS_USB: case VIR_DOMAIN_INPUT_BUS_XEN: case VIR_DOMAIN_INPUT_BUS_PARALLELS: + case VIR_DOMAIN_INPUT_BUS_NONE: case VIR_DOMAIN_INPUT_BUS_LAST: return 0; } diff --git a/src/qemu/qemu_hotplug.c b/src/qemu/qemu_hotplug.c index 4344edc75b..860a9deb40 100644 --- a/src/qemu/qemu_hotplug.c +++ b/src/qemu/qemu_hotplug.c @@ -5805,6 +5805,7 @@ qemuDomainDetachPrepInput(virDomainObj *vm, case VIR_DOMAIN_INPUT_BUS_LAST: case VIR_DOMAIN_INPUT_BUS_USB: case VIR_DOMAIN_INPUT_BUS_VIRTIO: + case VIR_DOMAIN_INPUT_BUS_NONE: break; } diff --git a/src/qemu/qemu_validate.c b/src/qemu/qemu_validate.c index 774426bceb..5229dff1a7 100644 --- a/src/qemu/qemu_validate.c +++ b/src/qemu/qemu_validate.c @@ -4605,6 +4605,7 @@ qemuValidateDomainDeviceDefInput(const virDomainInputDef *input, case VIR_DOMAIN_INPUT_TYPE_MOUSE: case VIR_DOMAIN_INPUT_TYPE_TABLET: case VIR_DOMAIN_INPUT_TYPE_KBD: + case VIR_DOMAIN_INPUT_TYPE_LINUX: virReportError(VIR_ERR_CONFIG_UNSUPPORTED, _("virtio (non-)transitional models are not " "supported for input type=%s"), @@ -4650,6 +4651,11 @@ qemuValidateDomainDeviceDefInput(const virDomainInputDef *input, cap = QEMU_CAPS_VIRTIO_INPUT_HOST; ccwCap = QEMU_CAPS_LAST; break; + case VIR_DOMAIN_INPUT_TYPE_LINUX: + baseName = "input-linux"; + cap = QEMU_CAPS_INPUT_LINUX; + ccwCap = QEMU_CAPS_LAST; + break; case VIR_DOMAIN_INPUT_TYPE_LAST: default: virReportEnumRangeError(virDomainInputType, diff --git a/src/security/security_apparmor.c b/src/security/security_apparmor.c index a2a8435fe4..80176837ce 100644 --- a/src/security/security_apparmor.c +++ b/src/security/security_apparmor.c @@ -720,6 +720,7 @@ AppArmorSetInputLabel(virSecurityManager *mgr, switch ((virDomainInputType)input->type) { case VIR_DOMAIN_INPUT_TYPE_PASSTHROUGH: + case VIR_DOMAIN_INPUT_TYPE_LINUX: if (input->source.evdev == NULL) { virReportError(VIR_ERR_INTERNAL_ERROR, _("%s: passthrough input device has no source"), diff --git a/src/security/security_dac.c b/src/security/security_dac.c index e973964735..8e82c7f78d 100644 --- a/src/security/security_dac.c +++ b/src/security/security_dac.c @@ -1815,6 +1815,7 @@ virSecurityDACSetInputLabel(virSecurityManager *mgr, switch ((virDomainInputType)input->type) { case VIR_DOMAIN_INPUT_TYPE_PASSTHROUGH: + case VIR_DOMAIN_INPUT_TYPE_LINUX: if (virSecurityDACGetIds(seclabel, priv, &user, &group, NULL, NULL) < 0) return -1; @@ -1843,6 +1844,7 @@ virSecurityDACRestoreInputLabel(virSecurityManager *mgr, switch ((virDomainInputType)input->type) { case VIR_DOMAIN_INPUT_TYPE_PASSTHROUGH: + case VIR_DOMAIN_INPUT_TYPE_LINUX: ret = virSecurityDACRestoreFileLabel(mgr, input->source.evdev); break; diff --git a/src/security/security_selinux.c b/src/security/security_selinux.c index 29628d8953..42de0d5a98 100644 --- a/src/security/security_selinux.c +++ b/src/security/security_selinux.c @@ -1513,6 +1513,7 @@ virSecuritySELinuxSetInputLabel(virSecurityManager *mgr, switch ((virDomainInputType)input->type) { case VIR_DOMAIN_INPUT_TYPE_PASSTHROUGH: + case VIR_DOMAIN_INPUT_TYPE_LINUX: if (virSecuritySELinuxSetFilecon(mgr, input->source.evdev, seclabel->imagelabel, true) < 0) return -1; @@ -1543,6 +1544,7 @@ virSecuritySELinuxRestoreInputLabel(virSecurityManager *mgr, switch ((virDomainInputType)input->type) { case VIR_DOMAIN_INPUT_TYPE_PASSTHROUGH: + case VIR_DOMAIN_INPUT_TYPE_LINUX: rc = virSecuritySELinuxRestoreFileLabel(mgr, input->source.evdev, true); break; diff --git a/src/security/virt-aa-helper.c b/src/security/virt-aa-helper.c index 2331cc6648..aa1e2cdacc 100644 --- a/src/security/virt-aa-helper.c +++ b/src/security/virt-aa-helper.c @@ -1149,7 +1149,8 @@ get_files(vahControl * ctl) for (i = 0; i < ctl->def->ninputs; i++) { if (ctl->def->inputs[i] && - ctl->def->inputs[i]->type == VIR_DOMAIN_INPUT_TYPE_PASSTHROUGH) { + ctl->def->inputs[i]->type == VIR_DOMAIN_INPUT_TYPE_PASSTHROUGH || + ctl->def->inputs[i]->type == VIR_DOMAIN_INPUT_TYPE_LINUX) { if (vah_add_file(&buf, ctl->def->inputs[i]->source.evdev, "rw") != 0) goto cleanup; } diff --git a/tests/qemuxml2argvdata/input-linux.xml b/tests/qemuxml2argvdata/input-linux.xml new file mode 100644 index 0000000000..053557c19e --- /dev/null +++ b/tests/qemuxml2argvdata/input-linux.xml @@ -0,0 +1,24 @@ +<domain type='qemu'> + <name>QEMUGuest1</name> + <uuid>c7a5fdbd-edaf-9455-926a-d65c16db1809</uuid> + <memory unit='KiB'>219100</memory> + <currentMemory unit='KiB'>219100</currentMemory> + <vcpu placement='static'>1</vcpu> + <os> + <type arch='i686' machine='pc'>hvm</type> + <boot dev='hd'/> + </os> + <clock offset='utc'/> + <on_poweroff>destroy</on_poweroff> + <on_reboot>restart</on_reboot> + <on_crash>destroy</on_crash> + <devices> + <emulator>/usr/bin/qemu-system-i386</emulator> + <controller type='pci' index='0' model='pci-root'/> + <input type='linux'> + <source evdev='/dev/input/event1234' grab='all' repeat='on'/> + </input> + <input type='mouse' bus='ps2'/> + <input type='keyboard' bus='ps2'/> + </devices> +</domain> diff --git a/tests/qemuxml2xmloutdata/input-linux.xml b/tests/qemuxml2xmloutdata/input-linux.xml new file mode 120000 index 0000000000..84e1e79b51 --- /dev/null +++ b/tests/qemuxml2xmloutdata/input-linux.xml @@ -0,0 +1 @@ +../qemuxml2argvdata/input-linux.xml \ No newline at end of file -- 2.30.2

On Fri, Apr 30, 2021 at 02:16:16PM +0200, Kristina Hanicova wrote:
Signed-off-by: Kristina Hanicova <khanicov@redhat.com> --- docs/formatdomain.rst | 30 +++++++----- docs/schemas/domaincommon.rng | 20 ++++++++ src/conf/domain_audit.c | 1 + src/conf/domain_conf.c | 61 ++++++++++++++++++++---- src/conf/domain_conf.h | 12 +++++ src/conf/domain_validate.c | 8 ++++ src/libvirt_private.syms | 2 + src/qemu/qemu_cgroup.c | 2 + src/qemu/qemu_command.c | 1 + src/qemu/qemu_domain_address.c | 1 + src/qemu/qemu_hotplug.c | 1 + src/qemu/qemu_validate.c | 6 +++ src/security/security_apparmor.c | 1 + src/security/security_dac.c | 2 + src/security/security_selinux.c | 2 + src/security/virt-aa-helper.c | 3 +- tests/qemuxml2argvdata/input-linux.xml | 24 ++++++++++ tests/qemuxml2xmloutdata/input-linux.xml | 1 + 18 files changed, 157 insertions(+), 21 deletions(-) create mode 100644 tests/qemuxml2argvdata/input-linux.xml create mode 120000 tests/qemuxml2xmloutdata/input-linux.xml
diff --git a/docs/formatdomain.rst b/docs/formatdomain.rst index 282176c4f4..337d07dbfb 100644 --- a/docs/formatdomain.rst +++ b/docs/formatdomain.rst @@ -5728,26 +5728,34 @@ to provide a graphics tablet for absolute cursor movement. <input type='passthrough' bus='virtio'> <source evdev='/dev/input/event1'/> </input> + <input type='linux'> + <source evdev='/dev/input/event1234' grab='all' repeat='on'/> + </input>
evdev is implemented on FreeBSD too, I think this should be done as <input type='evdev'> <source dev='/dev/input/event1234' grab='all' repeat='on'/> </input> Regards, Daniel -- |: https://berrange.com -o- https://www.flickr.com/photos/dberrange :| |: https://libvirt.org -o- https://fstop138.berrange.com :| |: https://entangle-photo.org -o- https://www.instagram.com/dberrange :|

On Fri, 2021-04-30 at 14:16 +0200, Kristina Hanicova wrote:
Signed-off-by: Kristina Hanicova <khanicov@redhat.com> --- docs/formatdomain.rst | 30 +++++++----- docs/schemas/domaincommon.rng | 20 ++++++++ src/conf/domain_audit.c | 1 + src/conf/domain_conf.c | 61 ++++++++++++++++++++-- -- src/conf/domain_conf.h | 12 +++++ src/conf/domain_validate.c | 8 ++++ src/libvirt_private.syms | 2 + src/qemu/qemu_cgroup.c | 2 + src/qemu/qemu_command.c | 1 + src/qemu/qemu_domain_address.c | 1 + src/qemu/qemu_hotplug.c | 1 + src/qemu/qemu_validate.c | 6 +++ src/security/security_apparmor.c | 1 + src/security/security_dac.c | 2 + src/security/security_selinux.c | 2 + src/security/virt-aa-helper.c | 3 +- tests/qemuxml2argvdata/input-linux.xml | 24 ++++++++++ tests/qemuxml2xmloutdata/input-linux.xml | 1 + 18 files changed, 157 insertions(+), 21 deletions(-) create mode 100644 tests/qemuxml2argvdata/input-linux.xml create mode 120000 tests/qemuxml2xmloutdata/input-linux.xml
diff --git a/docs/formatdomain.rst b/docs/formatdomain.rst index 282176c4f4..337d07dbfb 100644 --- a/docs/formatdomain.rst +++ b/docs/formatdomain.rst @@ -5728,26 +5728,34 @@ to provide a graphics tablet for absolute cursor movement. <input type='passthrough' bus='virtio'> <source evdev='/dev/input/event1'/> </input> + <input type='linux'> + <source evdev='/dev/input/event1234' grab='all' repeat='on'/> + </input> </devices> ... ``input`` The ``input`` element has one mandatory attribute, the ``type`` whose value - can be 'mouse', 'tablet', ( :since:`since 1.2.2` ) 'keyboard' or ( - :since:`since 1.3.0` ) 'passthrough'. The tablet provides absolute cursor - movement, while the mouse uses relative movement. The optional ``bus`` - attribute can be used to refine the exact device type. It takes values "xen" - (paravirtualized), "ps2" and "usb" or ( :since:`since 1.3.0` ) "virtio". + can be 'mouse', 'tablet', ( :since:`since 1.2.2` ) 'keyboard', ( + :since:`since 1.3.0` ) 'passthrough' or ( :since:`since 7.4.0` ) 'linux'. + The tablet provides absolute cursor movement, while the mouse uses relative + movement. The optional ``bus`` attribute can be used to refine the exact + device type. It takes values "xen" (paravirtualized), "ps2" and "usb" or ( + :since:`since 1.3.0` ) "virtio". The ``input`` element has an optional sub-element ``<address>`` which can tie the device to a particular PCI slot, `documented above <#elementsAddress>`__. On S390, ``address`` can be used to provide a CCW address for an input device ( -:since:`since 4.2.0` ). For type ``passthrough``, the mandatory sub- element -``source`` must have an ``evdev`` attribute containing the absolute path to the -event device passed through to guests. (KVM only) :since:`Since 5.2.0` , the -``input`` element accepts a ``model`` attribute which has the values 'virtio', -'virtio-transitional' and 'virtio-non-transitional'. See `Virtio transitional -devices <#elementsVirtioTransitional>`__ for more details. +:since:`since 4.2.0` ). For types ``passthrough`` and ``linux``, the mandatory +sub-element ``source`` must have an ``evdev`` attribute containing the absolute +path to the event device passed through to guests. For type ``linux``, +``sorce`` can have two optional attributes ``grab`` with value 'all' which when
sorce -> source
+enabled grabs all input devices instead of just one and ``repeat`` with value +'on' to enable auto-repeat events ( :since:`Since 7.4.0` ) (KVM only)
I think this is supposed to be the end of the sentence, so it looks like w'ere missing a period? It's a rather long sentence, consider splitting it in two. Jonathon

Resolves: https://gitlab.com/libvirt/libvirt/-/issues/142 Signed-off-by: Kristina Hanicova <khanicov@redhat.com> --- src/qemu/qemu_command.c | 26 +++++++++++++- .../input-linux.x86_64-latest.args | 34 +++++++++++++++++++ 2 files changed, 59 insertions(+), 1 deletion(-) create mode 100644 tests/qemuxml2argvdata/input-linux.x86_64-latest.args diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c index 1ca330b840..a8ee94f212 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c @@ -4066,6 +4066,23 @@ qemuBuildUSBInputDevStr(const virDomainDef *def, } +static char * +qemuBuildObjectInputDevStr(virDomainInputDef *dev) +{ + g_auto(virBuffer) buf = VIR_BUFFER_INITIALIZER; + + virBufferAsprintf(&buf, "input-linux,id=%s,evdev=", dev->info.alias); + virQEMUBuildBufferEscapeComma(&buf, dev->source.evdev); + + if (dev->source.grab) + virBufferAddLit(&buf, ",grab_all=on"); + if (dev->source.repeat) + virBufferAddLit(&buf, ",repeat=on"); + + return virBufferContentAndReset(&buf); +} + + int qemuBuildInputDevStr(char **devstr, const virDomainDef *def, @@ -4082,6 +4099,10 @@ qemuBuildInputDevStr(char **devstr, if (!(*devstr = qemuBuildVirtioInputDevStr(def, input, qemuCaps))) return -1; break; + case VIR_DOMAIN_INPUT_BUS_NONE: + if (!(*devstr = qemuBuildObjectInputDevStr(input))) + return -1; + break; } return 0; } @@ -4105,7 +4126,10 @@ qemuBuildInputCommandLine(virCommand *cmd, return -1; if (devstr) { - virCommandAddArg(cmd, "-device"); + if (input->type == VIR_DOMAIN_INPUT_TYPE_LINUX) + virCommandAddArg(cmd, "-object"); + else + virCommandAddArg(cmd, "-device"); virCommandAddArg(cmd, devstr); } } diff --git a/tests/qemuxml2argvdata/input-linux.x86_64-latest.args b/tests/qemuxml2argvdata/input-linux.x86_64-latest.args new file mode 100644 index 0000000000..23c8eea7a4 --- /dev/null +++ b/tests/qemuxml2argvdata/input-linux.x86_64-latest.args @@ -0,0 +1,34 @@ +LC_ALL=C \ +PATH=/bin \ +HOME=/tmp/lib/domain--1-QEMUGuest1 \ +USER=test \ +LOGNAME=test \ +XDG_DATA_HOME=/tmp/lib/domain--1-QEMUGuest1/.local/share \ +XDG_CACHE_HOME=/tmp/lib/domain--1-QEMUGuest1/.cache \ +XDG_CONFIG_HOME=/tmp/lib/domain--1-QEMUGuest1/.config \ +/usr/bin/qemu-system-i386 \ +-name guest=QEMUGuest1,debug-threads=on \ +-S \ +-object '{"qom-type":"secret","id":"masterKey0","format":"raw","file":"/tmp/lib/domain--1-QEMUGuest1/master-key.aes"}' \ +-machine pc,accel=tcg,usb=off,dump-guest-core=off,memory-backend=pc.ram \ +-cpu qemu64 \ +-m 214 \ +-object '{"qom-type":"memory-backend-ram","id":"pc.ram","size":224395264}' \ +-overcommit mem-lock=off \ +-smp 1,sockets=1,cores=1,threads=1 \ +-uuid c7a5fdbd-edaf-9455-926a-d65c16db1809 \ +-display none \ +-no-user-config \ +-nodefaults \ +-chardev socket,id=charmonitor,fd=1729,server=on,wait=off \ +-mon chardev=charmonitor,id=monitor,mode=control \ +-rtc base=utc \ +-no-shutdown \ +-no-acpi \ +-boot strict=on \ +-device piix3-usb-uhci,id=usb,bus=pci.0,addr=0x1.0x2 \ +-object input-linux,id=input0,evdev=/dev/input/event1234,grab_all=on,repeat=on \ +-audiodev id=audio1,driver=none \ +-device virtio-balloon-pci,id=balloon0,bus=pci.0,addr=0x2 \ +-sandbox on,obsolete=deny,elevateprivileges=deny,spawn=deny,resourcecontrol=deny \ +-msg timestamp=on -- 2.30.2

On Fri, Apr 30, 2021 at 14:16:17 +0200, Kristina Hanicova wrote:
Resolves: https://gitlab.com/libvirt/libvirt/-/issues/142
Signed-off-by: Kristina Hanicova <khanicov@redhat.com> --- src/qemu/qemu_command.c | 26 +++++++++++++- .../input-linux.x86_64-latest.args | 34 +++++++++++++++++++ 2 files changed, 59 insertions(+), 1 deletion(-) create mode 100644 tests/qemuxml2argvdata/input-linux.x86_64-latest.args
diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c index 1ca330b840..a8ee94f212 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c @@ -4066,6 +4066,23 @@ qemuBuildUSBInputDevStr(const virDomainDef *def, }
+static char * +qemuBuildObjectInputDevStr(virDomainInputDef *dev) +{ + g_auto(virBuffer) buf = VIR_BUFFER_INITIALIZER; + + virBufferAsprintf(&buf, "input-linux,id=%s,evdev=", dev->info.alias);
NACK to this. New code formatting -object commandline MUST use the JSON representation.
+ virQEMUBuildBufferEscapeComma(&buf, dev->source.evdev); + + if (dev->source.grab) + virBufferAddLit(&buf, ",grab_all=on"); + if (dev->source.repeat) + virBufferAddLit(&buf, ",repeat=on"); + + return virBufferContentAndReset(&buf); +} + + int qemuBuildInputDevStr(char **devstr, const virDomainDef *def, @@ -4082,6 +4099,10 @@ qemuBuildInputDevStr(char **devstr, if (!(*devstr = qemuBuildVirtioInputDevStr(def, input, qemuCaps))) return -1; break; + case VIR_DOMAIN_INPUT_BUS_NONE: + if (!(*devstr = qemuBuildObjectInputDevStr(input))) + return -1; + break; } return 0; } @@ -4105,7 +4126,10 @@ qemuBuildInputCommandLine(virCommand *cmd, return -1;
if (devstr) { - virCommandAddArg(cmd, "-device"); + if (input->type == VIR_DOMAIN_INPUT_TYPE_LINUX) + virCommandAddArg(cmd, "-object"); + else + virCommandAddArg(cmd, "-device"); virCommandAddArg(cmd, devstr); } } diff --git a/tests/qemuxml2argvdata/input-linux.x86_64-latest.args b/tests/qemuxml2argvdata/input-linux.x86_64-latest.args new file mode 100644 index 0000000000..23c8eea7a4 --- /dev/null +++ b/tests/qemuxml2argvdata/input-linux.x86_64-latest.args
This test isn't enabled, because if it were ...
@@ -0,0 +1,34 @@ +LC_ALL=C \ +PATH=/bin \ +HOME=/tmp/lib/domain--1-QEMUGuest1 \ +USER=test \ +LOGNAME=test \ +XDG_DATA_HOME=/tmp/lib/domain--1-QEMUGuest1/.local/share \ +XDG_CACHE_HOME=/tmp/lib/domain--1-QEMUGuest1/.cache \ +XDG_CONFIG_HOME=/tmp/lib/domain--1-QEMUGuest1/.config \ +/usr/bin/qemu-system-i386 \ +-name guest=QEMUGuest1,debug-threads=on \ +-S \ +-object '{"qom-type":"secret","id":"masterKey0","format":"raw","file":"/tmp/lib/domain--1-QEMUGuest1/master-key.aes"}' \
[1]
+-machine pc,accel=tcg,usb=off,dump-guest-core=off,memory-backend=pc.ram \ +-cpu qemu64 \ +-m 214 \ +-object '{"qom-type":"memory-backend-ram","id":"pc.ram","size":224395264}' \ +-overcommit mem-lock=off \ +-smp 1,sockets=1,cores=1,threads=1 \ +-uuid c7a5fdbd-edaf-9455-926a-d65c16db1809 \ +-display none \ +-no-user-config \ +-nodefaults \ +-chardev socket,id=charmonitor,fd=1729,server=on,wait=off \ +-mon chardev=charmonitor,id=monitor,mode=control \ +-rtc base=utc \ +-no-shutdown \ +-no-acpi \ +-boot strict=on \ +-device piix3-usb-uhci,id=usb,bus=pci.0,addr=0x1.0x2 \ +-object input-linux,id=input0,evdev=/dev/input/event1234,grab_all=on,repeat=on \
... this would fail. The new code must format the -object argumetns as JSON (such as [1]) and use the appropriate function for backward\ compatibility.
+-audiodev id=audio1,driver=none \ +-device virtio-balloon-pci,id=balloon0,bus=pci.0,addr=0x2 \ +-sandbox on,obsolete=deny,elevateprivileges=deny,spawn=deny,resourcecontrol=deny \ +-msg timestamp=on -- 2.30.2
participants (4)
-
Daniel P. Berrangé
-
Jonathon Jongsma
-
Kristina Hanicova
-
Peter Krempa