1#!/usr/bin/env python3 2# 3# KVM Xen guest functional tests 4# 5# Copyright © 2021 Red Hat, Inc. 6# Copyright © 2023 Amazon.com, Inc. or its affiliates. All Rights Reserved. 7# 8# Author: 9# David Woodhouse <dwmw2@infradead.org> 10# Alex Bennée <alex.bennee@linaro.org> 11# 12# SPDX-License-Identifier: GPL-2.0-or-later 13 14from qemu.machine import machine 15 16from qemu_test import QemuSystemTest, Asset, exec_command_and_wait_for_pattern 17from qemu_test import wait_for_console_pattern 18 19class KVMXenGuest(QemuSystemTest): 20 21 KERNEL_DEFAULT = 'printk.time=0 root=/dev/xvda console=ttyS0 quiet' 22 23 kernel_path = None 24 kernel_params = None 25 26 # Fetch assets from the kvm-xen-guest subdir of my shared test 27 # images directory on fileserver.linaro.org where you can find 28 # build instructions for how they where assembled. 29 ASSET_KERNEL = Asset( 30 ('https://fileserver.linaro.org/s/kE4nCFLdQcoBF9t/download?' 31 'path=%2Fkvm-xen-guest&files=bzImage'), 32 'ec0ad7bb8c33c5982baee0a75505fe7dbf29d3ff5d44258204d6307c6fe0132a') 33 34 ASSET_ROOTFS = Asset( 35 ('https://fileserver.linaro.org/s/kE4nCFLdQcoBF9t/download?' 36 'path=%2Fkvm-xen-guest&files=rootfs.ext4'), 37 'b11045d649006c649c184e93339aaa41a8fe20a1a86620af70323252eb29e40b') 38 39 def common_vm_setup(self): 40 # We also catch lack of KVM_XEN support if we fail to launch 41 self.require_accelerator("kvm") 42 self.require_netdev('user') 43 44 self.vm.set_console() 45 46 self.vm.add_args("-accel", "kvm,xen-version=0x4000a,kernel-irqchip=split") 47 self.vm.add_args("-smp", "2") 48 49 self.kernel_path = self.ASSET_KERNEL.fetch() 50 self.rootfs = self.ASSET_ROOTFS.fetch() 51 52 def run_and_check(self): 53 self.vm.add_args('-kernel', self.kernel_path, 54 '-append', self.kernel_params, 55 '-drive', f"file={self.rootfs},if=none,snapshot=on,format=raw,id=drv0", 56 '-device', 'xen-disk,drive=drv0,vdev=xvda', 57 '-device', 'virtio-net-pci,netdev=unet', 58 '-netdev', 'user,id=unet,hostfwd=:127.0.0.1:0-:22') 59 60 try: 61 self.vm.launch() 62 except machine.VMLaunchFailure as e: 63 if "Xen HVM guest support not present" in e.output: 64 self.skipTest("KVM Xen support is not present " 65 "(need v5.12+ kernel with CONFIG_KVM_XEN)") 66 elif "Property 'kvm-accel.xen-version' not found" in e.output: 67 self.skipTest("QEMU not built with CONFIG_XEN_EMU support") 68 else: 69 raise e 70 71 self.log.info('VM launched, waiting for sshd') 72 console_pattern = 'Starting dropbear sshd: OK' 73 wait_for_console_pattern(self, console_pattern, 'Oops') 74 self.log.info('sshd ready') 75 76 exec_command_and_wait_for_pattern(self, 'cat /proc/cmdline', 'xen') 77 exec_command_and_wait_for_pattern(self, 'dmesg | grep "Grant table"', 78 'Grant table initialized') 79 wait_for_console_pattern(self, '#', 'Oops') 80 81 def test_kvm_xen_guest(self): 82 self.common_vm_setup() 83 84 self.kernel_params = (self.KERNEL_DEFAULT + 85 ' xen_emul_unplug=ide-disks') 86 self.run_and_check() 87 exec_command_and_wait_for_pattern(self, 88 'grep xen-pirq.*msi /proc/interrupts', 89 'virtio0-output') 90 91 def test_kvm_xen_guest_nomsi(self): 92 self.common_vm_setup() 93 94 self.kernel_params = (self.KERNEL_DEFAULT + 95 ' xen_emul_unplug=ide-disks pci=nomsi') 96 self.run_and_check() 97 exec_command_and_wait_for_pattern(self, 98 'grep xen-pirq.* /proc/interrupts', 99 'virtio0') 100 101 def test_kvm_xen_guest_noapic_nomsi(self): 102 self.common_vm_setup() 103 104 self.kernel_params = (self.KERNEL_DEFAULT + 105 ' xen_emul_unplug=ide-disks noapic pci=nomsi') 106 self.run_and_check() 107 exec_command_and_wait_for_pattern(self, 108 'grep xen-pirq /proc/interrupts', 109 'virtio0') 110 111 def test_kvm_xen_guest_vapic(self): 112 self.common_vm_setup() 113 self.vm.add_args('-cpu', 'host,+xen-vapic') 114 self.kernel_params = (self.KERNEL_DEFAULT + 115 ' xen_emul_unplug=ide-disks') 116 self.run_and_check() 117 exec_command_and_wait_for_pattern(self, 118 'grep xen-pirq /proc/interrupts', 119 'acpi') 120 wait_for_console_pattern(self, '#') 121 exec_command_and_wait_for_pattern(self, 122 'grep PCI-MSI /proc/interrupts', 123 'virtio0-output') 124 125 def test_kvm_xen_guest_novector(self): 126 self.common_vm_setup() 127 self.kernel_params = (self.KERNEL_DEFAULT + 128 ' xen_emul_unplug=ide-disks' + 129 ' xen_no_vector_callback') 130 self.run_and_check() 131 exec_command_and_wait_for_pattern(self, 132 'grep xen-platform-pci /proc/interrupts', 133 'fasteoi') 134 135 def test_kvm_xen_guest_novector_nomsi(self): 136 self.common_vm_setup() 137 138 self.kernel_params = (self.KERNEL_DEFAULT + 139 ' xen_emul_unplug=ide-disks pci=nomsi' + 140 ' xen_no_vector_callback') 141 self.run_and_check() 142 exec_command_and_wait_for_pattern(self, 143 'grep xen-platform-pci /proc/interrupts', 144 'IO-APIC') 145 146 def test_kvm_xen_guest_novector_noapic(self): 147 self.common_vm_setup() 148 self.kernel_params = (self.KERNEL_DEFAULT + 149 ' xen_emul_unplug=ide-disks' + 150 ' xen_no_vector_callback noapic') 151 self.run_and_check() 152 exec_command_and_wait_for_pattern(self, 153 'grep xen-platform-pci /proc/interrupts', 154 'XT-PIC') 155 156if __name__ == '__main__': 157 QemuSystemTest.main() 158