Unlike USB, qemu_command can handle an empty memballoon device, so just don't add it. And add test cases for a basic working ARM guest. --- docs/schemas/domaincommon.rng | 19 +++++++++++ src/conf/domain_conf.c | 38 ++++++++++++++-------- .../qemuxml2argv-arm-vexpressa9-nodevs.args | 1 + .../qemuxml2argv-arm-vexpressa9-nodevs.xml | 26 +++++++++++++++ tests/qemuxml2argvtest.c | 3 ++ tests/testutilsqemu.c | 32 ++++++++++++++++++ 6 files changed, 106 insertions(+), 13 deletions(-) create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-arm-vexpressa9-nodevs.args create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-arm-vexpressa9-nodevs.xml diff --git a/docs/schemas/domaincommon.rng b/docs/schemas/domaincommon.rng index 745b959..781ecfd 100644 --- a/docs/schemas/domaincommon.rng +++ b/docs/schemas/domaincommon.rng @@ -303,6 +303,7 @@ <ref name="hvmppc"/> <ref name="hvmppc64"/> <ref name="hvms390"/> + <ref name="hvmarm"/> </choice> </optional> <value>hvm</value> @@ -412,6 +413,24 @@ </optional> </group> </define> + <define name="hvmarm"> + <group> + <optional> + <attribute name="arch"> + <choice> + <value>armv7l</value> + </choice> + </attribute> + </optional> + <optional> + <attribute name="machine"> + <data type="string"> + <param name="pattern">[a-zA-Z0-9_\.\-]+</param> + </data> + </attribute> + </optional> + </group> + </define> <define name="osexe"> <element name="os"> <element name="type"> diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index 2308580..9d903f4 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -8812,6 +8812,23 @@ virDomainDefaultUSBControllerModel(virDomainDefPtr def) return -1; } +static bool +virDomainNeedDefaultMemballoonDevice(virDomainDefPtr def) +{ + if (def->virtType == VIR_DOMAIN_VIRT_XEN) + return true; + + if (def->virtType != VIR_DOMAIN_VIRT_QEMU && + def->virtType != VIR_DOMAIN_VIRT_KQEMU && + def->virtType != VIR_DOMAIN_VIRT_KVM) + return false; + + if (def->os.arch == VIR_ARCH_ARMV7L) + return false; + + return true; +} + int virDomainVideoDefaultType(virDomainDefPtr def) { @@ -12156,19 +12173,14 @@ virDomainDefParseXML(xmlDocPtr xml, def->memballoon = memballoon; VIR_FREE(nodes); - } else { - if (def->virtType == VIR_DOMAIN_VIRT_XEN || - def->virtType == VIR_DOMAIN_VIRT_QEMU || - def->virtType == VIR_DOMAIN_VIRT_KQEMU || - def->virtType == VIR_DOMAIN_VIRT_KVM) { - virDomainMemballoonDefPtr memballoon; - if (VIR_ALLOC(memballoon) < 0) - goto error; - memballoon->model = def->virtType == VIR_DOMAIN_VIRT_XEN ? - VIR_DOMAIN_MEMBALLOON_MODEL_XEN : - VIR_DOMAIN_MEMBALLOON_MODEL_VIRTIO; - def->memballoon = memballoon; - } + } else if (virDomainNeedDefaultMemballoonDevice(def)) { + virDomainMemballoonDefPtr memballoon; + if (VIR_ALLOC(memballoon) < 0) + goto error; + memballoon->model = def->virtType == VIR_DOMAIN_VIRT_XEN ? + VIR_DOMAIN_MEMBALLOON_MODEL_XEN : + VIR_DOMAIN_MEMBALLOON_MODEL_VIRTIO; + def->memballoon = memballoon; } /* Parse the RNG device */ diff --git a/tests/qemuxml2argvdata/qemuxml2argv-arm-vexpressa9-nodevs.args b/tests/qemuxml2argvdata/qemuxml2argv-arm-vexpressa9-nodevs.args new file mode 100644 index 0000000..129f2ed --- /dev/null +++ b/tests/qemuxml2argvdata/qemuxml2argv-arm-vexpressa9-nodevs.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 -dtb /arm-dtb diff --git a/tests/qemuxml2argvdata/qemuxml2argv-arm-vexpressa9-nodevs.xml b/tests/qemuxml2argvdata/qemuxml2argv-arm-vexpressa9-nodevs.xml new file mode 100644 index 0000000..6a97e98 --- /dev/null +++ b/tests/qemuxml2argvdata/qemuxml2argv-arm-vexpressa9-nodevs.xml @@ -0,0 +1,26 @@ +<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</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> + </devices> +</domain> diff --git a/tests/qemuxml2argvtest.c b/tests/qemuxml2argvtest.c index b7485fc..361ddb8 100644 --- a/tests/qemuxml2argvtest.c +++ b/tests/qemuxml2argvtest.c @@ -1027,6 +1027,9 @@ mymain(void) DO_TEST_PARSE_ERROR("pci-root-address", QEMU_CAPS_DEVICE, QEMU_CAPS_DEVICE_PCI_BRIDGE); + DO_TEST("arm-vexpressa9-nodevs", + QEMU_CAPS_DEVICE, QEMU_CAPS_NODEFCONFIG, QEMU_CAPS_DTB); + virObjectUnref(driver.config); virObjectUnref(driver.caps); virObjectUnref(driver.xmlopt); diff --git a/tests/testutilsqemu.c b/tests/testutilsqemu.c index fac83b2..3907683 100644 --- a/tests/testutilsqemu.c +++ b/tests/testutilsqemu.c @@ -145,6 +145,35 @@ error: return -1; } +static int testQemuAddArmGuest(virCapsPtr caps) +{ + static const char *machines[] = { "vexpress-a9", + "versatilepb" }; + virCapsGuestMachinePtr *capsmachines = NULL; + virCapsGuestPtr guest; + + capsmachines = virCapabilitiesAllocMachines(machines, + ARRAY_CARDINALITY(machines)); + if (!capsmachines) + goto error; + + guest = virCapabilitiesAddGuest(caps, "hvm", VIR_ARCH_ARMV7L, + "/usr/bin/qemu-system-arm", NULL, + ARRAY_CARDINALITY(machines), + capsmachines); + if (!guest) + goto error; + + if (!virCapabilitiesAddGuestDomain(guest, "qemu", NULL, NULL, 0, NULL)) + goto error; + + return 0; + +error: + virCapabilitiesFreeMachines(capsmachines, ARRAY_CARDINALITY(machines)); + return -1; +} + virCapsPtr testQemuCapsInit(void) { virCapsPtr caps; @@ -270,6 +299,9 @@ virCapsPtr testQemuCapsInit(void) { if (testQemuAddS390Guest(caps)) goto cleanup; + if (testQemuAddArmGuest(caps)) + goto cleanup; + if (virTestGetDebug()) { char *caps_str; -- 1.8.3.1 -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list