xref: /qemu/tests/functional/test_aarch64_virt.py (revision dbba45e6aa1048626faabff5f6bc2b341f87166f)
1ba5d1f23SAlex Bennée# Functional test that boots a various Linux systems and checks the
2ba5d1f23SAlex Bennée# console output.
311593544SAlex Bennée#
411593544SAlex Bennée# Copyright (c) 2022 Linaro Ltd.
511593544SAlex Bennée#
611593544SAlex Bennée# Author:
711593544SAlex Bennée#  Alex Bennée <alex.bennee@linaro.org>
811593544SAlex Bennée#
911593544SAlex Bennée# SPDX-License-Identifier: GPL-2.0-or-later
1011593544SAlex Bennée
1111593544SAlex Bennéeimport time
12ba5d1f23SAlex Bennéeimport os
13*dbba45e6SAlex Bennéeimport logging
1411593544SAlex Bennée
1511593544SAlex Bennéefrom avocado_qemu import QemuSystemTest
1611593544SAlex Bennéefrom avocado_qemu import wait_for_console_pattern
1711593544SAlex Bennéefrom avocado_qemu import exec_command
18ba5d1f23SAlex Bennéefrom avocado_qemu import BUILD_DIR
19*dbba45e6SAlex Bennéefrom avocado.utils import process
20*dbba45e6SAlex Bennéefrom avocado.utils.path import find_command
2111593544SAlex Bennée
2211593544SAlex Bennéeclass Aarch64VirtMachine(QemuSystemTest):
2311593544SAlex Bennée    KERNEL_COMMON_COMMAND_LINE = 'printk.time=0 '
24ba5d1f23SAlex Bennée    timeout = 360
2511593544SAlex Bennée
2611593544SAlex Bennée    def wait_for_console_pattern(self, success_message, vm=None):
2711593544SAlex Bennée        wait_for_console_pattern(self, success_message,
2811593544SAlex Bennée                                 failure_message='Kernel panic - not syncing',
2911593544SAlex Bennée                                 vm=vm)
3011593544SAlex Bennée
31ba5d1f23SAlex Bennée    # This tests the whole boot chain from EFI to Userspace
32ba5d1f23SAlex Bennée    # We only boot a whole OS for the current top level CPU and GIC
33ba5d1f23SAlex Bennée    # Other test profiles should use more minimal boots
34ba5d1f23SAlex Bennée    def test_alpine_virt_tcg_gic_max(self):
35ba5d1f23SAlex Bennée        """
36ba5d1f23SAlex Bennée        :avocado: tags=arch:aarch64
37ba5d1f23SAlex Bennée        :avocado: tags=machine:virt
38ba5d1f23SAlex Bennée        :avocado: tags=accel:tcg
39ba5d1f23SAlex Bennée        """
40ba5d1f23SAlex Bennée        iso_url = ('https://dl-cdn.alpinelinux.org/'
41ba5d1f23SAlex Bennée                   'alpine/v3.16/releases/aarch64/'
42ba5d1f23SAlex Bennée                   'alpine-virt-3.16.3-aarch64.iso')
43ba5d1f23SAlex Bennée
44ba5d1f23SAlex Bennée        # Alpine use sha256 so I recalculated this myself
45ba5d1f23SAlex Bennée        iso_sha1 = '0683bc089486d55c91bf6607d5ecb93925769bc0'
46ba5d1f23SAlex Bennée        iso_path = self.fetch_asset(iso_url, asset_hash=iso_sha1)
47ba5d1f23SAlex Bennée
48ba5d1f23SAlex Bennée        self.vm.set_console()
49ba5d1f23SAlex Bennée        kernel_command_line = (self.KERNEL_COMMON_COMMAND_LINE +
50ba5d1f23SAlex Bennée                               'console=ttyAMA0')
51ba5d1f23SAlex Bennée        self.require_accelerator("tcg")
52ba5d1f23SAlex Bennée
53ba5d1f23SAlex Bennée        self.vm.add_args("-accel", "tcg")
54ba5d1f23SAlex Bennée        self.vm.add_args("-cpu", "max,pauth-impdef=on")
55ba5d1f23SAlex Bennée        self.vm.add_args("-machine",
56ba5d1f23SAlex Bennée                         "virt,acpi=on,"
57ba5d1f23SAlex Bennée                         "virtualization=on,"
58ba5d1f23SAlex Bennée                         "mte=on,"
59ba5d1f23SAlex Bennée                         "gic-version=max,iommu=smmuv3")
60ba5d1f23SAlex Bennée        self.vm.add_args("-smp", "2", "-m", "1024")
61ba5d1f23SAlex Bennée        self.vm.add_args('-bios', os.path.join(BUILD_DIR, 'pc-bios',
62ba5d1f23SAlex Bennée                                               'edk2-aarch64-code.fd'))
63ba5d1f23SAlex Bennée        self.vm.add_args("-drive", f"file={iso_path},format=raw")
64ba5d1f23SAlex Bennée        self.vm.add_args('-device', 'virtio-rng-pci,rng=rng0')
65ba5d1f23SAlex Bennée        self.vm.add_args('-object', 'rng-random,id=rng0,filename=/dev/urandom')
66ba5d1f23SAlex Bennée
67ba5d1f23SAlex Bennée        self.vm.launch()
68ba5d1f23SAlex Bennée        self.wait_for_console_pattern('Welcome to Alpine Linux 3.16')
69ba5d1f23SAlex Bennée
70ba5d1f23SAlex Bennée
71*dbba45e6SAlex Bennée    def common_aarch64_virt(self, machine):
7211593544SAlex Bennée        """
73*dbba45e6SAlex Bennée        Common code to launch basic virt machine with kernel+initrd
74*dbba45e6SAlex Bennée        and a scratch disk.
7511593544SAlex Bennée        """
76*dbba45e6SAlex Bennée        logger = logging.getLogger('aarch64_virt')
77*dbba45e6SAlex Bennée
7811593544SAlex Bennée        kernel_url = ('https://fileserver.linaro.org/s/'
7911593544SAlex Bennée                      'z6B2ARM7DQT3HWN/download')
8011593544SAlex Bennée        kernel_hash = 'ed11daab50c151dde0e1e9c9cb8b2d9bd3215347'
8111593544SAlex Bennée        kernel_path = self.fetch_asset(kernel_url, asset_hash=kernel_hash)
8211593544SAlex Bennée
8311593544SAlex Bennée        self.vm.set_console()
8411593544SAlex Bennée        kernel_command_line = (self.KERNEL_COMMON_COMMAND_LINE +
8511593544SAlex Bennée                               'console=ttyAMA0')
8611593544SAlex Bennée        self.require_accelerator("tcg")
8711593544SAlex Bennée        self.vm.add_args('-cpu', 'max,pauth-impdef=on',
88*dbba45e6SAlex Bennée                         '-machine', machine,
8911593544SAlex Bennée                         '-accel', 'tcg',
9011593544SAlex Bennée                         '-kernel', kernel_path,
9111593544SAlex Bennée                         '-append', kernel_command_line)
92*dbba45e6SAlex Bennée
93*dbba45e6SAlex Bennée        # A RNG offers an easy way to generate a few IRQs
94*dbba45e6SAlex Bennée        self.vm.add_args('-device', 'virtio-rng-pci,rng=rng0')
95*dbba45e6SAlex Bennée        self.vm.add_args('-object',
96*dbba45e6SAlex Bennée                         'rng-random,id=rng0,filename=/dev/urandom')
97*dbba45e6SAlex Bennée
98*dbba45e6SAlex Bennée        # Also add a scratch block device
99*dbba45e6SAlex Bennée        logger.info('creating scratch qcow2 image')
100*dbba45e6SAlex Bennée        image_path = os.path.join(self.workdir, 'scratch.qcow2')
101*dbba45e6SAlex Bennée        qemu_img = os.path.join(BUILD_DIR, 'qemu-img')
102*dbba45e6SAlex Bennée        if not os.path.exists(qemu_img):
103*dbba45e6SAlex Bennée            qemu_img = find_command('qemu-img', False)
104*dbba45e6SAlex Bennée        if qemu_img is False:
105*dbba45e6SAlex Bennée            self.cancel('Could not find "qemu-img", which is required to '
106*dbba45e6SAlex Bennée                        'create the temporary qcow2 image')
107*dbba45e6SAlex Bennée        cmd = '%s create -f qcow2 %s 8M' % (qemu_img, image_path)
108*dbba45e6SAlex Bennée        process.run(cmd)
109*dbba45e6SAlex Bennée
110*dbba45e6SAlex Bennée        # Add the device
111*dbba45e6SAlex Bennée        self.vm.add_args('-blockdev',
112*dbba45e6SAlex Bennée                         f"driver=qcow2,file.driver=file,file.filename={image_path},node-name=scratch")
113*dbba45e6SAlex Bennée        self.vm.add_args('-device',
114*dbba45e6SAlex Bennée                         'virtio-blk-device,drive=scratch')
115*dbba45e6SAlex Bennée
11611593544SAlex Bennée        self.vm.launch()
11711593544SAlex Bennée        self.wait_for_console_pattern('Welcome to Buildroot')
11811593544SAlex Bennée        time.sleep(0.1)
11911593544SAlex Bennée        exec_command(self, 'root')
12011593544SAlex Bennée        time.sleep(0.1)
121*dbba45e6SAlex Bennée        exec_command(self, 'dd if=/dev/hwrng of=/dev/vda bs=512 count=4')
122*dbba45e6SAlex Bennée        time.sleep(0.1)
123*dbba45e6SAlex Bennée        exec_command(self, 'md5sum /dev/vda')
124*dbba45e6SAlex Bennée        time.sleep(0.1)
125*dbba45e6SAlex Bennée        exec_command(self, 'cat /proc/interrupts')
126*dbba45e6SAlex Bennée        time.sleep(0.1)
12711593544SAlex Bennée        exec_command(self, 'cat /proc/self/maps')
12811593544SAlex Bennée        time.sleep(0.1)
129*dbba45e6SAlex Bennée
130*dbba45e6SAlex Bennée    def test_aarch64_virt_gicv3(self):
131*dbba45e6SAlex Bennée        """
132*dbba45e6SAlex Bennée        :avocado: tags=arch:aarch64
133*dbba45e6SAlex Bennée        :avocado: tags=machine:virt
134*dbba45e6SAlex Bennée        :avocado: tags=accel:tcg
135*dbba45e6SAlex Bennée        :avocado: tags=cpu:max
136*dbba45e6SAlex Bennée        """
137*dbba45e6SAlex Bennée        self.common_aarch64_virt("virt,gic_version=3")
138*dbba45e6SAlex Bennée
139*dbba45e6SAlex Bennée    def test_aarch64_virt_gicv2(self):
140*dbba45e6SAlex Bennée        """
141*dbba45e6SAlex Bennée        :avocado: tags=arch:aarch64
142*dbba45e6SAlex Bennée        :avocado: tags=machine:virt
143*dbba45e6SAlex Bennée        :avocado: tags=accel:tcg
144*dbba45e6SAlex Bennée        :avocado: tags=cpu:max
145*dbba45e6SAlex Bennée        """
146*dbba45e6SAlex Bennée        self.common_aarch64_virt("virt,gic-version=2")
147