Similar to the chardev bit, ARM boards depend on the old style '-net nic' for actually instantiating net devices. And add tests for working ARM XML with console, disk, and networking. --- src/qemu/qemu_command.c | 34 ++++++++++++++++------ src/qemu/qemu_domain.c | 20 +++++++++++-- .../qemuxml2argv-arm-vexpressa9-basic.args | 1 + .../qemuxml2argv-arm-vexpressa9-basic.xml | 34 ++++++++++++++++++++++ tests/qemuxml2argvtest.c | 3 ++ 5 files changed, 81 insertions(+), 11 deletions(-) create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-arm-vexpressa9-basic.args create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-arm-vexpressa9-basic.xml diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c index 248e4b4..3b275e3 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c @@ -417,6 +417,26 @@ cleanup: 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: @@ -452,8 +472,7 @@ qemuOpenVhostNet(virDomainDefPtr def, * 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 " @@ -6852,8 +6871,7 @@ qemuBuildInterfaceCommandLine(virCommandPtr cmd, * * 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, @@ -6861,7 +6879,7 @@ qemuBuildInterfaceCommandLine(virCommandPtr cmd, goto cleanup; virCommandAddArgList(cmd, "-netdev", host, NULL); } - if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE)) { + if (qemuDomainSupportsNicdev(def, qemuCaps)) { if (!(nic = qemuBuildNicDevStr(net, vlan, bootindex, qemuCaps))) goto cleanup; virCommandAddArgList(cmd, "-device", nic, NULL); @@ -6870,8 +6888,7 @@ qemuBuildInterfaceCommandLine(virCommandPtr cmd, 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, @@ -7864,8 +7881,7 @@ qemuBuildCommandLine(virConnectPtr conn, 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; diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c index da3b768..c868dc1 100644 --- a/src/qemu/qemu_domain.c +++ b/src/qemu/qemu_domain.c @@ -746,6 +746,23 @@ qemuDomainDefPostParse(virDomainDefPtr def, 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-a9 (and a few others) use this, but not all + * arm boards */ + return "lan9118"; + } + + return "rtl8139"; +} static int qemuDomainDeviceDefPostParse(virDomainDeviceDefPtr dev, @@ -761,8 +778,7 @@ 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; } diff --git a/tests/qemuxml2argvdata/qemuxml2argv-arm-vexpressa9-basic.args b/tests/qemuxml2argvdata/qemuxml2argv-arm-vexpressa9-basic.args new file mode 100644 index 0000000..98ca5c9 --- /dev/null +++ b/tests/qemuxml2argvdata/qemuxml2argv-arm-vexpressa9-basic.args @@ -0,0 +1 @@ +LC_ALL=C PATH=/bin HOME=/home/test USER=test LOGNAME=test /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 -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 diff --git a/tests/qemuxml2argvdata/qemuxml2argv-arm-vexpressa9-basic.xml b/tests/qemuxml2argvdata/qemuxml2argv-arm-vexpressa9-basic.xml new file mode 100644 index 0000000..7b846c6 --- /dev/null +++ b/tests/qemuxml2argvdata/qemuxml2argv-arm-vexpressa9-basic.xml @@ -0,0 +1,34 @@ +<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> diff --git a/tests/qemuxml2argvtest.c b/tests/qemuxml2argvtest.c index 361ddb8..0bf2724 100644 --- a/tests/qemuxml2argvtest.c +++ b/tests/qemuxml2argvtest.c @@ -1029,6 +1029,9 @@ mymain(void) DO_TEST("arm-vexpressa9-nodevs", QEMU_CAPS_DEVICE, QEMU_CAPS_NODEFCONFIG, QEMU_CAPS_DTB); + DO_TEST("arm-vexpressa9-basic", + QEMU_CAPS_DEVICE, QEMU_CAPS_NODEFCONFIG, QEMU_CAPS_DTB, + QEMU_CAPS_DRIVE); virObjectUnref(driver.config); virObjectUnref(driver.caps); -- 1.8.3.1 -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list