8fa411
From: =?UTF-8?q?J=C3=A1n=20Tomko?= <jtomko@redhat.com>
8fa411
Date: Fri, 8 Apr 2016 10:46:41 +0200
8fa411
Subject: [PATCH] qemu: support virt-2.6 machine type on arm
8fa411
8fa411
Some places already check for "virt-" prefix as well as plain "virt".
8fa411
virQEMUCapsHasPCIMultiBus did not, resulting in multiple PCI devices
8fa411
having assigned the same unnumbered "pci" alias.
8fa411
8fa411
Add a test for the "virt-2.6" machine type which also omits the
8fa411
<model type='virtio'/> in <interface>, to check if
8fa411
qemuDomainDefaultNetModel works too.
8fa411
8fa411
https://bugzilla.redhat.com/show_bug.cgi?id=1325085
8fa411
(cherry picked from commit f06ca25d235433f9139cbfb3d5d9eae7409156b9)
8fa411
---
8fa411
 src/qemu/qemu_capabilities.c                       |  3 +-
8fa411
 src/qemu/qemu_domain.c                             |  3 +-
8fa411
 ...l2argv-aarch64-virt-2.6-virtio-pci-default.args | 37 +++++++++++++++++
8fa411
 ...ml2argv-aarch64-virt-2.6-virtio-pci-default.xml | 47 ++++++++++++++++++++++
8fa411
 tests/qemuxml2argvtest.c                           |  6 +++
8fa411
 5 files changed, 94 insertions(+), 2 deletions(-)
8fa411
 create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-aarch64-virt-2.6-virtio-pci-default.args
8fa411
 create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-aarch64-virt-2.6-virtio-pci-default.xml
8fa411
8fa411
diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c
8fa411
index 2823843..57e2056 100644
8fa411
--- a/src/qemu/qemu_capabilities.c
8fa411
+++ b/src/qemu/qemu_capabilities.c
8fa411
@@ -2172,7 +2172,8 @@ bool virQEMUCapsHasPCIMultiBus(virQEMUCapsPtr qemuCaps,
8fa411
         /* If 'virt' supports PCI, it supports multibus.
8fa411
          * No extra conditions here for simplicity.
8fa411
          */
8fa411
-        if (STREQ(def->os.machine, "virt"))
8fa411
+        if (STREQ(def->os.machine, "virt") ||
8fa411
+            STRPREFIX(def->os.machine, "virt-"))
8fa411
             return true;
8fa411
     }
8fa411
 
