]> xenbits.xensource.com Git - libvirt.git/commitdiff
AArch64: Porting of armv7l conditons to run qemu for aarch64.
authorPranavkumar Sawargaonkar <pranavkumar@linaro.org>
Thu, 2 Jan 2014 10:42:56 +0000 (16:12 +0530)
committerCole Robinson <crobinso@redhat.com>
Mon, 6 Jan 2014 16:02:24 +0000 (11:02 -0500)
AArch64 qemu has similar behavior as armv7l, like use of mmio etc.
This patch adds similar bypass checks what we have for armv7l to aarch64.
E.g. we are enabling mmio transport for Nicdev.
Making addDefaultUSB and addDefaultMemballoon to false etc.

V3:
- Adding missing domain rng schema for aarcg64 and test case in
  testutilsqemu.c which was causing test suite failure
  while running make check.

V2:
- Added testcase to qemuxml2argvtest as suggested
  during review comments of V1.

V1:
- Initial patch.

Signed-off-by: Anup Patel <anup.patel@linaro.org>
Signed-off-by: Pranavkumar Sawargaonkar <pranavkumar@linaro.org>
docs/schemas/domaincommon.rng
src/qemu/qemu_capabilities.c
src/qemu/qemu_command.c
src/qemu/qemu_domain.c
tests/qemuxml2argvdata/qemuxml2argv-aarch64-virt-virtio.args [new file with mode: 0644]
tests/qemuxml2argvdata/qemuxml2argv-aarch64-virt-virtio.xml [new file with mode: 0644]
tests/qemuxml2argvtest.c
tests/testutilsqemu.c

index be32c6bc6ea45037c5dd8d169d32fdc0c6bab100..86a60c9fb35cff161d781b9ebde25600f9c11f01 100644 (file)
           <ref name="hvmppc64"/>
           <ref name="hvms390"/>
           <ref name="hvmarm"/>
+          <ref name="hvmaarch64"/>
         </choice>
       </optional>
       <value>hvm</value>
       </optional>
     </group>
   </define>
+  <define name="hvmaarch64">
+    <group>
+      <optional>
+        <attribute name="arch">
+          <choice>
+            <value>aarch64</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">
index 4f64f878e514e68c2ebcef501a726e055a2010a8..ed182e00227402b420d3c6dc6b1c9c9871102501 100644 (file)
@@ -2917,7 +2917,7 @@ virQEMUCapsSupportsChardev(virDomainDefPtr def,
         !virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE))
         return false;
 
-    if (def->os.arch != VIR_ARCH_ARMV7L)
+    if ((def->os.arch != VIR_ARCH_ARMV7L) && (def->os.arch != VIR_ARCH_AARCH64))
         return true;
 
     /* This may not be true for all ARM machine types, but at least
index 2a64cd1f2e4aebb39d96f0ddca6ed5c5949aaf26..35b7c6759a2620eb7d6e186deab3974d1436e6d1 100644 (file)
@@ -427,7 +427,8 @@ qemuDomainSupportsNicdev(virDomainDefPtr def,
         return false;
 
     /* non-virtio ARM nics require legacy -net nic */
