1fcf2658bSPhilippe Mathieu-Daudé#!/usr/bin/env python3 2fcf2658bSPhilippe Mathieu-Daudé# 3fcf2658bSPhilippe Mathieu-Daudé# Functional tests for the little-endian 64-bit MIPS Malta board 4fcf2658bSPhilippe Mathieu-Daudé# 5fcf2658bSPhilippe Mathieu-Daudé# Copyright (c) Philippe Mathieu-Daudé <f4bug@amsat.org> 6fcf2658bSPhilippe Mathieu-Daudé# 7fcf2658bSPhilippe Mathieu-Daudé# This work is licensed under the terms of the GNU GPL, version 2 or later. 8fcf2658bSPhilippe Mathieu-Daudé# See the COPYING file in the top-level directory. 9fcf2658bSPhilippe Mathieu-Daudé# 10fcf2658bSPhilippe Mathieu-Daudé# SPDX-License-Identifier: GPL-2.0-or-later 11fcf2658bSPhilippe Mathieu-Daudé 12fcf2658bSPhilippe Mathieu-Daudéimport os 13fcf2658bSPhilippe Mathieu-Daudéimport logging 14fcf2658bSPhilippe Mathieu-Daudé 15fcf2658bSPhilippe Mathieu-Daudéfrom qemu_test import LinuxKernelTest, Asset 16fcf2658bSPhilippe Mathieu-Daudéfrom qemu_test import exec_command_and_wait_for_pattern 17fcf2658bSPhilippe Mathieu-Daudéfrom qemu_test.utils import gzip_uncompress 18fcf2658bSPhilippe Mathieu-Daudéfrom unittest import skipUnless 19fcf2658bSPhilippe Mathieu-Daudé 20fcf2658bSPhilippe Mathieu-DaudéNUMPY_AVAILABLE = True 21fcf2658bSPhilippe Mathieu-Daudétry: 22fcf2658bSPhilippe Mathieu-Daudé import numpy as np 23fcf2658bSPhilippe Mathieu-Daudéexcept ImportError: 24fcf2658bSPhilippe Mathieu-Daudé NUMPY_AVAILABLE = False 25fcf2658bSPhilippe Mathieu-Daudé 26fcf2658bSPhilippe Mathieu-DaudéCV2_AVAILABLE = True 27fcf2658bSPhilippe Mathieu-Daudétry: 28fcf2658bSPhilippe Mathieu-Daudé import cv2 29fcf2658bSPhilippe Mathieu-Daudéexcept ImportError: 30fcf2658bSPhilippe Mathieu-Daudé CV2_AVAILABLE = False 31fcf2658bSPhilippe Mathieu-Daudé 32fcf2658bSPhilippe Mathieu-Daudé 33*a4b60becSPhilippe Mathieu-Daudéclass MaltaMachineConsole(LinuxKernelTest): 340e165dfcSPhilippe Mathieu-Daudé 350e165dfcSPhilippe Mathieu-Daudé ASSET_KERNEL_2_63_2 = Asset( 360e165dfcSPhilippe Mathieu-Daudé ('http://snapshot.debian.org/archive/debian/' 370e165dfcSPhilippe Mathieu-Daudé '20130217T032700Z/pool/main/l/linux-2.6/' 380e165dfcSPhilippe Mathieu-Daudé 'linux-image-2.6.32-5-5kc-malta_2.6.32-48_mipsel.deb'), 390e165dfcSPhilippe Mathieu-Daudé '35eb476f03be589824b0310358f1c447d85e645b88cbcd2ac02b97ef560f9f8d') 400e165dfcSPhilippe Mathieu-Daudé 410e165dfcSPhilippe Mathieu-Daudé def test_mips64el_malta(self): 420e165dfcSPhilippe Mathieu-Daudé """ 430e165dfcSPhilippe Mathieu-Daudé This test requires the ar tool to extract "data.tar.gz" from 440e165dfcSPhilippe Mathieu-Daudé the Debian package. 450e165dfcSPhilippe Mathieu-Daudé 460e165dfcSPhilippe Mathieu-Daudé The kernel can be rebuilt using this Debian kernel source [1] and 470e165dfcSPhilippe Mathieu-Daudé following the instructions on [2]. 480e165dfcSPhilippe Mathieu-Daudé 490e165dfcSPhilippe Mathieu-Daudé [1] http://snapshot.debian.org/package/linux-2.6/2.6.32-48/ 500e165dfcSPhilippe Mathieu-Daudé #linux-source-2.6.32_2.6.32-48 510e165dfcSPhilippe Mathieu-Daudé [2] https://kernel-team.pages.debian.net/kernel-handbook/ 520e165dfcSPhilippe Mathieu-Daudé ch-common-tasks.html#s-common-official 530e165dfcSPhilippe Mathieu-Daudé """ 540e165dfcSPhilippe Mathieu-Daudé deb_path = self.ASSET_KERNEL_2_63_2.fetch() 55*a4b60becSPhilippe Mathieu-Daudé kernel_path = self.extract_from_deb(deb_path, 560e165dfcSPhilippe Mathieu-Daudé '/boot/vmlinux-2.6.32-5-5kc-malta') 570e165dfcSPhilippe Mathieu-Daudé 580e165dfcSPhilippe Mathieu-Daudé self.set_machine('malta') 590e165dfcSPhilippe Mathieu-Daudé self.vm.set_console() 60*a4b60becSPhilippe Mathieu-Daudé kernel_command_line = self.KERNEL_COMMON_COMMAND_LINE + 'console=ttyS0' 610e165dfcSPhilippe Mathieu-Daudé self.vm.add_args('-kernel', kernel_path, 620e165dfcSPhilippe Mathieu-Daudé '-append', kernel_command_line) 630e165dfcSPhilippe Mathieu-Daudé self.vm.launch() 640e165dfcSPhilippe Mathieu-Daudé console_pattern = 'Kernel command line: %s' % kernel_command_line 65*a4b60becSPhilippe Mathieu-Daudé self.wait_for_console_pattern(console_pattern) 660e165dfcSPhilippe Mathieu-Daudé 670e165dfcSPhilippe Mathieu-Daudé ASSET_KERNEL_3_19_3 = Asset( 680e165dfcSPhilippe Mathieu-Daudé ('https://github.com/philmd/qemu-testing-blob/' 690e165dfcSPhilippe Mathieu-Daudé 'raw/9ad2df38/mips/malta/mips64el/' 700e165dfcSPhilippe Mathieu-Daudé 'vmlinux-3.19.3.mtoman.20150408'), 710e165dfcSPhilippe Mathieu-Daudé '8d3beb003bc66051ead98e7172139017fcf9ce2172576541c57e86418dfa5ab8') 720e165dfcSPhilippe Mathieu-Daudé 730e165dfcSPhilippe Mathieu-Daudé ASSET_CPIO_R1 = Asset( 740e165dfcSPhilippe Mathieu-Daudé ('https://github.com/groeck/linux-build-test/' 750e165dfcSPhilippe Mathieu-Daudé 'raw/8584a59e/rootfs/mipsel64/' 760e165dfcSPhilippe Mathieu-Daudé 'rootfs.mipsel64r1.cpio.gz'), 770e165dfcSPhilippe Mathieu-Daudé '75ba10cd35fb44e32948eeb26974f061b703c81c4ba2fab1ebcacf1d1bec3b61') 780e165dfcSPhilippe Mathieu-Daudé 790e165dfcSPhilippe Mathieu-Daudé @skipUnless(os.getenv('QEMU_TEST_ALLOW_UNTRUSTED_CODE'), 'untrusted code') 800e165dfcSPhilippe Mathieu-Daudé def test_mips64el_malta_5KEc_cpio(self): 810e165dfcSPhilippe Mathieu-Daudé kernel_path = self.ASSET_KERNEL_3_19_3.fetch() 820e165dfcSPhilippe Mathieu-Daudé initrd_path_gz = self.ASSET_CPIO_R1.fetch() 830e165dfcSPhilippe Mathieu-Daudé initrd_path = os.path.join(self.workdir, 'rootfs.cpio') 840e165dfcSPhilippe Mathieu-Daudé gzip_uncompress(initrd_path_gz, initrd_path) 850e165dfcSPhilippe Mathieu-Daudé 860e165dfcSPhilippe Mathieu-Daudé self.set_machine('malta') 870e165dfcSPhilippe Mathieu-Daudé self.vm.set_console() 88*a4b60becSPhilippe Mathieu-Daudé kernel_command_line = (self.KERNEL_COMMON_COMMAND_LINE 890e165dfcSPhilippe Mathieu-Daudé + 'console=ttyS0 console=tty ' 900e165dfcSPhilippe Mathieu-Daudé + 'rdinit=/sbin/init noreboot') 910e165dfcSPhilippe Mathieu-Daudé self.vm.add_args('-cpu', '5KEc', 920e165dfcSPhilippe Mathieu-Daudé '-kernel', kernel_path, 930e165dfcSPhilippe Mathieu-Daudé '-initrd', initrd_path, 940e165dfcSPhilippe Mathieu-Daudé '-append', kernel_command_line, 950e165dfcSPhilippe Mathieu-Daudé '-no-reboot') 960e165dfcSPhilippe Mathieu-Daudé self.vm.launch() 97*a4b60becSPhilippe Mathieu-Daudé self.wait_for_console_pattern('Boot successful.') 980e165dfcSPhilippe Mathieu-Daudé 990e165dfcSPhilippe Mathieu-Daudé exec_command_and_wait_for_pattern(self, 'cat /proc/cpuinfo', 1000e165dfcSPhilippe Mathieu-Daudé 'MIPS 5KE') 1010e165dfcSPhilippe Mathieu-Daudé exec_command_and_wait_for_pattern(self, 'uname -a', 1020e165dfcSPhilippe Mathieu-Daudé '3.19.3.mtoman.20150408') 1030e165dfcSPhilippe Mathieu-Daudé exec_command_and_wait_for_pattern(self, 'reboot', 1040e165dfcSPhilippe Mathieu-Daudé 'reboot: Restarting system') 1050e165dfcSPhilippe Mathieu-Daudé # Wait for VM to shut down gracefully 1060e165dfcSPhilippe Mathieu-Daudé self.vm.wait() 1070e165dfcSPhilippe Mathieu-Daudé 1080e165dfcSPhilippe Mathieu-Daudé 109fcf2658bSPhilippe Mathieu-Daudé@skipUnless(NUMPY_AVAILABLE, 'Python NumPy not installed') 110fcf2658bSPhilippe Mathieu-Daudé@skipUnless(CV2_AVAILABLE, 'Python OpenCV not installed') 111fcf2658bSPhilippe Mathieu-Daudéclass MaltaMachineFramebuffer(LinuxKernelTest): 112fcf2658bSPhilippe Mathieu-Daudé 113fcf2658bSPhilippe Mathieu-Daudé timeout = 30 114fcf2658bSPhilippe Mathieu-Daudé 115fcf2658bSPhilippe Mathieu-Daudé ASSET_KERNEL_4_7_0 = Asset( 116fcf2658bSPhilippe Mathieu-Daudé ('https://github.com/philmd/qemu-testing-blob/raw/a5966ca4b5/' 117fcf2658bSPhilippe Mathieu-Daudé 'mips/malta/mips64el/vmlinux-4.7.0-rc1.I6400.gz'), 118fcf2658bSPhilippe Mathieu-Daudé '1f64efc59968a3c328672e6b10213fe574bb2308d9d2ed44e75e40be59e9fbc2') 119fcf2658bSPhilippe Mathieu-Daudé 120fcf2658bSPhilippe Mathieu-Daudé ASSET_TUXLOGO = Asset( 121fcf2658bSPhilippe Mathieu-Daudé ('https://github.com/torvalds/linux/raw/v2.6.12/' 122fcf2658bSPhilippe Mathieu-Daudé 'drivers/video/logo/logo_linux_vga16.ppm'), 123fcf2658bSPhilippe Mathieu-Daudé 'b762f0d91ec018887ad1b334543c2fdf9be9fdfc87672b409211efaa3ea0ef79') 124fcf2658bSPhilippe Mathieu-Daudé 125fcf2658bSPhilippe Mathieu-Daudé def do_test_i6400_framebuffer_logo(self, cpu_cores_count): 126fcf2658bSPhilippe Mathieu-Daudé """ 127fcf2658bSPhilippe Mathieu-Daudé Boot Linux kernel and check Tux logo is displayed on the framebuffer. 128fcf2658bSPhilippe Mathieu-Daudé """ 129fcf2658bSPhilippe Mathieu-Daudé screendump_path = os.path.join(self.workdir, 'screendump.pbm') 130fcf2658bSPhilippe Mathieu-Daudé 131fcf2658bSPhilippe Mathieu-Daudé kernel_path_gz = self.ASSET_KERNEL_4_7_0.fetch() 132fcf2658bSPhilippe Mathieu-Daudé kernel_path = self.workdir + "vmlinux" 133fcf2658bSPhilippe Mathieu-Daudé gzip_uncompress(kernel_path_gz, kernel_path) 134fcf2658bSPhilippe Mathieu-Daudé 135fcf2658bSPhilippe Mathieu-Daudé tuxlogo_path = self.ASSET_TUXLOGO.fetch() 136fcf2658bSPhilippe Mathieu-Daudé 137fcf2658bSPhilippe Mathieu-Daudé self.set_machine('malta') 138fcf2658bSPhilippe Mathieu-Daudé self.vm.set_console() 139fcf2658bSPhilippe Mathieu-Daudé kernel_command_line = (self.KERNEL_COMMON_COMMAND_LINE + 140fcf2658bSPhilippe Mathieu-Daudé 'clocksource=GIC console=tty0 console=ttyS0') 141fcf2658bSPhilippe Mathieu-Daudé self.vm.add_args('-kernel', kernel_path, 142fcf2658bSPhilippe Mathieu-Daudé '-cpu', 'I6400', 143fcf2658bSPhilippe Mathieu-Daudé '-smp', '%u' % cpu_cores_count, 144fcf2658bSPhilippe Mathieu-Daudé '-vga', 'std', 145fcf2658bSPhilippe Mathieu-Daudé '-append', kernel_command_line) 146fcf2658bSPhilippe Mathieu-Daudé self.vm.launch() 147fcf2658bSPhilippe Mathieu-Daudé framebuffer_ready = 'Console: switching to colour frame buffer device' 148fcf2658bSPhilippe Mathieu-Daudé self.wait_for_console_pattern(framebuffer_ready) 149fcf2658bSPhilippe Mathieu-Daudé self.vm.cmd('human-monitor-command', command_line='stop') 150fcf2658bSPhilippe Mathieu-Daudé self.vm.cmd('human-monitor-command', 151fcf2658bSPhilippe Mathieu-Daudé command_line='screendump %s' % screendump_path) 152fcf2658bSPhilippe Mathieu-Daudé logger = logging.getLogger('framebuffer') 153fcf2658bSPhilippe Mathieu-Daudé 154fcf2658bSPhilippe Mathieu-Daudé match_threshold = 0.95 155fcf2658bSPhilippe Mathieu-Daudé screendump_bgr = cv2.imread(screendump_path, cv2.IMREAD_COLOR) 156fcf2658bSPhilippe Mathieu-Daudé tuxlogo_bgr = cv2.imread(tuxlogo_path, cv2.IMREAD_COLOR) 157fcf2658bSPhilippe Mathieu-Daudé result = cv2.matchTemplate(screendump_bgr, tuxlogo_bgr, 158fcf2658bSPhilippe Mathieu-Daudé cv2.TM_CCOEFF_NORMED) 159fcf2658bSPhilippe Mathieu-Daudé loc = np.where(result >= match_threshold) 160fcf2658bSPhilippe Mathieu-Daudé tuxlogo_count = 0 161fcf2658bSPhilippe Mathieu-Daudé h, w = tuxlogo_bgr.shape[:2] 162fcf2658bSPhilippe Mathieu-Daudé debug_png = os.getenv('AVOCADO_CV2_SCREENDUMP_PNG_PATH') 163fcf2658bSPhilippe Mathieu-Daudé for tuxlogo_count, pt in enumerate(zip(*loc[::-1]), start=1): 164fcf2658bSPhilippe Mathieu-Daudé logger.debug('found Tux at position (x, y) = %s', pt) 165fcf2658bSPhilippe Mathieu-Daudé cv2.rectangle(screendump_bgr, pt, 166fcf2658bSPhilippe Mathieu-Daudé (pt[0] + w, pt[1] + h), (0, 0, 255), 2) 167fcf2658bSPhilippe Mathieu-Daudé if debug_png: 168fcf2658bSPhilippe Mathieu-Daudé cv2.imwrite(debug_png, screendump_bgr) 169fcf2658bSPhilippe Mathieu-Daudé self.assertGreaterEqual(tuxlogo_count, cpu_cores_count) 170fcf2658bSPhilippe Mathieu-Daudé 171fcf2658bSPhilippe Mathieu-Daudé def test_mips_malta_i6400_framebuffer_logo_1core(self): 172fcf2658bSPhilippe Mathieu-Daudé self.do_test_i6400_framebuffer_logo(1) 173fcf2658bSPhilippe Mathieu-Daudé 174fcf2658bSPhilippe Mathieu-Daudé @skipUnless(os.getenv('QEMU_TEST_FLAKY_TESTS'), 'Test is unstable on GitLab') 175fcf2658bSPhilippe Mathieu-Daudé def test_mips_malta_i6400_framebuffer_logo_7cores(self): 176fcf2658bSPhilippe Mathieu-Daudé self.do_test_i6400_framebuffer_logo(7) 177fcf2658bSPhilippe Mathieu-Daudé 178fcf2658bSPhilippe Mathieu-Daudé @skipUnless(os.getenv('QEMU_TEST_FLAKY_TESTS'), 'Test is unstable on GitLab') 179fcf2658bSPhilippe Mathieu-Daudé def test_mips_malta_i6400_framebuffer_logo_8cores(self): 180fcf2658bSPhilippe Mathieu-Daudé self.do_test_i6400_framebuffer_logo(8) 181fcf2658bSPhilippe Mathieu-Daudé 182fcf2658bSPhilippe Mathieu-Daudé 183*a4b60becSPhilippe Mathieu-Daudéfrom test_mipsel_malta import MaltaMachineYAMON 184*a4b60becSPhilippe Mathieu-Daudé 185fcf2658bSPhilippe Mathieu-Daudéif __name__ == '__main__': 186fcf2658bSPhilippe Mathieu-Daudé LinuxKernelTest.main() 187