return ret;
}
+static bool
+qemuDomainSupportsNicdev(virDomainDefPtr def, virQEMUCapsPtr qemuCaps)
+{
+ if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE))
+ return false;
+
+ /* arm boards require legacy -net nic */
+ if (def->os.arch == VIR_ARCH_ARMV7L)
+ return false;
+
+ return true;
+}
+
+static bool
+qemuDomainSupportsNetdev(virDomainDefPtr def, virQEMUCapsPtr qemuCaps)
+{
+ if (!qemuDomainSupportsNicdev(def, qemuCaps))
+ return false;
+ return virQEMUCapsGet(qemuCaps, QEMU_CAPS_NETDEV);
+}
/**
* qemuOpenVhostNet:
* option), don't try to open the device.
*/
if (!(virQEMUCapsGet(qemuCaps, QEMU_CAPS_VHOST_NET) &&
- virQEMUCapsGet(qemuCaps, QEMU_CAPS_NETDEV) &&
- virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE))) {
+ qemuDomainSupportsNetdev(def, qemuCaps))) {
if (net->driver.virtio.name == VIR_DOMAIN_NET_BACKEND_TYPE_VHOST) {
virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
"%s", _("vhost-net is not supported with "
*
* NB, no support for -netdev without use of -device
*/
- if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_NETDEV) &&
- virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE)) {
+ if (qemuDomainSupportsNetdev(def, qemuCaps)) {
if (!(host = qemuBuildHostNetStr(net, driver,
',', vlan,
tapfdName, tapfdSize,
goto cleanup;
virCommandAddArgList(cmd, "-netdev", host, NULL);
}
- if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE)) {
+ if (qemuDomainSupportsNicdev(def, qemuCaps)) {
bool multiqueue = tapfdSize > 1 || vhostfdSize > 1;
if (!(nic = qemuBuildNicDevStr(def, net, vlan, bootindex,
goto cleanup;
virCommandAddArgList(cmd, "-net", nic, NULL);
}
- if (!(virQEMUCapsGet(qemuCaps, QEMU_CAPS_NETDEV) &&
- virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE))) {
+ if (!qemuDomainSupportsNetdev(def, qemuCaps)) {
if (!(host = qemuBuildHostNetStr(net, driver,
',', vlan,
tapfdName, tapfdSize,
int vlan;
/* VLANs are not used with -netdev, so don't record them */
- if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_NETDEV) &&
- virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE))
+ if (qemuDomainSupportsNetdev(def, qemuCaps))
vlan = -1;
else
vlan = i;
return 0;
}
+static const char *
+qemuDomainDefaultNetModel(virDomainDefPtr def) {
+ if (def->os.arch == VIR_ARCH_S390 ||
+ def->os.arch == VIR_ARCH_S390X)
+ return "virtio";
+
+ if (def->os.arch == VIR_ARCH_ARMV7L) {
+ if (STREQ(def->os.machine, "versatilepb"))
+ return "smc91c111";
+
+ /* Incomplete. vexpress (and a few others) use this, but not all
+ * arm boards */
+ return "lan9118";
+ }
+
+ return "rtl8139";
+}
static int
qemuDomainDeviceDefPostParse(virDomainDeviceDefPtr dev,
dev->data.net->type != VIR_DOMAIN_NET_TYPE_HOSTDEV &&
!dev->data.net->model) {
if (VIR_STRDUP(dev->data.net->model,
- def->os.arch == VIR_ARCH_S390 ||
- def->os.arch == VIR_ARCH_S390X ? "virtio" : "rtl8139") < 0)
+ qemuDomainDefaultNetModel(def)) < 0)
goto cleanup;
}
--- /dev/null
+LC_ALL=C PATH=/bin HOME=/home/test USER=test LOGNAME=test QEMU_AUDIO_DRV=none \
+/usr/bin/qemu-system-arm -S -M vexpress-a9 -m 1024 -smp 1 -nographic \
+-nodefconfig -nodefaults -monitor unix:/tmp/test-monitor,server,nowait \
+-boot c -kernel /arm.kernel -initrd /arm.initrd -append \
+'console=ttyAMA0,115200n8 rw root=/dev/mmcblk0p3 rootwait physmap.enabled=0' \
+-dtb /arm.dtb -usb -drive file=/arm.raw,if=sd,index=0 \
+-net nic,macaddr=52:54:00:09:a4:37,vlan=0,model=lan9118,name=net0 \
+-net user,vlan=0,name=hostnet0 -serial pty
--- /dev/null
+<domain type="qemu">
+ <name>armtest</name>
+ <uuid>496d7ea8-9739-544b-4ebd-ef08be936e6a</uuid>
+ <memory>1048576</memory>
+ <currentMemory>1048576</currentMemory>
+ <vcpu>1</vcpu>
+ <os>
+ <type arch="armv7l" machine="vexpress-a9">hvm</type>
+ <kernel>/arm.kernel</kernel>
+ <initrd>/arm.initrd</initrd>
+ <dtb>/arm.dtb</dtb>
+ <cmdline>console=ttyAMA0,115200n8 rw root=/dev/mmcblk0p3 rootwait physmap.enabled=0</cmdline>
+ </os>
+ <features>
+ <acpi/>
+ <apic/>
+ <pae/>
+ </features>
+ <clock offset="utc"/>
+ <on_poweroff>destroy</on_poweroff>
+ <on_reboot>restart</on_reboot>
+ <on_crash>restart</on_crash>
+ <devices>
+ <emulator>/usr/bin/qemu-system-arm</emulator>
+ <disk type='file' device='disk'>
+ <source file='/arm.raw'/>
+ <target dev='sda' bus='sd'/>
+ </disk>
+ <interface type='user'>
+ <mac address='52:54:00:09:a4:37'/>
+ </interface>
+ <console type='pty'/>
+ </devices>
+</domain>