boot_linux_console.py (55007B)
1 # Functional test that boots a Linux kernel and checks the console 2 # 3 # Copyright (c) 2018 Red Hat, Inc. 4 # 5 # Author: 6 # Cleber Rosa <crosa@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 11 import os 12 import lzma 13 import gzip 14 import shutil 15 16 from avocado import skip 17 from avocado import skipUnless 18 from avocado import skipIf 19 from avocado_qemu import QemuSystemTest 20 from avocado_qemu import exec_command 21 from avocado_qemu import exec_command_and_wait_for_pattern 22 from avocado_qemu import interrupt_interactive_console_until_pattern 23 from avocado_qemu import wait_for_console_pattern 24 from avocado.utils import process 25 from avocado.utils import archive 26 27 """ 28 Round up to next power of 2 29 """ 30 def pow2ceil(x): 31 return 1 if x == 0 else 2**(x - 1).bit_length() 32 33 """ 34 Expand file size to next power of 2 35 """ 36 def image_pow2ceil_expand(path): 37 size = os.path.getsize(path) 38 size_aligned = pow2ceil(size) 39 if size != size_aligned: 40 with open(path, 'ab+') as fd: 41 fd.truncate(size_aligned) 42 43 class LinuxKernelTest(QemuSystemTest): 44 KERNEL_COMMON_COMMAND_LINE = 'printk.time=0 ' 45 46 def wait_for_console_pattern(self, success_message, vm=None): 47 wait_for_console_pattern(self, success_message, 48 failure_message='Kernel panic - not syncing', 49 vm=vm) 50 51 def extract_from_deb(self, deb, path): 52 """ 53 Extracts a file from a deb package into the test workdir 54 55 :param deb: path to the deb archive 56 :param path: path within the deb archive of the file to be extracted 57 :returns: path of the extracted file 58 """ 59 cwd = os.getcwd() 60 os.chdir(self.workdir) 61 file_path = process.run("ar t %s" % deb).stdout_text.split()[2] 62 process.run("ar x %s %s" % (deb, file_path)) 63 archive.extract(file_path, self.workdir) 64 os.chdir(cwd) 65 # Return complete path to extracted file. Because callers to 66 # extract_from_deb() specify 'path' with a leading slash, it is 67 # necessary to use os.path.relpath() as otherwise os.path.join() 68 # interprets it as an absolute path and drops the self.workdir part. 69 return os.path.normpath(os.path.join(self.workdir, 70 os.path.relpath(path, '/'))) 71 72 def extract_from_rpm(self, rpm, path): 73 """ 74 Extracts a file from an RPM package into the test workdir. 75 76 :param rpm: path to the rpm archive 77 :param path: path within the rpm archive of the file to be extracted 78 needs to be a relative path (starting with './') because 79 cpio(1), which is used to extract the file, expects that. 80 :returns: path of the extracted file 81 """ 82 cwd = os.getcwd() 83 os.chdir(self.workdir) 84 process.run("rpm2cpio %s | cpio -id %s" % (rpm, path), shell=True) 85 os.chdir(cwd) 86 return os.path.normpath(os.path.join(self.workdir, path)) 87 88 class BootLinuxConsole(LinuxKernelTest): 89 """ 90 Boots a Linux kernel and checks that the console is operational and the 91 kernel command line is properly passed from QEMU to the kernel 92 """ 93 timeout = 90 94 95 def test_x86_64_pc(self): 96 """ 97 :avocado: tags=arch:x86_64 98 :avocado: tags=machine:pc 99 """ 100 kernel_url = ('https://archives.fedoraproject.org/pub/archive/fedora' 101 '/linux/releases/29/Everything/x86_64/os/images/pxeboot' 102 '/vmlinuz') 103 kernel_hash = '23bebd2680757891cf7adedb033532163a792495' 104 kernel_path = self.fetch_asset(kernel_url, asset_hash=kernel_hash) 105 106 self.vm.set_console() 107 kernel_command_line = self.KERNEL_COMMON_COMMAND_LINE + 'console=ttyS0' 108 self.vm.add_args('-kernel', kernel_path, 109 '-append', kernel_command_line) 110 self.vm.launch() 111 console_pattern = 'Kernel command line: %s' % kernel_command_line 112 self.wait_for_console_pattern(console_pattern) 113 114 def test_mips_malta(self): 115 """ 116 :avocado: tags=arch:mips 117 :avocado: tags=machine:malta 118 :avocado: tags=endian:big 119 """ 120 deb_url = ('http://snapshot.debian.org/archive/debian/' 121 '20130217T032700Z/pool/main/l/linux-2.6/' 122 'linux-image-2.6.32-5-4kc-malta_2.6.32-48_mips.deb') 123 deb_hash = 'a8cfc28ad8f45f54811fc6cf74fc43ffcfe0ba04' 124 deb_path = self.fetch_asset(deb_url, asset_hash=deb_hash) 125 kernel_path = self.extract_from_deb(deb_path, 126 '/boot/vmlinux-2.6.32-5-4kc-malta') 127 128 self.vm.set_console() 129 kernel_command_line = self.KERNEL_COMMON_COMMAND_LINE + 'console=ttyS0' 130 self.vm.add_args('-kernel', kernel_path, 131 '-append', kernel_command_line) 132 self.vm.launch() 133 console_pattern = 'Kernel command line: %s' % kernel_command_line 134 self.wait_for_console_pattern(console_pattern) 135 136 def test_mips64el_malta(self): 137 """ 138 This test requires the ar tool to extract "data.tar.gz" from 139 the Debian package. 140 141 The kernel can be rebuilt using this Debian kernel source [1] and 142 following the instructions on [2]. 143 144 [1] http://snapshot.debian.org/package/linux-2.6/2.6.32-48/ 145 #linux-source-2.6.32_2.6.32-48 146 [2] https://kernel-team.pages.debian.net/kernel-handbook/ 147 ch-common-tasks.html#s-common-official 148 149 :avocado: tags=arch:mips64el 150 :avocado: tags=machine:malta 151 """ 152 deb_url = ('http://snapshot.debian.org/archive/debian/' 153 '20130217T032700Z/pool/main/l/linux-2.6/' 154 'linux-image-2.6.32-5-5kc-malta_2.6.32-48_mipsel.deb') 155 deb_hash = '1aaec92083bf22fda31e0d27fa8d9a388e5fc3d5' 156 deb_path = self.fetch_asset(deb_url, asset_hash=deb_hash) 157 kernel_path = self.extract_from_deb(deb_path, 158 '/boot/vmlinux-2.6.32-5-5kc-malta') 159 160 self.vm.set_console() 161 kernel_command_line = self.KERNEL_COMMON_COMMAND_LINE + 'console=ttyS0' 162 self.vm.add_args('-kernel', kernel_path, 163 '-append', kernel_command_line) 164 self.vm.launch() 165 console_pattern = 'Kernel command line: %s' % kernel_command_line 166 self.wait_for_console_pattern(console_pattern) 167 168 def test_mips64el_fuloong2e(self): 169 """ 170 :avocado: tags=arch:mips64el 171 :avocado: tags=machine:fuloong2e 172 :avocado: tags=endian:little 173 """ 174 deb_url = ('http://archive.debian.org/debian/pool/main/l/linux/' 175 'linux-image-3.16.0-6-loongson-2e_3.16.56-1+deb8u1_mipsel.deb') 176 deb_hash = 'd04d446045deecf7b755ef576551de0c4184dd44' 177 deb_path = self.fetch_asset(deb_url, asset_hash=deb_hash) 178 kernel_path = self.extract_from_deb(deb_path, 179 '/boot/vmlinux-3.16.0-6-loongson-2e') 180 181 self.vm.set_console() 182 kernel_command_line = self.KERNEL_COMMON_COMMAND_LINE + 'console=ttyS0' 183 self.vm.add_args('-kernel', kernel_path, 184 '-append', kernel_command_line) 185 self.vm.launch() 186 console_pattern = 'Kernel command line: %s' % kernel_command_line 187 self.wait_for_console_pattern(console_pattern) 188 189 def test_mips_malta_cpio(self): 190 """ 191 :avocado: tags=arch:mips 192 :avocado: tags=machine:malta 193 :avocado: tags=endian:big 194 """ 195 deb_url = ('http://snapshot.debian.org/archive/debian/' 196 '20160601T041800Z/pool/main/l/linux/' 197 'linux-image-4.5.0-2-4kc-malta_4.5.5-1_mips.deb') 198 deb_hash = 'a3c84f3e88b54e06107d65a410d1d1e8e0f340f8' 199 deb_path = self.fetch_asset(deb_url, asset_hash=deb_hash) 200 kernel_path = self.extract_from_deb(deb_path, 201 '/boot/vmlinux-4.5.0-2-4kc-malta') 202 initrd_url = ('https://github.com/groeck/linux-build-test/raw/' 203 '8584a59ed9e5eb5ee7ca91f6d74bbb06619205b8/rootfs/' 204 'mips/rootfs.cpio.gz') 205 initrd_hash = 'bf806e17009360a866bf537f6de66590de349a99' 206 initrd_path_gz = self.fetch_asset(initrd_url, asset_hash=initrd_hash) 207 initrd_path = self.workdir + "rootfs.cpio" 208 archive.gzip_uncompress(initrd_path_gz, initrd_path) 209 210 self.vm.set_console() 211 kernel_command_line = (self.KERNEL_COMMON_COMMAND_LINE 212 + 'console=ttyS0 console=tty ' 213 + 'rdinit=/sbin/init noreboot') 214 self.vm.add_args('-kernel', kernel_path, 215 '-initrd', initrd_path, 216 '-append', kernel_command_line, 217 '-no-reboot') 218 self.vm.launch() 219 self.wait_for_console_pattern('Boot successful.') 220 221 exec_command_and_wait_for_pattern(self, 'cat /proc/cpuinfo', 222 'BogoMIPS') 223 exec_command_and_wait_for_pattern(self, 'uname -a', 224 'Debian') 225 exec_command_and_wait_for_pattern(self, 'reboot', 226 'reboot: Restarting system') 227 # Wait for VM to shut down gracefully 228 self.vm.wait() 229 230 @skipUnless(os.getenv('AVOCADO_ALLOW_UNTRUSTED_CODE'), 'untrusted code') 231 def test_mips64el_malta_5KEc_cpio(self): 232 """ 233 :avocado: tags=arch:mips64el 234 :avocado: tags=machine:malta 235 :avocado: tags=endian:little 236 :avocado: tags=cpu:5KEc 237 """ 238 kernel_url = ('https://github.com/philmd/qemu-testing-blob/' 239 'raw/9ad2df38/mips/malta/mips64el/' 240 'vmlinux-3.19.3.mtoman.20150408') 241 kernel_hash = '00d1d268fb9f7d8beda1de6bebcc46e884d71754' 242 kernel_path = self.fetch_asset(kernel_url, asset_hash=kernel_hash) 243 initrd_url = ('https://github.com/groeck/linux-build-test/' 244 'raw/8584a59e/rootfs/' 245 'mipsel64/rootfs.mipsel64r1.cpio.gz') 246 initrd_hash = '1dbb8a396e916847325284dbe2151167' 247 initrd_path_gz = self.fetch_asset(initrd_url, algorithm='md5', 248 asset_hash=initrd_hash) 249 initrd_path = self.workdir + "rootfs.cpio" 250 archive.gzip_uncompress(initrd_path_gz, initrd_path) 251 252 self.vm.set_console() 253 kernel_command_line = (self.KERNEL_COMMON_COMMAND_LINE 254 + 'console=ttyS0 console=tty ' 255 + 'rdinit=/sbin/init noreboot') 256 self.vm.add_args('-kernel', kernel_path, 257 '-initrd', initrd_path, 258 '-append', kernel_command_line, 259 '-no-reboot') 260 self.vm.launch() 261 wait_for_console_pattern(self, 'Boot successful.') 262 263 exec_command_and_wait_for_pattern(self, 'cat /proc/cpuinfo', 264 'MIPS 5KE') 265 exec_command_and_wait_for_pattern(self, 'uname -a', 266 '3.19.3.mtoman.20150408') 267 exec_command_and_wait_for_pattern(self, 'reboot', 268 'reboot: Restarting system') 269 # Wait for VM to shut down gracefully 270 self.vm.wait() 271 272 def do_test_mips_malta32el_nanomips(self, kernel_url, kernel_hash): 273 kernel_path_xz = self.fetch_asset(kernel_url, asset_hash=kernel_hash) 274 kernel_path = self.workdir + "kernel" 275 with lzma.open(kernel_path_xz, 'rb') as f_in: 276 with open(kernel_path, 'wb') as f_out: 277 shutil.copyfileobj(f_in, f_out) 278 279 self.vm.set_console() 280 kernel_command_line = (self.KERNEL_COMMON_COMMAND_LINE 281 + 'mem=256m@@0x0 ' 282 + 'console=ttyS0') 283 self.vm.add_args('-no-reboot', 284 '-kernel', kernel_path, 285 '-append', kernel_command_line) 286 self.vm.launch() 287 console_pattern = 'Kernel command line: %s' % kernel_command_line 288 self.wait_for_console_pattern(console_pattern) 289 290 def test_mips_malta32el_nanomips_4k(self): 291 """ 292 :avocado: tags=arch:mipsel 293 :avocado: tags=machine:malta 294 :avocado: tags=endian:little 295 :avocado: tags=cpu:I7200 296 """ 297 kernel_url = ('https://mipsdistros.mips.com/LinuxDistro/nanomips/' 298 'kernels/v4.15.18-432-gb2eb9a8b07a1-20180627102142/' 299 'generic_nano32r6el_page4k.xz') 300 kernel_hash = '477456aafd2a0f1ddc9482727f20fe9575565dd6' 301 self.do_test_mips_malta32el_nanomips(kernel_url, kernel_hash) 302 303 def test_mips_malta32el_nanomips_16k_up(self): 304 """ 305 :avocado: tags=arch:mipsel 306 :avocado: tags=machine:malta 307 :avocado: tags=endian:little 308 :avocado: tags=cpu:I7200 309 """ 310 kernel_url = ('https://mipsdistros.mips.com/LinuxDistro/nanomips/' 311 'kernels/v4.15.18-432-gb2eb9a8b07a1-20180627102142/' 312 'generic_nano32r6el_page16k_up.xz') 313 kernel_hash = 'e882868f944c71c816e832e2303b7874d044a7bc' 314 self.do_test_mips_malta32el_nanomips(kernel_url, kernel_hash) 315 316 def test_mips_malta32el_nanomips_64k_dbg(self): 317 """ 318 :avocado: tags=arch:mipsel 319 :avocado: tags=machine:malta 320 :avocado: tags=endian:little 321 :avocado: tags=cpu:I7200 322 """ 323 kernel_url = ('https://mipsdistros.mips.com/LinuxDistro/nanomips/' 324 'kernels/v4.15.18-432-gb2eb9a8b07a1-20180627102142/' 325 'generic_nano32r6el_page64k_dbg.xz') 326 kernel_hash = '18d1c68f2e23429e266ca39ba5349ccd0aeb7180' 327 self.do_test_mips_malta32el_nanomips(kernel_url, kernel_hash) 328 329 def test_aarch64_xlnx_versal_virt(self): 330 """ 331 :avocado: tags=arch:aarch64 332 :avocado: tags=machine:xlnx-versal-virt 333 :avocado: tags=device:pl011 334 :avocado: tags=device:arm_gicv3 335 :avocado: tags=accel:tcg 336 """ 337 images_url = ('http://ports.ubuntu.com/ubuntu-ports/dists/' 338 'bionic-updates/main/installer-arm64/' 339 '20101020ubuntu543.19/images/') 340 kernel_url = images_url + 'netboot/ubuntu-installer/arm64/linux' 341 kernel_hash = 'e167757620640eb26de0972f578741924abb3a82' 342 kernel_path = self.fetch_asset(kernel_url, asset_hash=kernel_hash) 343 344 initrd_url = images_url + 'netboot/ubuntu-installer/arm64/initrd.gz' 345 initrd_hash = 'cab5cb3fcefca8408aa5aae57f24574bfce8bdb9' 346 initrd_path = self.fetch_asset(initrd_url, asset_hash=initrd_hash) 347 348 self.vm.set_console() 349 self.vm.add_args('-m', '2G', 350 '-accel', 'tcg', 351 '-kernel', kernel_path, 352 '-initrd', initrd_path) 353 self.vm.launch() 354 self.wait_for_console_pattern('Checked W+X mappings: passed') 355 356 def test_arm_virt(self): 357 """ 358 :avocado: tags=arch:arm 359 :avocado: tags=machine:virt 360 :avocado: tags=accel:tcg 361 """ 362 kernel_url = ('https://archives.fedoraproject.org/pub/archive/fedora' 363 '/linux/releases/29/Everything/armhfp/os/images/pxeboot' 364 '/vmlinuz') 365 kernel_hash = 'e9826d741b4fb04cadba8d4824d1ed3b7fb8b4d4' 366 kernel_path = self.fetch_asset(kernel_url, asset_hash=kernel_hash) 367 368 self.vm.set_console() 369 kernel_command_line = (self.KERNEL_COMMON_COMMAND_LINE + 370 'console=ttyAMA0') 371 self.vm.add_args('-kernel', kernel_path, 372 '-append', kernel_command_line) 373 self.vm.launch() 374 console_pattern = 'Kernel command line: %s' % kernel_command_line 375 self.wait_for_console_pattern(console_pattern) 376 377 def test_arm_emcraft_sf2(self): 378 """ 379 :avocado: tags=arch:arm 380 :avocado: tags=machine:emcraft-sf2 381 :avocado: tags=endian:little 382 :avocado: tags=u-boot 383 :avocado: tags=accel:tcg 384 """ 385 self.require_netdev('user') 386 387 uboot_url = ('https://raw.githubusercontent.com/' 388 'Subbaraya-Sundeep/qemu-test-binaries/' 389 'fe371d32e50ca682391e1e70ab98c2942aeffb01/u-boot') 390 uboot_hash = 'cbb8cbab970f594bf6523b9855be209c08374ae2' 391 uboot_path = self.fetch_asset(uboot_url, asset_hash=uboot_hash) 392 spi_url = ('https://raw.githubusercontent.com/' 393 'Subbaraya-Sundeep/qemu-test-binaries/' 394 'fe371d32e50ca682391e1e70ab98c2942aeffb01/spi.bin') 395 spi_hash = '65523a1835949b6f4553be96dec1b6a38fb05501' 396 spi_path = self.fetch_asset(spi_url, asset_hash=spi_hash) 397 398 self.vm.set_console() 399 kernel_command_line = self.KERNEL_COMMON_COMMAND_LINE 400 self.vm.add_args('-kernel', uboot_path, 401 '-append', kernel_command_line, 402 '-drive', 'file=' + spi_path + ',if=mtd,format=raw', 403 '-no-reboot') 404 self.vm.launch() 405 self.wait_for_console_pattern('Enter \'help\' for a list') 406 407 exec_command_and_wait_for_pattern(self, 'ifconfig eth0 10.0.2.15', 408 'eth0: link becomes ready') 409 exec_command_and_wait_for_pattern(self, 'ping -c 3 10.0.2.2', 410 '3 packets transmitted, 3 packets received, 0% packet loss') 411 412 def do_test_arm_raspi2(self, uart_id): 413 """ 414 :avocado: tags=accel:tcg 415 416 The kernel can be rebuilt using the kernel source referenced 417 and following the instructions on the on: 418 https://www.raspberrypi.org/documentation/linux/kernel/building.md 419 """ 420 serial_kernel_cmdline = { 421 0: 'earlycon=pl011,0x3f201000 console=ttyAMA0', 422 } 423 deb_url = ('http://archive.raspberrypi.org/debian/' 424 'pool/main/r/raspberrypi-firmware/' 425 'raspberrypi-kernel_1.20190215-1_armhf.deb') 426 deb_hash = 'cd284220b32128c5084037553db3c482426f3972' 427 deb_path = self.fetch_asset(deb_url, asset_hash=deb_hash) 428 kernel_path = self.extract_from_deb(deb_path, '/boot/kernel7.img') 429 dtb_path = self.extract_from_deb(deb_path, '/boot/bcm2709-rpi-2-b.dtb') 430 431 self.vm.set_console() 432 kernel_command_line = (self.KERNEL_COMMON_COMMAND_LINE + 433 serial_kernel_cmdline[uart_id] + 434 ' root=/dev/mmcblk0p2 rootwait ' + 435 'dwc_otg.fiq_fsm_enable=0') 436 self.vm.add_args('-kernel', kernel_path, 437 '-dtb', dtb_path, 438 '-append', kernel_command_line, 439 '-device', 'usb-kbd') 440 self.vm.launch() 441 console_pattern = 'Kernel command line: %s' % kernel_command_line 442 self.wait_for_console_pattern(console_pattern) 443 console_pattern = 'Product: QEMU USB Keyboard' 444 self.wait_for_console_pattern(console_pattern) 445 446 def test_arm_raspi2_uart0(self): 447 """ 448 :avocado: tags=arch:arm 449 :avocado: tags=machine:raspi2b 450 :avocado: tags=device:pl011 451 :avocado: tags=accel:tcg 452 """ 453 self.do_test_arm_raspi2(0) 454 455 def test_arm_raspi2_initrd(self): 456 """ 457 :avocado: tags=arch:arm 458 :avocado: tags=machine:raspi2b 459 """ 460 deb_url = ('http://archive.raspberrypi.org/debian/' 461 'pool/main/r/raspberrypi-firmware/' 462 'raspberrypi-kernel_1.20190215-1_armhf.deb') 463 deb_hash = 'cd284220b32128c5084037553db3c482426f3972' 464 deb_path = self.fetch_asset(deb_url, asset_hash=deb_hash) 465 kernel_path = self.extract_from_deb(deb_path, '/boot/kernel7.img') 466 dtb_path = self.extract_from_deb(deb_path, '/boot/bcm2709-rpi-2-b.dtb') 467 468 initrd_url = ('https://github.com/groeck/linux-build-test/raw/' 469 '2eb0a73b5d5a28df3170c546ddaaa9757e1e0848/rootfs/' 470 'arm/rootfs-armv7a.cpio.gz') 471 initrd_hash = '604b2e45cdf35045846b8bbfbf2129b1891bdc9c' 472 initrd_path_gz = self.fetch_asset(initrd_url, asset_hash=initrd_hash) 473 initrd_path = os.path.join(self.workdir, 'rootfs.cpio') 474 archive.gzip_uncompress(initrd_path_gz, initrd_path) 475 476 self.vm.set_console() 477 kernel_command_line = (self.KERNEL_COMMON_COMMAND_LINE + 478 'earlycon=pl011,0x3f201000 console=ttyAMA0 ' 479 'panic=-1 noreboot ' + 480 'dwc_otg.fiq_fsm_enable=0') 481 self.vm.add_args('-kernel', kernel_path, 482 '-dtb', dtb_path, 483 '-initrd', initrd_path, 484 '-append', kernel_command_line, 485 '-no-reboot') 486 self.vm.launch() 487 self.wait_for_console_pattern('Boot successful.') 488 489 exec_command_and_wait_for_pattern(self, 'cat /proc/cpuinfo', 490 'BCM2835') 491 exec_command_and_wait_for_pattern(self, 'cat /proc/iomem', 492 '/soc/cprman@7e101000') 493 exec_command_and_wait_for_pattern(self, 'halt', 'reboot: System halted') 494 # Wait for VM to shut down gracefully 495 self.vm.wait() 496 497 def test_arm_exynos4210_initrd(self): 498 """ 499 :avocado: tags=arch:arm 500 :avocado: tags=machine:smdkc210 501 :avocado: tags=accel:tcg 502 """ 503 deb_url = ('https://snapshot.debian.org/archive/debian/' 504 '20190928T224601Z/pool/main/l/linux/' 505 'linux-image-4.19.0-6-armmp_4.19.67-2+deb10u1_armhf.deb') 506 deb_hash = 'fa9df4a0d38936cb50084838f2cb933f570d7d82' 507 deb_path = self.fetch_asset(deb_url, asset_hash=deb_hash) 508 kernel_path = self.extract_from_deb(deb_path, 509 '/boot/vmlinuz-4.19.0-6-armmp') 510 dtb_path = '/usr/lib/linux-image-4.19.0-6-armmp/exynos4210-smdkv310.dtb' 511 dtb_path = self.extract_from_deb(deb_path, dtb_path) 512 513 initrd_url = ('https://github.com/groeck/linux-build-test/raw/' 514 '2eb0a73b5d5a28df3170c546ddaaa9757e1e0848/rootfs/' 515 'arm/rootfs-armv5.cpio.gz') 516 initrd_hash = '2b50f1873e113523967806f4da2afe385462ff9b' 517 initrd_path_gz = self.fetch_asset(initrd_url, asset_hash=initrd_hash) 518 initrd_path = os.path.join(self.workdir, 'rootfs.cpio') 519 archive.gzip_uncompress(initrd_path_gz, initrd_path) 520 521 self.vm.set_console() 522 kernel_command_line = (self.KERNEL_COMMON_COMMAND_LINE + 523 'earlycon=exynos4210,0x13800000 earlyprintk ' + 524 'console=ttySAC0,115200n8 ' + 525 'random.trust_cpu=off cryptomgr.notests ' + 526 'cpuidle.off=1 panic=-1 noreboot') 527 528 self.vm.add_args('-kernel', kernel_path, 529 '-dtb', dtb_path, 530 '-initrd', initrd_path, 531 '-append', kernel_command_line, 532 '-no-reboot') 533 self.vm.launch() 534 535 self.wait_for_console_pattern('Boot successful.') 536 # TODO user command, for now the uart is stuck 537 538 def test_arm_cubieboard_initrd(self): 539 """ 540 :avocado: tags=arch:arm 541 :avocado: tags=machine:cubieboard 542 :avocado: tags=accel:tcg 543 """ 544 deb_url = ('https://apt.armbian.com/pool/main/l/' 545 'linux-5.10.16-sunxi/linux-image-current-sunxi_21.02.2_armhf.deb') 546 deb_hash = '9fa84beda245cabf0b4fa84cf6eaa7738ead1da0' 547 deb_path = self.fetch_asset(deb_url, asset_hash=deb_hash) 548 kernel_path = self.extract_from_deb(deb_path, 549 '/boot/vmlinuz-5.10.16-sunxi') 550 dtb_path = '/usr/lib/linux-image-current-sunxi/sun4i-a10-cubieboard.dtb' 551 dtb_path = self.extract_from_deb(deb_path, dtb_path) 552 initrd_url = ('https://github.com/groeck/linux-build-test/raw/' 553 '2eb0a73b5d5a28df3170c546ddaaa9757e1e0848/rootfs/' 554 'arm/rootfs-armv5.cpio.gz') 555 initrd_hash = '2b50f1873e113523967806f4da2afe385462ff9b' 556 initrd_path_gz = self.fetch_asset(initrd_url, asset_hash=initrd_hash) 557 initrd_path = os.path.join(self.workdir, 'rootfs.cpio') 558 archive.gzip_uncompress(initrd_path_gz, initrd_path) 559 560 self.vm.set_console() 561 kernel_command_line = (self.KERNEL_COMMON_COMMAND_LINE + 562 'console=ttyS0,115200 ' 563 'usbcore.nousb ' 564 'panic=-1 noreboot') 565 self.vm.add_args('-kernel', kernel_path, 566 '-dtb', dtb_path, 567 '-initrd', initrd_path, 568 '-append', kernel_command_line, 569 '-no-reboot') 570 self.vm.launch() 571 self.wait_for_console_pattern('Boot successful.') 572 573 exec_command_and_wait_for_pattern(self, 'cat /proc/cpuinfo', 574 'Allwinner sun4i/sun5i') 575 exec_command_and_wait_for_pattern(self, 'cat /proc/iomem', 576 'system-control@1c00000') 577 # cubieboard's reboot is not functioning; omit reboot test. 578 579 def test_arm_cubieboard_sata(self): 580 """ 581 :avocado: tags=arch:arm 582 :avocado: tags=machine:cubieboard 583 :avocado: tags=accel:tcg 584 """ 585 deb_url = ('https://apt.armbian.com/pool/main/l/' 586 'linux-5.10.16-sunxi/linux-image-current-sunxi_21.02.2_armhf.deb') 587 deb_hash = '9fa84beda245cabf0b4fa84cf6eaa7738ead1da0' 588 deb_path = self.fetch_asset(deb_url, asset_hash=deb_hash) 589 kernel_path = self.extract_from_deb(deb_path, 590 '/boot/vmlinuz-5.10.16-sunxi') 591 dtb_path = '/usr/lib/linux-image-current-sunxi/sun4i-a10-cubieboard.dtb' 592 dtb_path = self.extract_from_deb(deb_path, dtb_path) 593 rootfs_url = ('https://github.com/groeck/linux-build-test/raw/' 594 '2eb0a73b5d5a28df3170c546ddaaa9757e1e0848/rootfs/' 595 'arm/rootfs-armv5.ext2.gz') 596 rootfs_hash = '093e89d2b4d982234bf528bc9fb2f2f17a9d1f93' 597 rootfs_path_gz = self.fetch_asset(rootfs_url, asset_hash=rootfs_hash) 598 rootfs_path = os.path.join(self.workdir, 'rootfs.cpio') 599 archive.gzip_uncompress(rootfs_path_gz, rootfs_path) 600 601 self.vm.set_console() 602 kernel_command_line = (self.KERNEL_COMMON_COMMAND_LINE + 603 'console=ttyS0,115200 ' 604 'usbcore.nousb ' 605 'root=/dev/sda ro ' 606 'panic=-1 noreboot') 607 self.vm.add_args('-kernel', kernel_path, 608 '-dtb', dtb_path, 609 '-drive', 'if=none,format=raw,id=disk0,file=' 610 + rootfs_path, 611 '-device', 'ide-hd,bus=ide.0,drive=disk0', 612 '-append', kernel_command_line, 613 '-no-reboot') 614 self.vm.launch() 615 self.wait_for_console_pattern('Boot successful.') 616 617 exec_command_and_wait_for_pattern(self, 'cat /proc/cpuinfo', 618 'Allwinner sun4i/sun5i') 619 exec_command_and_wait_for_pattern(self, 'cat /proc/partitions', 620 'sda') 621 # cubieboard's reboot is not functioning; omit reboot test. 622 623 @skipUnless(os.getenv('AVOCADO_TIMEOUT_EXPECTED'), 'Test might timeout') 624 def test_arm_quanta_gsj(self): 625 """ 626 :avocado: tags=arch:arm 627 :avocado: tags=machine:quanta-gsj 628 :avocado: tags=accel:tcg 629 """ 630 # 25 MiB compressed, 32 MiB uncompressed. 631 image_url = ( 632 'https://github.com/hskinnemoen/openbmc/releases/download/' 633 '20200711-gsj-qemu-0/obmc-phosphor-image-gsj.static.mtd.gz') 634 image_hash = '14895e634923345cb5c8776037ff7876df96f6b1' 635 image_path_gz = self.fetch_asset(image_url, asset_hash=image_hash) 636 image_name = 'obmc.mtd' 637 image_path = os.path.join(self.workdir, image_name) 638 archive.gzip_uncompress(image_path_gz, image_path) 639 640 self.vm.set_console() 641 drive_args = 'file=' + image_path + ',if=mtd,bus=0,unit=0' 642 self.vm.add_args('-drive', drive_args) 643 self.vm.launch() 644 645 # Disable drivers and services that stall for a long time during boot, 646 # to avoid running past the 90-second timeout. These may be removed 647 # as the corresponding device support is added. 648 kernel_command_line = self.KERNEL_COMMON_COMMAND_LINE + ( 649 'console=${console} ' 650 'mem=${mem} ' 651 'initcall_blacklist=npcm_i2c_bus_driver_init ' 652 'systemd.mask=systemd-random-seed.service ' 653 'systemd.mask=dropbearkey.service ' 654 ) 655 656 self.wait_for_console_pattern('> BootBlock by Nuvoton') 657 self.wait_for_console_pattern('>Device: Poleg BMC NPCM730') 658 self.wait_for_console_pattern('>Skip DDR init.') 659 self.wait_for_console_pattern('U-Boot ') 660 interrupt_interactive_console_until_pattern( 661 self, 'Hit any key to stop autoboot:', 'U-Boot>') 662 exec_command_and_wait_for_pattern( 663 self, "setenv bootargs ${bootargs} " + kernel_command_line, 664 'U-Boot>') 665 exec_command_and_wait_for_pattern( 666 self, 'run romboot', 'Booting Kernel from flash') 667 self.wait_for_console_pattern('Booting Linux on physical CPU 0x0') 668 self.wait_for_console_pattern('CPU1: thread -1, cpu 1, socket 0') 669 self.wait_for_console_pattern('OpenBMC Project Reference Distro') 670 self.wait_for_console_pattern('gsj login:') 671 672 def test_arm_quanta_gsj_initrd(self): 673 """ 674 :avocado: tags=arch:arm 675 :avocado: tags=machine:quanta-gsj 676 :avocado: tags=accel:tcg 677 """ 678 initrd_url = ( 679 'https://github.com/hskinnemoen/openbmc/releases/download/' 680 '20200711-gsj-qemu-0/obmc-phosphor-initramfs-gsj.cpio.xz') 681 initrd_hash = '98fefe5d7e56727b1eb17d5c00311b1b5c945300' 682 initrd_path = self.fetch_asset(initrd_url, asset_hash=initrd_hash) 683 kernel_url = ( 684 'https://github.com/hskinnemoen/openbmc/releases/download/' 685 '20200711-gsj-qemu-0/uImage-gsj.bin') 686 kernel_hash = 'fa67b2f141d56d39b3c54305c0e8a899c99eb2c7' 687 kernel_path = self.fetch_asset(kernel_url, asset_hash=kernel_hash) 688 dtb_url = ( 689 'https://github.com/hskinnemoen/openbmc/releases/download/' 690 '20200711-gsj-qemu-0/nuvoton-npcm730-gsj.dtb') 691 dtb_hash = '18315f7006d7b688d8312d5c727eecd819aa36a4' 692 dtb_path = self.fetch_asset(dtb_url, asset_hash=dtb_hash) 693 694 self.vm.set_console() 695 kernel_command_line = (self.KERNEL_COMMON_COMMAND_LINE + 696 'console=ttyS0,115200n8 ' 697 'earlycon=uart8250,mmio32,0xf0001000') 698 self.vm.add_args('-kernel', kernel_path, 699 '-initrd', initrd_path, 700 '-dtb', dtb_path, 701 '-append', kernel_command_line) 702 self.vm.launch() 703 704 self.wait_for_console_pattern('Booting Linux on physical CPU 0x0') 705 self.wait_for_console_pattern('CPU1: thread -1, cpu 1, socket 0') 706 self.wait_for_console_pattern( 707 'Give root password for system maintenance') 708 709 def test_arm_orangepi(self): 710 """ 711 :avocado: tags=arch:arm 712 :avocado: tags=machine:orangepi-pc 713 :avocado: tags=accel:tcg 714 """ 715 deb_url = ('https://apt.armbian.com/pool/main/l/' 716 'linux-5.10.16-sunxi/linux-image-current-sunxi_21.02.2_armhf.deb') 717 deb_hash = '9fa84beda245cabf0b4fa84cf6eaa7738ead1da0' 718 deb_path = self.fetch_asset(deb_url, asset_hash=deb_hash) 719 kernel_path = self.extract_from_deb(deb_path, 720 '/boot/vmlinuz-5.10.16-sunxi') 721 dtb_path = '/usr/lib/linux-image-current-sunxi/sun8i-h3-orangepi-pc.dtb' 722 dtb_path = self.extract_from_deb(deb_path, dtb_path) 723 724 self.vm.set_console() 725 kernel_command_line = (self.KERNEL_COMMON_COMMAND_LINE + 726 'console=ttyS0,115200n8 ' 727 'earlycon=uart,mmio32,0x1c28000') 728 self.vm.add_args('-kernel', kernel_path, 729 '-dtb', dtb_path, 730 '-append', kernel_command_line) 731 self.vm.launch() 732 console_pattern = 'Kernel command line: %s' % kernel_command_line 733 self.wait_for_console_pattern(console_pattern) 734 735 def test_arm_orangepi_initrd(self): 736 """ 737 :avocado: tags=arch:arm 738 :avocado: tags=accel:tcg 739 :avocado: tags=machine:orangepi-pc 740 """ 741 deb_url = ('https://apt.armbian.com/pool/main/l/' 742 'linux-5.10.16-sunxi/linux-image-current-sunxi_21.02.2_armhf.deb') 743 deb_hash = '9fa84beda245cabf0b4fa84cf6eaa7738ead1da0' 744 deb_path = self.fetch_asset(deb_url, asset_hash=deb_hash) 745 kernel_path = self.extract_from_deb(deb_path, 746 '/boot/vmlinuz-5.10.16-sunxi') 747 dtb_path = '/usr/lib/linux-image-current-sunxi/sun8i-h3-orangepi-pc.dtb' 748 dtb_path = self.extract_from_deb(deb_path, dtb_path) 749 initrd_url = ('https://github.com/groeck/linux-build-test/raw/' 750 '2eb0a73b5d5a28df3170c546ddaaa9757e1e0848/rootfs/' 751 'arm/rootfs-armv7a.cpio.gz') 752 initrd_hash = '604b2e45cdf35045846b8bbfbf2129b1891bdc9c' 753 initrd_path_gz = self.fetch_asset(initrd_url, asset_hash=initrd_hash) 754 initrd_path = os.path.join(self.workdir, 'rootfs.cpio') 755 archive.gzip_uncompress(initrd_path_gz, initrd_path) 756 757 self.vm.set_console() 758 kernel_command_line = (self.KERNEL_COMMON_COMMAND_LINE + 759 'console=ttyS0,115200 ' 760 'panic=-1 noreboot') 761 self.vm.add_args('-kernel', kernel_path, 762 '-dtb', dtb_path, 763 '-initrd', initrd_path, 764 '-append', kernel_command_line, 765 '-no-reboot') 766 self.vm.launch() 767 self.wait_for_console_pattern('Boot successful.') 768 769 exec_command_and_wait_for_pattern(self, 'cat /proc/cpuinfo', 770 'Allwinner sun8i Family') 771 exec_command_and_wait_for_pattern(self, 'cat /proc/iomem', 772 'system-control@1c00000') 773 exec_command_and_wait_for_pattern(self, 'reboot', 774 'reboot: Restarting system') 775 # Wait for VM to shut down gracefully 776 self.vm.wait() 777 778 def test_arm_orangepi_sd(self): 779 """ 780 :avocado: tags=arch:arm 781 :avocado: tags=accel:tcg 782 :avocado: tags=machine:orangepi-pc 783 :avocado: tags=device:sd 784 """ 785 self.require_netdev('user') 786 787 deb_url = ('https://apt.armbian.com/pool/main/l/' 788 'linux-5.10.16-sunxi/linux-image-current-sunxi_21.02.2_armhf.deb') 789 deb_hash = '9fa84beda245cabf0b4fa84cf6eaa7738ead1da0' 790 deb_path = self.fetch_asset(deb_url, asset_hash=deb_hash) 791 kernel_path = self.extract_from_deb(deb_path, 792 '/boot/vmlinuz-5.10.16-sunxi') 793 dtb_path = '/usr/lib/linux-image-current-sunxi/sun8i-h3-orangepi-pc.dtb' 794 dtb_path = self.extract_from_deb(deb_path, dtb_path) 795 rootfs_url = ('http://storage.kernelci.org/images/rootfs/buildroot/' 796 'buildroot-baseline/20221116.0/armel/rootfs.ext2.xz') 797 rootfs_hash = 'fae32f337c7b87547b10f42599acf109da8b6d9a' 798 rootfs_path_xz = self.fetch_asset(rootfs_url, asset_hash=rootfs_hash) 799 rootfs_path = os.path.join(self.workdir, 'rootfs.cpio') 800 archive.lzma_uncompress(rootfs_path_xz, rootfs_path) 801 image_pow2ceil_expand(rootfs_path) 802 803 self.vm.set_console() 804 kernel_command_line = (self.KERNEL_COMMON_COMMAND_LINE + 805 'console=ttyS0,115200 ' 806 'root=/dev/mmcblk0 rootwait rw ' 807 'panic=-1 noreboot') 808 self.vm.add_args('-kernel', kernel_path, 809 '-dtb', dtb_path, 810 '-drive', 'file=' + rootfs_path + ',if=sd,format=raw', 811 '-append', kernel_command_line, 812 '-no-reboot') 813 self.vm.launch() 814 shell_ready = "/bin/sh: can't access tty; job control turned off" 815 self.wait_for_console_pattern(shell_ready) 816 817 exec_command_and_wait_for_pattern(self, 'cat /proc/cpuinfo', 818 'Allwinner sun8i Family') 819 exec_command_and_wait_for_pattern(self, 'cat /proc/partitions', 820 'mmcblk0') 821 exec_command_and_wait_for_pattern(self, 'ifconfig eth0 up', 822 'eth0: Link is Up') 823 exec_command_and_wait_for_pattern(self, 'udhcpc eth0', 824 'udhcpc: lease of 10.0.2.15 obtained') 825 exec_command_and_wait_for_pattern(self, 'ping -c 3 10.0.2.2', 826 '3 packets transmitted, 3 packets received, 0% packet loss') 827 exec_command_and_wait_for_pattern(self, 'reboot', 828 'reboot: Restarting system') 829 # Wait for VM to shut down gracefully 830 self.vm.wait() 831 832 @skipUnless(os.getenv('AVOCADO_ALLOW_LARGE_STORAGE'), 'storage limited') 833 def test_arm_orangepi_bionic_20_08(self): 834 """ 835 :avocado: tags=arch:arm 836 :avocado: tags=machine:orangepi-pc 837 :avocado: tags=device:sd 838 """ 839 840 # This test download a 275 MiB compressed image and expand it 841 # to 1036 MiB, but the underlying filesystem is 1552 MiB... 842 # As we expand it to 2 GiB we are safe. 843 844 image_url = ('https://archive.armbian.com/orangepipc/archive/' 845 'Armbian_20.08.1_Orangepipc_bionic_current_5.8.5.img.xz') 846 image_hash = ('b4d6775f5673486329e45a0586bf06b6' 847 'dbe792199fd182ac6b9c7bb6c7d3e6dd') 848 image_path_xz = self.fetch_asset(image_url, asset_hash=image_hash, 849 algorithm='sha256') 850 image_path = archive.extract(image_path_xz, self.workdir) 851 image_pow2ceil_expand(image_path) 852 853 self.vm.set_console() 854 self.vm.add_args('-drive', 'file=' + image_path + ',if=sd,format=raw', 855 '-nic', 'user', 856 '-no-reboot') 857 self.vm.launch() 858 859 kernel_command_line = (self.KERNEL_COMMON_COMMAND_LINE + 860 'console=ttyS0,115200 ' 861 'loglevel=7 ' 862 'nosmp ' 863 'systemd.default_timeout_start_sec=9000 ' 864 'systemd.mask=armbian-zram-config.service ' 865 'systemd.mask=armbian-ramlog.service') 866 867 self.wait_for_console_pattern('U-Boot SPL') 868 self.wait_for_console_pattern('Autoboot in ') 869 exec_command_and_wait_for_pattern(self, ' ', '=>') 870 exec_command_and_wait_for_pattern(self, "setenv extraargs '" + 871 kernel_command_line + "'", '=>') 872 exec_command_and_wait_for_pattern(self, 'boot', 'Starting kernel ...'); 873 874 self.wait_for_console_pattern('systemd[1]: Set hostname ' + 875 'to <orangepipc>') 876 self.wait_for_console_pattern('Starting Load Kernel Modules...') 877 878 @skipUnless(os.getenv('AVOCADO_ALLOW_LARGE_STORAGE'), 'storage limited') 879 def test_arm_orangepi_uboot_netbsd9(self): 880 """ 881 :avocado: tags=arch:arm 882 :avocado: tags=machine:orangepi-pc 883 :avocado: tags=device:sd 884 :avocado: tags=os:netbsd 885 """ 886 # This test download a 304MB compressed image and expand it to 2GB 887 deb_url = ('http://snapshot.debian.org/archive/debian/' 888 '20200108T145233Z/pool/main/u/u-boot/' 889 'u-boot-sunxi_2020.01%2Bdfsg-1_armhf.deb') 890 deb_hash = 'f67f404a80753ca3d1258f13e38f2b060e13db99' 891 deb_path = self.fetch_asset(deb_url, asset_hash=deb_hash) 892 # We use the common OrangePi PC 'plus' build of U-Boot for our secondary 893 # program loader (SPL). We will then set the path to the more specific 894 # OrangePi "PC" device tree blob with 'setenv fdtfile' in U-Boot prompt, 895 # before to boot NetBSD. 896 uboot_path = '/usr/lib/u-boot/orangepi_plus/u-boot-sunxi-with-spl.bin' 897 uboot_path = self.extract_from_deb(deb_path, uboot_path) 898 image_url = ('https://cdn.netbsd.org/pub/NetBSD/NetBSD-9.0/' 899 'evbarm-earmv7hf/binary/gzimg/armv7.img.gz') 900 image_hash = '2babb29d36d8360adcb39c09e31060945259917a' 901 image_path_gz = self.fetch_asset(image_url, asset_hash=image_hash) 902 image_path = os.path.join(self.workdir, 'armv7.img') 903 archive.gzip_uncompress(image_path_gz, image_path) 904 image_pow2ceil_expand(image_path) 905 image_drive_args = 'if=sd,format=raw,snapshot=on,file=' + image_path 906 907 # dd if=u-boot-sunxi-with-spl.bin of=armv7.img bs=1K seek=8 conv=notrunc 908 with open(uboot_path, 'rb') as f_in: 909 with open(image_path, 'r+b') as f_out: 910 f_out.seek(8 * 1024) 911 shutil.copyfileobj(f_in, f_out) 912 913 self.vm.set_console() 914 self.vm.add_args('-nic', 'user', 915 '-drive', image_drive_args, 916 '-global', 'allwinner-rtc.base-year=2000', 917 '-no-reboot') 918 self.vm.launch() 919 wait_for_console_pattern(self, 'U-Boot 2020.01+dfsg-1') 920 interrupt_interactive_console_until_pattern(self, 921 'Hit any key to stop autoboot:', 922 'switch to partitions #0, OK') 923 924 exec_command_and_wait_for_pattern(self, '', '=>') 925 cmd = 'setenv bootargs root=ld0a' 926 exec_command_and_wait_for_pattern(self, cmd, '=>') 927 cmd = 'setenv kernel netbsd-GENERIC.ub' 928 exec_command_and_wait_for_pattern(self, cmd, '=>') 929 cmd = 'setenv fdtfile dtb/sun8i-h3-orangepi-pc.dtb' 930 exec_command_and_wait_for_pattern(self, cmd, '=>') 931 cmd = ("setenv bootcmd 'fatload mmc 0:1 ${kernel_addr_r} ${kernel}; " 932 "fatload mmc 0:1 ${fdt_addr_r} ${fdtfile}; " 933 "fdt addr ${fdt_addr_r}; " 934 "bootm ${kernel_addr_r} - ${fdt_addr_r}'") 935 exec_command_and_wait_for_pattern(self, cmd, '=>') 936 937 exec_command_and_wait_for_pattern(self, 'boot', 938 'Booting kernel from Legacy Image') 939 wait_for_console_pattern(self, 'Starting kernel ...') 940 wait_for_console_pattern(self, 'NetBSD 9.0 (GENERIC)') 941 # Wait for user-space 942 wait_for_console_pattern(self, 'Starting root file system check') 943 944 def test_aarch64_raspi3_atf(self): 945 """ 946 :avocado: tags=arch:aarch64 947 :avocado: tags=machine:raspi3b 948 :avocado: tags=cpu:cortex-a53 949 :avocado: tags=device:pl011 950 :avocado: tags=atf 951 """ 952 zip_url = ('https://github.com/pbatard/RPi3/releases/download/' 953 'v1.15/RPi3_UEFI_Firmware_v1.15.zip') 954 zip_hash = '74b3bd0de92683cadb14e008a7575e1d0c3cafb9' 955 zip_path = self.fetch_asset(zip_url, asset_hash=zip_hash) 956 957 archive.extract(zip_path, self.workdir) 958 efi_fd = os.path.join(self.workdir, 'RPI_EFI.fd') 959 960 self.vm.set_console(console_index=1) 961 self.vm.add_args('-nodefaults', 962 '-device', 'loader,file=%s,force-raw=true' % efi_fd) 963 self.vm.launch() 964 self.wait_for_console_pattern('version UEFI Firmware v1.15') 965 966 def test_s390x_s390_ccw_virtio(self): 967 """ 968 :avocado: tags=arch:s390x 969 :avocado: tags=machine:s390-ccw-virtio 970 """ 971 kernel_url = ('https://archives.fedoraproject.org/pub/archive' 972 '/fedora-secondary/releases/29/Everything/s390x/os/images' 973 '/kernel.img') 974 kernel_hash = 'e8e8439103ef8053418ef062644ffd46a7919313' 975 kernel_path = self.fetch_asset(kernel_url, asset_hash=kernel_hash) 976 977 self.vm.set_console() 978 kernel_command_line = self.KERNEL_COMMON_COMMAND_LINE + 'console=sclp0' 979 self.vm.add_args('-nodefaults', 980 '-kernel', kernel_path, 981 '-append', kernel_command_line) 982 self.vm.launch() 983 console_pattern = 'Kernel command line: %s' % kernel_command_line 984 self.wait_for_console_pattern(console_pattern) 985 986 def test_alpha_clipper(self): 987 """ 988 :avocado: tags=arch:alpha 989 :avocado: tags=machine:clipper 990 """ 991 kernel_url = ('http://archive.debian.org/debian/dists/lenny/main/' 992 'installer-alpha/20090123lenny10/images/cdrom/vmlinuz') 993 kernel_hash = '3a943149335529e2ed3e74d0d787b85fb5671ba3' 994 kernel_path = self.fetch_asset(kernel_url, asset_hash=kernel_hash) 995 996 uncompressed_kernel = archive.uncompress(kernel_path, self.workdir) 997 998 self.vm.set_console() 999 kernel_command_line = self.KERNEL_COMMON_COMMAND_LINE + 'console=ttyS0' 1000 self.vm.add_args('-nodefaults', 1001 '-kernel', uncompressed_kernel, 1002 '-append', kernel_command_line) 1003 self.vm.launch() 1004 console_pattern = 'Kernel command line: %s' % kernel_command_line 1005 self.wait_for_console_pattern(console_pattern) 1006 1007 def test_m68k_q800(self): 1008 """ 1009 :avocado: tags=arch:m68k 1010 :avocado: tags=machine:q800 1011 """ 1012 deb_url = ('https://snapshot.debian.org/archive/debian-ports' 1013 '/20191021T083923Z/pool-m68k/main' 1014 '/l/linux/kernel-image-5.3.0-1-m68k-di_5.3.7-1_m68k.udeb') 1015 deb_hash = '044954bb9be4160a3ce81f8bc1b5e856b75cccd1' 1016 deb_path = self.fetch_asset(deb_url, asset_hash=deb_hash) 1017 kernel_path = self.extract_from_deb(deb_path, 1018 '/boot/vmlinux-5.3.0-1-m68k') 1019 1020 self.vm.set_console() 1021 kernel_command_line = (self.KERNEL_COMMON_COMMAND_LINE + 1022 'console=ttyS0 vga=off') 1023 self.vm.add_args('-kernel', kernel_path, 1024 '-append', kernel_command_line) 1025 self.vm.launch() 1026 console_pattern = 'Kernel command line: %s' % kernel_command_line 1027 self.wait_for_console_pattern(console_pattern) 1028 console_pattern = 'No filesystem could mount root' 1029 self.wait_for_console_pattern(console_pattern) 1030 1031 def do_test_advcal_2018(self, day, tar_hash, kernel_name, console=0): 1032 tar_url = ('https://qemu-advcal.gitlab.io' 1033 '/qac-best-of-multiarch/download/day' + day + '.tar.xz') 1034 file_path = self.fetch_asset(tar_url, asset_hash=tar_hash) 1035 archive.extract(file_path, self.workdir) 1036 self.vm.set_console(console_index=console) 1037 self.vm.add_args('-kernel', 1038 self.workdir + '/day' + day + '/' + kernel_name) 1039 self.vm.launch() 1040 self.wait_for_console_pattern('QEMU advent calendar') 1041 1042 def test_arm_vexpressa9(self): 1043 """ 1044 :avocado: tags=arch:arm 1045 :avocado: tags=machine:vexpress-a9 1046 """ 1047 tar_hash = '32b7677ce8b6f1471fb0059865f451169934245b' 1048 self.vm.add_args('-dtb', self.workdir + '/day16/vexpress-v2p-ca9.dtb') 1049 self.do_test_advcal_2018('16', tar_hash, 'winter.zImage') 1050 1051 def test_arm_ast2600_debian(self): 1052 """ 1053 :avocado: tags=arch:arm 1054 :avocado: tags=machine:tacoma-bmc 1055 """ 1056 deb_url = ('http://snapshot.debian.org/archive/debian/' 1057 '20210302T203551Z/' 1058 'pool/main/l/linux/' 1059 'linux-image-5.10.0-3-armmp_5.10.13-1_armhf.deb') 1060 deb_hash = 'db40d32fe39255d05482bea48d72467b67d6225bb2a2a4d6f618cb8976f1e09e' 1061 deb_path = self.fetch_asset(deb_url, asset_hash=deb_hash, 1062 algorithm='sha256') 1063 kernel_path = self.extract_from_deb(deb_path, '/boot/vmlinuz-5.10.0-3-armmp') 1064 dtb_path = self.extract_from_deb(deb_path, 1065 '/usr/lib/linux-image-5.10.0-3-armmp/aspeed-bmc-opp-tacoma.dtb') 1066 1067 self.vm.set_console() 1068 self.vm.add_args('-kernel', kernel_path, 1069 '-dtb', dtb_path, 1070 '-net', 'nic') 1071 self.vm.launch() 1072 self.wait_for_console_pattern("Booting Linux on physical CPU 0xf00") 1073 self.wait_for_console_pattern("SMP: Total of 2 processors activated") 1074 self.wait_for_console_pattern("No filesystem could mount root") 1075 1076 def test_m68k_mcf5208evb(self): 1077 """ 1078 :avocado: tags=arch:m68k 1079 :avocado: tags=machine:mcf5208evb 1080 """ 1081 tar_hash = 'ac688fd00561a2b6ce1359f9ff6aa2b98c9a570c' 1082 self.do_test_advcal_2018('07', tar_hash, 'sanity-clause.elf') 1083 1084 def test_or1k_sim(self): 1085 """ 1086 :avocado: tags=arch:or1k 1087 :avocado: tags=machine:or1k-sim 1088 """ 1089 tar_hash = '20334cdaf386108c530ff0badaecc955693027dd' 1090 self.do_test_advcal_2018('20', tar_hash, 'vmlinux') 1091 1092 def test_nios2_10m50(self): 1093 """ 1094 :avocado: tags=arch:nios2 1095 :avocado: tags=machine:10m50-ghrd 1096 """ 1097 tar_hash = 'e4251141726c412ac0407c5a6bceefbbff018918' 1098 self.do_test_advcal_2018('14', tar_hash, 'vmlinux.elf') 1099 1100 def test_ppc64_e500(self): 1101 """ 1102 :avocado: tags=arch:ppc64 1103 :avocado: tags=machine:ppce500 1104 :avocado: tags=cpu:e5500 1105 :avocado: tags=accel:tcg 1106 """ 1107 self.require_accelerator("tcg") 1108 tar_hash = '6951d86d644b302898da2fd701739c9406527fe1' 1109 self.do_test_advcal_2018('19', tar_hash, 'uImage') 1110 1111 def do_test_ppc64_powernv(self, proc): 1112 self.require_accelerator("tcg") 1113 images_url = ('https://github.com/open-power/op-build/releases/download/v2.7/') 1114 1115 kernel_url = images_url + 'zImage.epapr' 1116 kernel_hash = '0ab237df661727e5392cee97460e8674057a883c5f74381a128fa772588d45cd' 1117 kernel_path = self.fetch_asset(kernel_url, asset_hash=kernel_hash, 1118 algorithm='sha256') 1119 self.vm.set_console() 1120 self.vm.add_args('-kernel', kernel_path, 1121 '-append', 'console=tty0 console=hvc0', 1122 '-device', 'pcie-pci-bridge,id=bridge1,bus=pcie.1,addr=0x0', 1123 '-device', 'nvme,bus=pcie.2,addr=0x0,serial=1234', 1124 '-device', 'e1000e,bus=bridge1,addr=0x3', 1125 '-device', 'nec-usb-xhci,bus=bridge1,addr=0x2') 1126 self.vm.launch() 1127 1128 self.wait_for_console_pattern("CPU: " + proc + " generation processor") 1129 self.wait_for_console_pattern("zImage starting: loaded") 1130 self.wait_for_console_pattern("Run /init as init process") 1131 self.wait_for_console_pattern("Creating 1 MTD partitions") 1132 1133 def test_ppc_powernv8(self): 1134 """ 1135 :avocado: tags=arch:ppc64 1136 :avocado: tags=machine:powernv8 1137 :avocado: tags=accel:tcg 1138 """ 1139 self.do_test_ppc64_powernv('P8') 1140 1141 def test_ppc_powernv9(self): 1142 """ 1143 :avocado: tags=arch:ppc64 1144 :avocado: tags=machine:powernv9 1145 :avocado: tags=accel:tcg 1146 """ 1147 self.do_test_ppc64_powernv('P9') 1148 1149 def test_ppc_g3beige(self): 1150 """ 1151 :avocado: tags=arch:ppc 1152 :avocado: tags=machine:g3beige 1153 :avocado: tags=accel:tcg 1154 """ 1155 # TODO: g3beige works with kvm_pr but we don't have a 1156 # reliable way ATM (e.g. looking at /proc/modules) to detect 1157 # whether we're running kvm_hv or kvm_pr. For now let's 1158 # disable this test if we don't have TCG support. 1159 self.require_accelerator("tcg") 1160 tar_hash = 'e0b872a5eb8fdc5bed19bd43ffe863900ebcedfc' 1161 self.vm.add_args('-M', 'graphics=off') 1162 self.do_test_advcal_2018('15', tar_hash, 'invaders.elf') 1163 1164 def test_ppc_mac99(self): 1165 """ 1166 :avocado: tags=arch:ppc 1167 :avocado: tags=machine:mac99 1168 :avocado: tags=accel:tcg 1169 """ 1170 # TODO: mac99 works with kvm_pr but we don't have a 1171 # reliable way ATM (e.g. looking at /proc/modules) to detect 1172 # whether we're running kvm_hv or kvm_pr. For now let's 1173 # disable this test if we don't have TCG support. 1174 self.require_accelerator("tcg") 1175 tar_hash = 'e0b872a5eb8fdc5bed19bd43ffe863900ebcedfc' 1176 self.vm.add_args('-M', 'graphics=off') 1177 self.do_test_advcal_2018('15', tar_hash, 'invaders.elf') 1178 1179 # This test has a 6-10% failure rate on various hosts that look 1180 # like issues with a buggy kernel. As a result we don't want it 1181 # gating releases on Gitlab. 1182 @skipIf(os.getenv('GITLAB_CI'), 'Running on GitLab') 1183 def test_sh4_r2d(self): 1184 """ 1185 :avocado: tags=arch:sh4 1186 :avocado: tags=machine:r2d 1187 """ 1188 tar_hash = 'fe06a4fd8ccbf2e27928d64472939d47829d4c7e' 1189 self.vm.add_args('-append', 'console=ttySC1') 1190 self.do_test_advcal_2018('09', tar_hash, 'zImage', console=1) 1191 1192 def test_sparc_ss20(self): 1193 """ 1194 :avocado: tags=arch:sparc 1195 :avocado: tags=machine:SS-20 1196 """ 1197 tar_hash = 'b18550d5d61c7615d989a06edace051017726a9f' 1198 self.do_test_advcal_2018('11', tar_hash, 'zImage.elf') 1199 1200 def test_xtensa_lx60(self): 1201 """ 1202 :avocado: tags=arch:xtensa 1203 :avocado: tags=machine:lx60 1204 :avocado: tags=cpu:dc233c 1205 """ 1206 tar_hash = '49e88d9933742f0164b60839886c9739cb7a0d34' 1207 self.do_test_advcal_2018('02', tar_hash, 'santas-sleigh-ride.elf')