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