Daniel P. Berrange 11755d
From 7a73b81f1021c76d02fe54f927cd033fe949590f Mon Sep 17 00:00:00 2001
2daa92
From: Cole Robinson <crobinso@redhat.com>
Daniel P. Berrange 11755d
Date: Fri, 30 Aug 2013 12:41:35 -0400
Daniel P. Berrange 11755d
Subject: [PATCH 7/8] qemu: Fix networking for ARM guests
2daa92
2daa92
Similar to the chardev bit, ARM boards depend on the old style '-net nic'
2daa92
for actually instantiating net devices. But we can't block out
2daa92
-netdev altogether since it's needed for upcoming virtio support.
2daa92
2daa92
And add tests for working ARM XML with console, disk, and networking.
2daa92
---
2daa92
 src/qemu/qemu_command.c                            | 34 ++++++++++++++++------
2daa92
 src/qemu/qemu_domain.c                             | 20 +++++++++++--
2daa92
 .../qemuxml2argv-arm-vexpressa9-basic.args         |  8 +++++
2daa92
 .../qemuxml2argv-arm-vexpressa9-basic.xml          | 34 ++++++++++++++++++++++
2daa92
 tests/qemuxml2argvtest.c                           |  3 ++
2daa92
 5 files changed, 88 insertions(+), 11 deletions(-)
2daa92
 create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-arm-vexpressa9-basic.args
2daa92
 create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-arm-vexpressa9-basic.xml
2daa92
2daa92
diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c
Daniel P. Berrange 11755d
index 6733709..787381b 100644
2daa92
--- a/src/qemu/qemu_command.c
2daa92
+++ b/src/qemu/qemu_command.c
2daa92
@@ -417,6 +417,26 @@ cleanup:
2daa92
     return ret;
2daa92
 }
2daa92
 
2daa92
+static bool
2daa92
+qemuDomainSupportsNicdev(virDomainDefPtr def, virQEMUCapsPtr qemuCaps)
2daa92
+{
2daa92
+    if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE))
2daa92
+        return false;
2daa92
+
2daa92
+    /* arm boards require legacy -net nic */
2daa92
+    if (def->os.arch == VIR_ARCH_ARMV7L)
2daa92
+        return false;
2daa92
+
2daa92
+    return true;
2daa92
+}
2daa92
+
2daa92
+static bool
2daa92
+qemuDomainSupportsNetdev(virDomainDefPtr def, virQEMUCapsPtr qemuCaps)
2daa92
+{
2daa92
+    if (!qemuDomainSupportsNicdev(def, qemuCaps))
2daa92
+        return false;
2daa92
+    return virQEMUCapsGet(qemuCaps, QEMU_CAPS_NETDEV);
2daa92
+}
2daa92
 
2daa92
 /**
2daa92
  * qemuOpenVhostNet:
2daa92
@@ -454,8 +474,7 @@ qemuOpenVhostNet(virDomainDefPtr def,
2daa92
      * option), don't try to open the device.
2daa92
      */
