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

224 (5335B)


      1#!/usr/bin/env python3
      2# group: rw quick
      3#
      4# Test json:{} filenames with qemu-internal BDSs
      5# (the one of commit, to be precise)
      6#
      7# Copyright (C) 2018 Red Hat, Inc.
      8#
      9# This program is free software; you can redistribute it and/or modify
     10# it under the terms of the GNU General Public License as published by
     11# the Free Software Foundation; either version 2 of the License, or
     12# (at your option) any later version.
     13#
     14# This program is distributed in the hope that it will be useful,
     15# but WITHOUT ANY WARRANTY; without even the implied warranty of
     16# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     17# GNU General Public License for more details.
     18#
     19# You should have received a copy of the GNU General Public License
     20# along with this program.  If not, see <http://www.gnu.org/licenses/>.
     21#
     22# Creator/Owner: Max Reitz <mreitz@redhat.com>
     23
     24import iotests
     25from iotests import log, qemu_img, qemu_io_silent, filter_qmp_testfiles, \
     26                    filter_qmp_imgfmt
     27import json
     28
     29# Need backing file support (for arbitrary backing formats)
     30iotests.script_initialize(supported_fmts=['qcow2', 'qcow', 'qed'],
     31                          supported_platforms=['linux'])
     32
     33
     34# There are two variations of this test:
     35# (1) We do not set filter_node_name.  In that case, the commit_top
     36#     driver should not appear anywhere.
     37# (2) We do set filter_node_name.  In that case, it should appear.
     38#
     39# This for loop executes both.
     40for filter_node_name in False, True:
     41    log('')
     42    log('--- filter_node_name: %s ---' % filter_node_name)
     43    log('')
     44
     45    with iotests.FilePath('base.img') as base_img_path, \
     46         iotests.FilePath('mid.img') as mid_img_path, \
     47         iotests.FilePath('top.img') as top_img_path, \
     48         iotests.VM() as vm:
     49
     50        assert qemu_img('create', '-f', iotests.imgfmt,
     51                        base_img_path, '64M') == 0
     52        assert qemu_img('create', '-f', iotests.imgfmt, '-b', base_img_path,
     53                        '-F', iotests.imgfmt, mid_img_path) == 0
     54        assert qemu_img('create', '-f', iotests.imgfmt, '-b', mid_img_path,
     55                        '-F', iotests.imgfmt, top_img_path) == 0
     56
     57        # Something to commit
     58        assert qemu_io_silent(mid_img_path, '-c', 'write -P 1 0 1M') == 0
     59
     60        vm.launch()
     61
     62        # Change the bottom-most image's backing file (to null-co://)
     63        # to enforce json:{} filenames
     64        vm.qmp_log('blockdev-add',
     65                    node_name='top',
     66                    driver=iotests.imgfmt,
     67                    file={
     68                        'driver': 'file',
     69                        'filename': top_img_path
     70                    },
     71                    backing={
     72                        'node-name': 'mid',
     73                        'driver': iotests.imgfmt,
     74                        'file': {
     75                            'driver': 'file',
     76                            'filename': mid_img_path
     77                        },
     78                        'backing': {
     79                            'node-name': 'base',
     80                            'driver': iotests.imgfmt,
     81                            'file': {
     82                                'driver': 'file',
     83                                'filename': base_img_path
     84                            },
     85                            'backing': {
     86                                'driver': 'null-co'
     87                            }
     88                        }
     89                    },
     90                    filters=[filter_qmp_testfiles, filter_qmp_imgfmt])
     91
     92        # As long as block-commit does not accept node names, we have to
     93        # get our mid/base filenames here
     94        mid_name = vm.node_info('mid')['image']['filename']
     95        base_name = vm.node_info('base')['image']['filename']
     96
     97        assert mid_name[:5] == 'json:'
     98        assert base_name[:5] == 'json:'
     99
    100        # Start the block job
    101        if filter_node_name:
    102            vm.qmp_log('block-commit',
    103                        job_id='commit',
    104                        device='top',
    105                        filter_node_name='filter_node',
    106                        top=mid_name,
    107                        base=base_name,
    108                        speed=1,
    109                        filters=[filter_qmp_testfiles, filter_qmp_imgfmt])
    110        else:
    111            vm.qmp_log('block-commit',
    112                        job_id='commit',
    113                        device='top',
    114                        top=mid_name,
    115                        base=base_name,
    116                        speed=1,
    117                        filters=[filter_qmp_testfiles, filter_qmp_imgfmt])
    118
    119        vm.qmp_log('job-pause', id='commit')
    120
    121        # Get and parse top's json:{} filename
    122        top_name = vm.node_info('top')['image']['filename']
    123
    124        vm.shutdown()
    125
    126        assert top_name[:5] == 'json:'
    127        top_options = json.loads(top_name[5:])
    128
    129        if filter_node_name:
    130            # This should be present and set
    131            assert top_options['backing']['driver'] == 'commit_top'
    132            # And the mid image is commit_top's backing image
    133            mid_options = top_options['backing']['backing']
    134        else:
    135            # The mid image should appear as the immediate backing BDS
    136            # of top
    137            mid_options = top_options['backing']
    138
    139        assert mid_options['driver'] == iotests.imgfmt
    140        assert mid_options['file']['filename'] == mid_img_path