8fa411
diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c
8fa411
index f38b0f3..d9d5041 100644
8fa411
--- a/src/qemu/qemu_domain.c
8fa411
+++ b/src/qemu/qemu_domain.c
8fa411
@@ -1479,7 +1479,8 @@ qemuDomainDefaultNetModel(const virDomainDef *def,
8fa411
         if (STREQ(def->os.machine, "versatilepb"))
8fa411
             return "smc91c111";
8fa411
 
8fa411
-        if (STREQ(def->os.machine, "virt"))
8fa411
+        if (STREQ(def->os.machine, "virt") ||
8fa411
+            STRPREFIX(def->os.machine, "virt-"))
8fa411
             return "virtio";
8fa411
 
8fa411
         /* Incomplete. vexpress (and a few others) use this, but not all
8fa411
diff --git a/tests/qemuxml2argvdata/qemuxml2argv-aarch64-virt-2.6-virtio-pci-default.args b/tests/qemuxml2argvdata/qemuxml2argv-aarch64-virt-2.6-virtio-pci-default.args
8fa411
new file mode 100644
8fa411
index 0000000..93c181d
8fa411
--- /dev/null
8fa411
+++ b/tests/qemuxml2argvdata/qemuxml2argv-aarch64-virt-2.6-virtio-pci-default.args
8fa411
@@ -0,0 +1,37 @@
8fa411
+LC_ALL=C \
8fa411
+PATH=/bin \
8fa411
+HOME=/home/test \
8fa411
+USER=test \
8fa411
+LOGNAME=test \
8fa411
+QEMU_AUDIO_DRV=none \
8fa411
+/usr/bin/qemu-system-aarch64 \
8fa411
+-name aarch64test \
8fa411
+-S \
8fa411
+-M virt-2.6 \
8fa411
+-cpu cortex-a53 \
8fa411
+-m 1024 \
8fa411
+-smp 1 \
8fa411
+-uuid 496d7ea8-9739-544b-4ebd-ef08be936e8b \
8fa411
+-nographic \
8fa411
+-nodefconfig \
8fa411
+-nodefaults \
8fa411
+-monitor unix:/tmp/lib/domain--1-aarch64test/monitor.sock,server,nowait \
8fa411
+-boot c \
8fa411
+-kernel /aarch64.kernel \
8fa411
+-initrd /aarch64.initrd \
8fa411
+-append 'earlyprintk console=ttyAMA0,115200n8 rw root=/dev/vda rootwait' \
8fa411
+-dtb /aarch64.dtb \
8fa411
+-device i82801b11-bridge,id=pci.1,bus=pcie.0,addr=0x1 \
8fa411
+-device pci-bridge,chassis_nr=2,id=pci.2,bus=pci.1,addr=0x1 \
8fa411
+-device virtio-serial-device,id=virtio-serial0 \
8fa411
+-usb \
8fa411
+-drive file=/aarch64.raw,format=raw,if=none,id=drive-virtio-disk0 \
8fa411
+-device virtio-blk-device,drive=drive-virtio-disk0,id=virtio-disk0 \
8fa411
+-device virtio-net-device,vlan=0,id=net0,mac=52:54:00:09:a4:37 \
8fa411
+-net user,vlan=0,name=hostnet0 \
8fa411
+-serial pty \
8fa411
+-chardev pty,id=charconsole1 \
8fa411
+-device virtconsole,chardev=charconsole1,id=console1 \
8fa411
+-device virtio-balloon-device,id=balloon0 \
8fa411
+-object rng-random,id=objrng0,filename=/dev/random \
8fa411
+-device virtio-rng-device,rng=objrng0,id=rng0
8fa411
diff --git a/tests/qemuxml2argvdata/qemuxml2argv-aarch64-virt-2.6-virtio-pci-default.xml b/tests/qemuxml2argvdata/qemuxml2argv-aarch64-virt-2.6-virtio-pci-default.xml
8fa411
new file mode 100644
8fa411
index 0000000..e745101
8fa411
--- /dev/null
8fa411
+++ b/tests/qemuxml2argvdata/qemuxml2argv-aarch64-virt-2.6-virtio-pci-default.xml
8fa411
@@ -0,0 +1,47 @@
8fa411
+<domain type="qemu">
8fa411
+  <name>aarch64test</name>
8fa411
+  <uuid>496d7ea8-9739-544b-4ebd-ef08be936e8b</uuid>
8fa411
+  <memory>1048576</memory>
8fa411
+  <currentMemory>1048576</currentMemory>
8fa411
+  <vcpu placement='static'>1</vcpu>
8fa411
+  <os>
8fa411
+    <type arch="aarch64" machine="virt-2.6">hvm</type>
8fa411
+    <kernel>/aarch64.kernel</kernel>
8fa411
+    <initrd>/aarch64.initrd</initrd>
8fa411
+    <dtb>/aarch64.dtb</dtb>
8fa411
+    <cmdline>earlyprintk console=ttyAMA0,115200n8 rw root=/dev/vda rootwait</cmdline>
8fa411
+  </os>
8fa411
+  <features>
8fa411
+    <acpi/>
8fa411
+    <apic/>
8fa411
+    <pae/>
8fa411
+  </features>
8fa411
+  <cpu match='exact'>
8fa411
+    <model>cortex-a53</model>
8fa411
+  </cpu>
8fa411
+  <clock offset="utc"/>
8fa411
+  <on_poweroff>destroy</on_poweroff>
8fa411
+  <on_reboot>restart</on_reboot>
8fa411
+  <on_crash>restart</on_crash>
8fa411
+  <devices>
8fa411
+    <emulator>/usr/bin/qemu-system-aarch64</emulator>
8fa411
+    <disk type='file' device='disk'>
8fa411
+      <source file='/aarch64.raw'/>
8fa411
+      <target dev='vda' bus='virtio'/>
8fa411
+    </disk>
8fa411
+    <interface type='user'>
8fa411
+      <mac address='52:54:00:09:a4:37'/>
8fa411
+    </interface>
8fa411
+    <console type='pty'/>
8fa411
+    <console type='pty'>
8fa411
+      <target type='virtio' port='0'/>
8fa411
+    </console>
8fa411
+    <memballoon model='virtio'/>
8fa411
+    
8fa411
+      This actually doesn't work in practice because vexpress only has
8fa411
+      4 virtio slots available, rng makes 5 -->
8fa411
+    <rng model='virtio'>
8fa411
+      <backend model='random'>/dev/random</backend>
8fa411
+    </rng>
8fa411
+  </devices>
8fa411
+</domain>
8fa411
diff --git a/tests/qemuxml2argvtest.c b/tests/qemuxml2argvtest.c
8fa411
index e9b8d64..d1b9e98 100644
8fa411
--- a/tests/qemuxml2argvtest.c
8fa411
+++ b/tests/qemuxml2argvtest.c
8fa411
@@ -1661,6 +1661,12 @@ mymain(void)
8fa411
             QEMU_CAPS_DEVICE_VIRTIO_RNG, QEMU_CAPS_OBJECT_RNG_RANDOM,
8fa411
             QEMU_CAPS_OBJECT_GPEX, QEMU_CAPS_DEVICE_PCI_BRIDGE,
8fa411
             QEMU_CAPS_DEVICE_DMI_TO_PCI_BRIDGE);
8fa411
+    DO_TEST("aarch64-virt-2.6-virtio-pci-default",
8fa411
+            QEMU_CAPS_NODEFCONFIG, QEMU_CAPS_DTB,
8fa411
+            QEMU_CAPS_DEVICE_VIRTIO_MMIO,
8fa411
+            QEMU_CAPS_DEVICE_VIRTIO_RNG, QEMU_CAPS_OBJECT_RNG_RANDOM,
8fa411
+            QEMU_CAPS_OBJECT_GPEX, QEMU_CAPS_DEVICE_PCI_BRIDGE,
8fa411
+            QEMU_CAPS_DEVICE_DMI_TO_PCI_BRIDGE);
8fa411
     /* Example of using virtio-pci with no explicit PCI controller
8fa411
        but with manual PCI addresses */
8fa411
     DO_TEST("aarch64-virtio-pci-manual-addresses",