-    if (def->os.arch == VIR_ARCH_ARMV7L &&
+    if (((def->os.arch == VIR_ARCH_ARMV7L) ||
+        (def->os.arch == VIR_ARCH_AARCH64)) &&
         net->info.type != VIR_DOMAIN_DEVICE_ADDRESS_TYPE_VIRTIO_MMIO)
         return false;
 
@@ -1340,7 +1341,8 @@ static int
 qemuDomainAssignARMVirtioMMIOAddresses(virDomainDefPtr def,
                                        virQEMUCapsPtr qemuCaps)
 {
-    if (def->os.arch == VIR_ARCH_ARMV7L &&
+    if (((def->os.arch == VIR_ARCH_ARMV7L) ||
+        (def->os.arch == VIR_ARCH_AARCH64)) &&
         (STRPREFIX(def->os.machine, "vexpress-") ||
             STREQ(def->os.machine, "virt")) &&
         virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE_VIRTIO_MMIO)) {
@@ -1872,7 +1874,7 @@ cleanup:
 
 static bool
 qemuDomainSupportsPCI(virDomainDefPtr def) {
-    if (def->os.arch != VIR_ARCH_ARMV7L)
+    if ((def->os.arch != VIR_ARCH_ARMV7L) && (def->os.arch != VIR_ARCH_AARCH64))
         return true;
 
     if (STREQ(def->os.machine, "versatilepb"))
index e964c752bc6dddd70f94d2894b92b7e94cb08fbb..c947e2e956f36458834e841f696286b220fe2929 100644 (file)
@@ -727,6 +727,10 @@ qemuDomainDefPostParse(virDomainDefPtr def,
        addDefaultUSB = false;
        addDefaultMemballoon = false;
        break;
+    case VIR_ARCH_AARCH64:
+       addDefaultUSB = false;
+       addDefaultMemballoon = false;
+       break;
 
     case VIR_ARCH_ALPHA:
     case VIR_ARCH_PPC:
diff --git a/tests/qemuxml2argvdata/qemuxml2argv-aarch64-virt-virtio.args b/tests/qemuxml2argvdata/qemuxml2argv-aarch64-virt-virtio.args
new file mode 100644 (file)
index 0000000..afd6e41
--- /dev/null
@@ -0,0 +1,14 @@
+LC_ALL=C PATH=/bin HOME=/home/test USER=test LOGNAME=test QEMU_AUDIO_DRV=none \
+/usr/bin/qemu-system-aarch64 -S -M virt -m 1024 -smp 1 -nographic \
+-nodefconfig -nodefaults -monitor unix:/tmp/test-monitor,server,nowait \
+-boot c -kernel /aarch64.kernel -initrd /aarch64.initrd -append \
+'earlyprintk console=ttyAMA0,115200n8 rw root=/dev/vda rootwait' \
+-dtb /aarch64.dtb -device virtio-serial-device,id=virtio-serial0 -usb \
+-drive file=/aarch64.raw,if=none,id=drive-virtio-disk0 \
+-device virtio-blk-device,drive=drive-virtio-disk0,id=virtio-disk0 \
+-device virtio-net-device,vlan=0,id=net0,mac=52:54:00:09:a4:37 \
+-net user,vlan=0,name=hostnet0 -serial pty -chardev pty,id=charconsole1 \
+-device virtconsole,chardev=charconsole1,id=console1 \
+-device virtio-balloon-device,id=balloon0 \
+-object rng-random,id=rng0,filename=/dev/random \
+-device virtio-rng-device,rng=rng0
diff --git a/tests/qemuxml2argvdata/qemuxml2argv-aarch64-virt-virtio.xml b/tests/qemuxml2argvdata/qemuxml2argv-aarch64-virt-virtio.xml
new file mode 100644 (file)
index 0000000..184b62c
--- /dev/null
@@ -0,0 +1,45 @@
+<domain type="qemu">
+  <name>aarch64test</name>
+  <uuid>496d7ea8-9739-544b-4ebd-ef08be936e8b</uuid>
+  <memory>1048576</memory>
+  <currentMemory>1048576</currentMemory>
+  <vcpu placement='static'>1</vcpu>
+  <os>
+    <type arch="aarch64" machine="virt">hvm</type>
+    <kernel>/aarch64.kernel</kernel>
+    <initrd>/aarch64.initrd</initrd>
+    <dtb>/aarch64.dtb</dtb>
+    <cmdline>earlyprintk console=ttyAMA0,115200n8 rw root=/dev/vda rootwait</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-aarch64</emulator>
+    <disk type='file' device='disk'>
+      <source file='/aarch64.raw'/>
+      <target dev='vda' bus='virtio'/>
+    </disk>
+    <interface type='user'>
+      <mac address='52:54:00:09:a4:37'/>
+      <model type='virtio'/>
+    </interface>
+    <console type='pty'/>
+    <console type='pty'>
+      <target type='virtio' port='0'/>
+    </console>
+    <memballoon model='virtio'/>
+    <!--
+      This actually doesn't work in practice because vexpress only has
+      4 virtio slots available, rng makes 5 -->
+    <rng model='virtio'>
+      <backend model='random'>/dev/random</backend>
+    </rng>
+  </devices>
+</domain>
index 5a2bfccf19f6c51a45579b54336d0eeb70eeb624..b90f0e79c2c527a582735a0a874dd4a889697c89 100644 (file)
@@ -1302,6 +1302,11 @@ mymain(void)
             QEMU_CAPS_DRIVE, QEMU_CAPS_DEVICE_VIRTIO_MMIO,
             QEMU_CAPS_DEVICE_VIRTIO_RNG, QEMU_CAPS_OBJECT_RNG_RANDOM);
 
+    DO_TEST("aarch64-virt-virtio",
+            QEMU_CAPS_DEVICE, QEMU_CAPS_NODEFCONFIG, QEMU_CAPS_DTB,
+            QEMU_CAPS_DRIVE, QEMU_CAPS_DEVICE_VIRTIO_MMIO,
+            QEMU_CAPS_DEVICE_VIRTIO_RNG, QEMU_CAPS_OBJECT_RNG_RANDOM);
+
     DO_TEST("kvm-pit-device", QEMU_CAPS_KVM_PIT_TICK_POLICY);
     DO_TEST("kvm-pit-delay", QEMU_CAPS_NO_KVM_PIT);
     DO_TEST("kvm-pit-device", QEMU_CAPS_NO_KVM_PIT,
index 92433efacf6d5c567a691c47c8dccd6a2ccbdf8e..44e7e9d9221326d107a765d40566e581a0d404f1 100644 (file)
@@ -175,6 +175,33 @@ error:
     return -1;
 }
 
+static int testQemuAddAARCH64Guest(virCapsPtr caps)
+{
+    static const char *machines[] = { "virt"};
+    virCapsGuestMachinePtr *capsmachines = NULL;
+    virCapsGuestPtr guest;
+
+    capsmachines = virCapabilitiesAllocMachines(machines,
+                                                ARRAY_CARDINALITY(machines));
+    if (!capsmachines)
+        goto error;
+
+    guest = virCapabilitiesAddGuest(caps, "hvm", VIR_ARCH_AARCH64,
+                                    "/usr/bin/qemu-system-aarch64", 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;
@@ -303,6 +330,9 @@ virCapsPtr testQemuCapsInit(void) {
     if (testQemuAddArmGuest(caps))
         goto cleanup;
 
+    if (testQemuAddAARCH64Guest(caps))
+        goto cleanup;
+
     if (virTestGetDebug()) {
         char *caps_str;