mirror of https://gitee.com/openkylin/libvirt.git
AArch64: Porting of armv7l conditons to run qemu for aarch64.
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>
This commit is contained in:
parent
d219826c65
commit
27e32e0f3d
|
@ -305,6 +305,7 @@
|
|||
<ref name="hvmppc64"/>
|
||||
<ref name="hvms390"/>
|
||||
<ref name="hvmarm"/>
|
||||
<ref name="hvmaarch64"/>
|
||||
</choice>
|
||||
</optional>
|
||||
<value>hvm</value>
|
||||
|
@ -432,6 +433,24 @@
|
|||
</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">
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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"))
|
||||
|
|
|
@ -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:
|
||||
|
|
|
@ -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
|
|
@ -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>
|
|
@ -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,
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
Loading…
Reference in New Issue