cachepc-qemu

Fork of AMDESE/qemu with changes for cachepc side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-qemu
Log | Files | Refs | Submodules | LICENSE | sfeed.txt

machine_mips_malta.py (4464B)


      1# Functional tests for the MIPS Malta board
      2#
      3# Copyright (c) Philippe Mathieu-Daudé <f4bug@amsat.org>
      4#
      5# This work is licensed under the terms of the GNU GPL, version 2 or later.
      6# See the COPYING file in the top-level directory.
      7#
      8# SPDX-License-Identifier: GPL-2.0-or-later
      9
     10import os
     11import gzip
     12import logging
     13
     14from avocado import skipUnless
     15from avocado_qemu import Test
     16from avocado_qemu import wait_for_console_pattern
     17from avocado.utils import archive
     18from avocado import skipIf
     19
     20
     21NUMPY_AVAILABLE = True
     22try:
     23    import numpy as np
     24except ImportError:
     25    NUMPY_AVAILABLE = False
     26
     27CV2_AVAILABLE = True
     28try:
     29    import cv2
     30except ImportError:
     31    CV2_AVAILABLE = False
     32
     33
     34@skipUnless(NUMPY_AVAILABLE, 'Python NumPy not installed')
     35@skipUnless(CV2_AVAILABLE, 'Python OpenCV not installed')
     36class MaltaMachineFramebuffer(Test):
     37
     38    timeout = 30
     39
     40    KERNEL_COMMON_COMMAND_LINE = 'printk.time=0 '
     41
     42    def do_test_i6400_framebuffer_logo(self, cpu_cores_count):
     43        """
     44        Boot Linux kernel and check Tux logo is displayed on the framebuffer.
     45        """
     46        screendump_path = os.path.join(self.workdir, 'screendump.pbm')
     47
     48        kernel_url = ('https://github.com/philmd/qemu-testing-blob/raw/'
     49                      'a5966ca4b5/mips/malta/mips64el/'
     50                      'vmlinux-4.7.0-rc1.I6400.gz')
     51        kernel_hash = '096f50c377ec5072e6a366943324622c312045f6'
     52        kernel_path_gz = self.fetch_asset(kernel_url, asset_hash=kernel_hash)
     53        kernel_path = self.workdir + "vmlinux"
     54        archive.gzip_uncompress(kernel_path_gz, kernel_path)
     55
     56        tuxlogo_url = ('https://github.com/torvalds/linux/raw/v2.6.12/'
     57                       'drivers/video/logo/logo_linux_vga16.ppm')
     58        tuxlogo_hash = '3991c2ddbd1ddaecda7601f8aafbcf5b02dc86af'
     59        tuxlogo_path = self.fetch_asset(tuxlogo_url, asset_hash=tuxlogo_hash)
     60
     61        self.vm.set_console()
     62        kernel_command_line = (self.KERNEL_COMMON_COMMAND_LINE +
     63                               'clocksource=GIC console=tty0 console=ttyS0')
     64        self.vm.add_args('-kernel', kernel_path,
     65                         '-smp', '%u' % cpu_cores_count,
     66                         '-vga', 'std',
     67                         '-append', kernel_command_line)
     68        self.vm.launch()
     69        framebuffer_ready = 'Console: switching to colour frame buffer device'
     70        wait_for_console_pattern(self, framebuffer_ready,
     71                                 failure_message='Kernel panic - not syncing')
     72        self.vm.command('human-monitor-command', command_line='stop')
     73        self.vm.command('human-monitor-command',
     74                        command_line='screendump %s' % screendump_path)
     75        logger = logging.getLogger('framebuffer')
     76
     77        match_threshold = 0.95
     78        screendump_bgr = cv2.imread(screendump_path, cv2.IMREAD_COLOR)
     79        tuxlogo_bgr = cv2.imread(tuxlogo_path, cv2.IMREAD_COLOR)
     80        result = cv2.matchTemplate(screendump_bgr, tuxlogo_bgr,
     81                                   cv2.TM_CCOEFF_NORMED)
     82        loc = np.where(result >= match_threshold)
     83        tuxlogo_count = 0
     84        h, w = tuxlogo_bgr.shape[:2]
     85        debug_png = os.getenv('AVOCADO_CV2_SCREENDUMP_PNG_PATH')
     86        for tuxlogo_count, pt in enumerate(zip(*loc[::-1]), start=1):
     87            logger.debug('found Tux at position (x, y) = %s', pt)
     88            cv2.rectangle(screendump_bgr, pt,
     89                          (pt[0] + w, pt[1] + h), (0, 0, 255), 2)
     90        if debug_png:
     91            cv2.imwrite(debug_png, screendump_bgr)
     92        self.assertGreaterEqual(tuxlogo_count, cpu_cores_count)
     93
     94    def test_mips_malta_i6400_framebuffer_logo_1core(self):
     95        """
     96        :avocado: tags=arch:mips64el
     97        :avocado: tags=machine:malta
     98        :avocado: tags=cpu:I6400
     99        """
    100        self.do_test_i6400_framebuffer_logo(1)
    101
    102    @skipIf(os.getenv('GITLAB_CI'), 'Running on GitLab')
    103    def test_mips_malta_i6400_framebuffer_logo_7cores(self):
    104        """
    105        :avocado: tags=arch:mips64el
    106        :avocado: tags=machine:malta
    107        :avocado: tags=cpu:I6400
    108        :avocado: tags=mips:smp
    109        """
    110        self.do_test_i6400_framebuffer_logo(7)
    111
    112    @skipIf(os.getenv('GITLAB_CI'), 'Running on GitLab')
    113    def test_mips_malta_i6400_framebuffer_logo_8cores(self):
    114        """
    115        :avocado: tags=arch:mips64el
    116        :avocado: tags=machine:malta
    117        :avocado: tags=cpu:I6400
    118        :avocado: tags=mips:smp
    119        """
    120        self.do_test_i6400_framebuffer_logo(8)