[virt-tools-list] [virt-manager PATCH 4/5] virt-install: add a new guest feature GIC for ARM guests
Pavel Hrdina
phrdina at redhat.com
Fri Jun 10 17:30:39 UTC 2016
Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=1334857
Signed-off-by: Pavel Hrdina <phrdina at redhat.com>
---
man/virt-install.pod | 5 +++
.../compare/virt-install-aarch64-kvm-gic.xml | 33 ++++++++++++++++++
tests/clitest.py | 1 +
virtinst/cli.py | 39 ++++++++++++----------
virtinst/guest.py | 16 +++++++++
5 files changed, 77 insertions(+), 17 deletions(-)
create mode 100644 tests/cli-test-xml/compare/virt-install-aarch64-kvm-gic.xml
diff --git a/man/virt-install.pod b/man/virt-install.pod
index 0537693..8054f68 100644
--- a/man/virt-install.pod
+++ b/man/virt-install.pod
@@ -254,6 +254,11 @@ Allow the KVM hypervisor signature to be hidden from the guest
Notify the guest that the host supports paravirtual spinlocks for example by exposing the pvticketlocks mechanism.
+=item B<--features gic=2>
+
+This is relevant only for aarch64 architecture. Possible values are "host" or
+version number.
+
=back
Use --features=? to see a list of all available sub options. Complete details at L<http://libvirt.org/formatdomain.html#elementsFeatures>
diff --git a/tests/cli-test-xml/compare/virt-install-aarch64-kvm-gic.xml b/tests/cli-test-xml/compare/virt-install-aarch64-kvm-gic.xml
new file mode 100644
index 0000000..189373d
--- /dev/null
+++ b/tests/cli-test-xml/compare/virt-install-aarch64-kvm-gic.xml
@@ -0,0 +1,33 @@
+<domain type="kvm">
+ <name>foobar</name>
+ <uuid>00000000-1111-2222-3333-444444444444</uuid>
+ <memory>65536</memory>
+ <currentMemory>65536</currentMemory>
+ <vcpu>1</vcpu>
+ <os>
+ <type arch="aarch64" machine="virt">hvm</type>
+ <loader readonly="yes" type="pflash">/usr/share/AAVMF/AAVMF_CODE.fd</loader>
+ <boot dev="hd"/>
+ </os>
+ <features>
+ <gic version="host"/>
+ </features>
+ <cpu mode="host-passthrough"/>
+ <clock offset="utc"/>
+ <on_poweroff>destroy</on_poweroff>
+ <on_reboot>restart</on_reboot>
+ <on_crash>restart</on_crash>
+ <devices>
+ <emulator>/usr/bin/qemu-system-aarch64</emulator>
+ <interface type="bridge">
+ <source bridge="eth0"/>
+ <mac address="00:11:22:33:44:55"/>
+ <model type="virtio"/>
+ </interface>
+ <console type="pty"/>
+ <channel type="unix">
+ <source mode="bind"/>
+ <target type="virtio" name="org.qemu.guest_agent.0"/>
+ </channel>
+ </devices>
+</domain>
diff --git a/tests/clitest.py b/tests/clitest.py
index 5d26078..376a17e 100644
--- a/tests/clitest.py
+++ b/tests/clitest.py
@@ -711,6 +711,7 @@ c.add_compare("--arch aarch64 --machine virt --boot kernel=/f19-arm.kernel,initr
c.add_compare("--arch aarch64 --boot kernel=/f19-arm.kernel,initrd=/f19-arm.initrd,kernel_args=\"console=ttyAMA0,1234 rw root=/dev/vda3\",extra_args=foo --disk %(EXISTIMG1)s", "aarch64-machdefault")
c.add_compare("--arch aarch64 --cdrom %(EXISTIMG2)s --boot loader=CODE.fd,nvram_template=VARS.fd --disk %(EXISTIMG1)s --cpu none --events on_crash=preserve,on_reboot=destroy,on_poweroff=restart", "aarch64-cdrom")
c.add_compare("--connect %(URI-KVM-AARCH64)s --disk %(EXISTIMG1)s --import --os-variant fedora21", "aarch64-kvm-import")
+c.add_compare("--connect %(URI-KVM-AARCH64)s --disk none --os-variant fedora23 --features gic=host", "aarch64-kvm-gic")
# ppc64 tests
c.add_compare("--arch ppc64 --machine pseries --boot network --disk %(EXISTIMG1)s --disk device=cdrom --os-variant fedora20 --network none", "ppc64-pseries-f20")
diff --git a/virtinst/cli.py b/virtinst/cli.py
index 7924b14..1f486b2 100644
--- a/virtinst/cli.py
+++ b/virtinst/cli.py
@@ -54,7 +54,6 @@ from .devicetpm import VirtualTPMDevice
from .devicevideo import VirtualVideoDevice
from .devicewatchdog import VirtualWatchdog
from .domainblkiotune import DomainBlkiotune
-from .domainfeatures import DomainFeatures
from .domainmemorybacking import DomainMemorybacking
from .domainmemorytune import DomainMemorytune
from .domainnumatune import DomainNumatune
@@ -1518,32 +1517,38 @@ class ParserSecurity(VirtCLIParser):
class ParserFeatures(VirtCLIParser):
def _init_params(self):
- self.objclass = DomainFeatures
- self.set_param("acpi", "acpi", is_onoff=True)
- self.set_param("apic", "apic", is_onoff=True)
- self.set_param("pae", "pae", is_onoff=True)
- self.set_param("privnet", "privnet",
+ self.set_param("features.acpi", "acpi", is_onoff=True)
+ self.set_param("features.apic", "apic", is_onoff=True)
+ self.set_param("features.pae", "pae", is_onoff=True)
+ self.set_param("features.privnet", "privnet",
is_onoff=True)
- self.set_param("hap", "hap",
+ self.set_param("features.hap", "hap",
is_onoff=True)
- self.set_param("viridian", "viridian",
+ self.set_param("features.viridian", "viridian",
is_onoff=True)
- self.set_param("eoi", "eoi", is_onoff=True)
- self.set_param("pmu", "pmu", is_onoff=True)
+ self.set_param("features.eoi", "eoi", is_onoff=True)
+ self.set_param("features.pmu", "pmu", is_onoff=True)
- self.set_param("hyperv_vapic", "hyperv_vapic",
+ self.set_param("features.hyperv_vapic", "hyperv_vapic",
is_onoff=True)
- self.set_param("hyperv_relaxed", "hyperv_relaxed",
+ self.set_param("features.hyperv_relaxed", "hyperv_relaxed",
is_onoff=True)
- self.set_param("hyperv_spinlocks", "hyperv_spinlocks",
+ self.set_param("features.hyperv_spinlocks", "hyperv_spinlocks",
is_onoff=True)
- self.set_param("hyperv_spinlocks_retries",
+ self.set_param("features.hyperv_spinlocks_retries",
"hyperv_spinlocks_retries")
- self.set_param("vmport", "vmport", is_onoff=True)
- self.set_param("kvm_hidden", "kvm_hidden", is_onoff=True)
- self.set_param("pvspinlock", "pvspinlock", is_onoff=True)
+ self.set_param("features.vmport", "vmport", is_onoff=True)
+ self.set_param("features.kvm_hidden", "kvm_hidden", is_onoff=True)
+ self.set_param("features.pvspinlock", "pvspinlock", is_onoff=True)
+
+ def set_gic(opts, inst, cliname, val):
+ ignore = opts
+ ignore = cliname
+ inst.set_gic_version(val)
+
+ self.set_param(None, "gic", setter_cb=set_gic)
###################
diff --git a/virtinst/guest.py b/virtinst/guest.py
index 490b90b..544a65a 100644
--- a/virtinst/guest.py
+++ b/virtinst/guest.py
@@ -587,6 +587,22 @@ class Guest(XMLBuilder):
self.os.loader = path
+ def set_gic_version(self, val):
+ """
+ Checks and sets GIC version for ARM guest.
+ """
+
+ domcaps = DomainCapabilities.build_from_guest(self)
+
+ if not domcaps.supports_gic(self):
+ raise RuntimeError(_("GIC is not supported."))
+
+ if val != "host" and val not in domcaps.get_gic_versions():
+ raise RuntimeError(_("GIC version '%s' is not supported") % val)
+
+ self.features.gic_version = val
+
+
###################
# Device defaults #
###################
--
2.8.4
More information about the virt-tools-list
mailing list