2daa92
     if (!(virQEMUCapsGet(qemuCaps, QEMU_CAPS_VHOST_NET) &&
2daa92
-          virQEMUCapsGet(qemuCaps, QEMU_CAPS_NETDEV) &&
2daa92
-          virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE))) {
2daa92
+          qemuDomainSupportsNetdev(def, qemuCaps))) {
2daa92
         if (net->driver.virtio.name == VIR_DOMAIN_NET_BACKEND_TYPE_VHOST) {
2daa92
             virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
2daa92
                            "%s", _("vhost-net is not supported with "
Daniel P. Berrange 11755d
@@ -7312,8 +7331,7 @@ qemuBuildInterfaceCommandLine(virCommandPtr cmd,
2daa92
      *
2daa92
      * NB, no support for -netdev without use of -device
2daa92
      */
2daa92
-    if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_NETDEV) &&
2daa92
-        virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE)) {
2daa92
+    if (qemuDomainSupportsNetdev(def, qemuCaps)) {
2daa92
         if (!(host = qemuBuildHostNetStr(net, driver,
2daa92
                                          ',', vlan,
2daa92
                                          tapfdName, tapfdSize,
Daniel P. Berrange 11755d
@@ -7321,7 +7339,7 @@ qemuBuildInterfaceCommandLine(virCommandPtr cmd,
2daa92
             goto cleanup;
2daa92
         virCommandAddArgList(cmd, "-netdev", host, NULL);
2daa92
     }
2daa92
-    if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE)) {
2daa92
+    if (qemuDomainSupportsNicdev(def, qemuCaps)) {
Daniel P. Berrange 11755d
         bool multiqueue = tapfdSize > 1 || vhostfdSize > 1;
Daniel P. Berrange 11755d
 
Daniel P. Berrange 11755d
         if (!(nic = qemuBuildNicDevStr(def, net, vlan, bootindex,
Daniel P. Berrange 11755d
@@ -7333,8 +7351,7 @@ qemuBuildInterfaceCommandLine(virCommandPtr cmd,
2daa92
             goto cleanup;
2daa92
         virCommandAddArgList(cmd, "-net", nic, NULL);
2daa92
     }
2daa92
-    if (!(virQEMUCapsGet(qemuCaps, QEMU_CAPS_NETDEV) &&
2daa92
-          virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE))) {
2daa92
+    if (!qemuDomainSupportsNetdev(def, qemuCaps)) {
2daa92
         if (!(host = qemuBuildHostNetStr(net, driver,
2daa92
                                          ',', vlan,
2daa92
                                          tapfdName, tapfdSize,
Daniel P. Berrange 11755d
@@ -8385,8 +8402,7 @@ qemuBuildCommandLine(virConnectPtr conn,
2daa92
             int vlan;
2daa92
 
2daa92
             /* VLANs are not used with -netdev, so don't record them */
2daa92
-            if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_NETDEV) &&
2daa92
-                virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE))
2daa92
+            if (qemuDomainSupportsNetdev(def, qemuCaps))
2daa92
                 vlan = -1;
2daa92
             else
2daa92
                 vlan = i;
2daa92
diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c
Daniel P. Berrange 11755d
index cff6d70..30588fb 100644
2daa92
--- a/src/qemu/qemu_domain.c
2daa92
+++ b/src/qemu/qemu_domain.c
Daniel P. Berrange 11755d
@@ -799,6 +799,23 @@ qemuDomainDefPostParse(virDomainDefPtr def,
2daa92
     return 0;
2daa92
 }
2daa92
 
2daa92
+static const char *
2daa92
+qemuDomainDefaultNetModel(virDomainDefPtr def) {
2daa92
+    if (def->os.arch == VIR_ARCH_S390 ||
2daa92
+        def->os.arch == VIR_ARCH_S390X)
2daa92
+        return "virtio";
2daa92
+
2daa92
+    if (def->os.arch == VIR_ARCH_ARMV7L) {
2daa92
+        if (STREQ(def->os.machine, "versatilepb"))
2daa92
+            return "smc91c111";
2daa92
+
2daa92
+        /* Incomplete. vexpress (and a few others) use this, but not all
2daa92
+         * arm boards */
2daa92
+        return "lan9118";
2daa92
+    }
2daa92
+
2daa92
+    return "rtl8139";
2daa92
+}
2daa92
 
2daa92
 static int
2daa92
 qemuDomainDeviceDefPostParse(virDomainDeviceDefPtr dev,
Daniel P. Berrange 11755d
@@ -814,8 +831,7 @@ qemuDomainDeviceDefPostParse(virDomainDeviceDefPtr dev,
2daa92
         dev->data.net->type != VIR_DOMAIN_NET_TYPE_HOSTDEV &&
2daa92
         !dev->data.net->model) {
2daa92
         if (VIR_STRDUP(dev->data.net->model,
2daa92
-                       def->os.arch == VIR_ARCH_S390 ||
2daa92
-                       def->os.arch == VIR_ARCH_S390X ? "virtio" : "rtl8139") < 0)
2daa92
+                       qemuDomainDefaultNetModel(def)) < 0)
2daa92
             goto cleanup;
2daa92
     }
2daa92
 
2daa92
diff --git a/tests/qemuxml2argvdata/qemuxml2argv-arm-vexpressa9-basic.args b/tests/qemuxml2argvdata/qemuxml2argv-arm-vexpressa9-basic.args
2daa92
new file mode 100644
2daa92
index 0000000..a23fde4
2daa92
--- /dev/null
2daa92
+++ b/tests/qemuxml2argvdata/qemuxml2argv-arm-vexpressa9-basic.args
2daa92
@@ -0,0 +1,8 @@
2daa92
+LC_ALL=C PATH=/bin HOME=/home/test USER=test LOGNAME=test QEMU_AUDIO_DRV=none \
2daa92
+/usr/bin/qemu-system-arm -S -M vexpress-a9 -m 1024 -smp 1 -nographic \
2daa92
+-nodefconfig -nodefaults -monitor unix:/tmp/test-monitor,server,nowait \
2daa92
+-boot c -kernel /arm.kernel -initrd /arm.initrd -append \
2daa92
+'console=ttyAMA0,115200n8 rw root=/dev/mmcblk0p3 rootwait physmap.enabled=0' \
2daa92
+-dtb /arm.dtb -usb -drive file=/arm.raw,if=sd,index=0 \
2daa92
+-net nic,macaddr=52:54:00:09:a4:37,vlan=0,model=lan9118,name=net0 \
2daa92
+-net user,vlan=0,name=hostnet0 -serial pty
2daa92
diff --git a/tests/qemuxml2argvdata/qemuxml2argv-arm-vexpressa9-basic.xml b/tests/qemuxml2argvdata/qemuxml2argv-arm-vexpressa9-basic.xml
2daa92
new file mode 100644
2daa92
index 0000000..ec9374f
2daa92
--- /dev/null
2daa92
+++ b/tests/qemuxml2argvdata/qemuxml2argv-arm-vexpressa9-basic.xml
2daa92
@@ -0,0 +1,34 @@
2daa92
+<domain type="qemu">
2daa92
+  <name>armtest</name>
2daa92
+  <uuid>496d7ea8-9739-544b-4ebd-ef08be936e6a</uuid>
2daa92
+  <memory>1048576</memory>
2daa92
+  <currentMemory>1048576</currentMemory>
2daa92
+  <vcpu>1</vcpu>
2daa92
+  <os>
2daa92
+    <type arch="armv7l" machine="vexpress-a9">hvm</type>
2daa92
+    <kernel>/arm.kernel</kernel>
2daa92
+    <initrd>/arm.initrd</initrd>
2daa92
+    <dtb>/arm.dtb</dtb>
2daa92
+    <cmdline>console=ttyAMA0,115200n8 rw root=/dev/mmcblk0p3 rootwait physmap.enabled=0</cmdline>
2daa92
+  </os>
2daa92
+  <features>
2daa92
+    <acpi/>
2daa92
+    <apic/>
2daa92
+    <pae/>
2daa92
+  </features>
2daa92
+  <clock offset="utc"/>
2daa92
+  <on_poweroff>destroy</on_poweroff>
2daa92
+  <on_reboot>restart</on_reboot>
2daa92
+  <on_crash>restart</on_crash>
2daa92
+  <devices>
2daa92
+    <emulator>/usr/bin/qemu-system-arm</emulator>
2daa92
+    <disk type='file' device='disk'>
2daa92
+      <source file='/arm.raw'/>
2daa92
+      <target dev='sda' bus='sd'/>
2daa92
+    </disk>
2daa92
+    <interface type='user'>
2daa92
+      <mac address='52:54:00:09:a4:37'/>
2daa92
+    </interface>
2daa92
+    <console type='pty'/>
2daa92
+  </devices>
2daa92
+</domain>
2daa92
diff --git a/tests/qemuxml2argvtest.c b/tests/qemuxml2argvtest.c
Daniel P. Berrange 11755d
index cb6106f..6ecabbf 100644
2daa92
--- a/tests/qemuxml2argvtest.c
2daa92
+++ b/tests/qemuxml2argvtest.c
Daniel P. Berrange 11755d
@@ -1059,6 +1059,9 @@ mymain(void)
2daa92
 
2daa92
     DO_TEST("arm-vexpressa9-nodevs",
2daa92
             QEMU_CAPS_DEVICE, QEMU_CAPS_NODEFCONFIG, QEMU_CAPS_DTB);
2daa92
+    DO_TEST("arm-vexpressa9-basic",
2daa92
+            QEMU_CAPS_DEVICE, QEMU_CAPS_NODEFCONFIG, QEMU_CAPS_DTB,
2daa92
+            QEMU_CAPS_DRIVE);
2daa92
 
2daa92
     virObjectUnref(driver.config);
2daa92
     virObjectUnref(driver.caps);
Daniel P. Berrange 11755d
-- 
Daniel P. Berrange 11755d
1.8.3.1
Daniel P. Berrange 11755d