qemu with hax to log dma reads & writes jcs.org/2018/11/12/vfio
at master 86 lines 3.3 kB view raw
1# Linux initrd acceptance test. 2# 3# Copyright (c) 2018 Red Hat, Inc. 4# 5# Author: 6# Wainer dos Santos Moschetta <wainersm@redhat.com> 7# 8# This work is licensed under the terms of the GNU GPL, version 2 or 9# later. See the COPYING file in the top-level directory. 10 11import logging 12import tempfile 13 14from avocado_qemu import Test 15 16 17class LinuxInitrd(Test): 18 """ 19 Checks QEMU evaluates correctly the initrd file passed as -initrd option. 20 21 :avocado: tags=arch:x86_64 22 :avocado: tags=machine:pc 23 """ 24 25 timeout = 300 26 27 def test_with_2gib_file_should_exit_error_msg_with_linux_v3_6(self): 28 """ 29 Pretends to boot QEMU with an initrd file with size of 2GiB 30 and expect it exits with error message. 31 Fedora-18 shipped with linux-3.6 which have not supported xloadflags 32 cannot support more than 2GiB initrd. 33 """ 34 kernel_url = ('https://archives.fedoraproject.org/pub/archive/fedora/li' 35 'nux/releases/18/Fedora/x86_64/os/images/pxeboot/vmlinuz') 36 kernel_hash = '41464f68efe42b9991250bed86c7081d2ccdbb21' 37 kernel_path = self.fetch_asset(kernel_url, asset_hash=kernel_hash) 38 max_size = 2 * (1024 ** 3) - 1 39 40 with tempfile.NamedTemporaryFile() as initrd: 41 initrd.seek(max_size) 42 initrd.write(b'\0') 43 initrd.flush() 44 self.vm.add_args('-kernel', kernel_path, '-initrd', initrd.name, 45 '-m', '4096') 46 self.vm.set_qmp_monitor(enabled=False) 47 self.vm.launch() 48 self.vm.wait() 49 self.assertEqual(self.vm.exitcode(), 1) 50 expected_msg = r'.*initrd is too large.*max: \d+, need %s.*' % ( 51 max_size + 1) 52 self.assertRegex(self.vm.get_log(), expected_msg) 53 54 def test_with_2gib_file_should_work_with_linux_v4_16(self): 55 """ 56 QEMU has supported up to 4 GiB initrd for recent kernel 57 Expect guest can reach 'Unpacking initramfs...' 58 """ 59 kernel_url = ('https://archives.fedoraproject.org/pub/archive/fedora' 60 '/linux/releases/28/Everything/x86_64/os/images/pxeboot/' 61 'vmlinuz') 62 kernel_hash = '238e083e114c48200f80d889f7e32eeb2793e02a' 63 kernel_path = self.fetch_asset(kernel_url, asset_hash=kernel_hash) 64 max_size = 2 * (1024 ** 3) + 1 65 66 with tempfile.NamedTemporaryFile() as initrd: 67 initrd.seek(max_size) 68 initrd.write(b'\0') 69 initrd.flush() 70 71 self.vm.set_console() 72 kernel_command_line = 'console=ttyS0' 73 self.vm.add_args('-kernel', kernel_path, 74 '-append', kernel_command_line, 75 '-initrd', initrd.name, 76 '-m', '5120') 77 self.vm.launch() 78 console = self.vm.console_socket.makefile() 79 console_logger = logging.getLogger('console') 80 while True: 81 msg = console.readline() 82 console_logger.debug(msg.strip()) 83 if 'Unpacking initramfs...' in msg: 84 break 85 if 'Kernel panic - not syncing' in msg: 86 self.fail("Kernel panic reached")