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

216 (4391B)


      1#!/usr/bin/env python3
      2# group: rw quick
      3#
      4# Copy-on-read tests using a COR filter node
      5#
      6# Copyright (C) 2018 Red Hat, Inc.
      7#
      8# This program is free software; you can redistribute it and/or modify
      9# it under the terms of the GNU General Public License as published by
     10# the Free Software Foundation; either version 2 of the License, or
     11# (at your option) any later version.
     12#
     13# This program is distributed in the hope that it will be useful,
     14# but WITHOUT ANY WARRANTY; without even the implied warranty of
     15# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     16# GNU General Public License for more details.
     17#
     18# You should have received a copy of the GNU General Public License
     19# along with this program.  If not, see <http://www.gnu.org/licenses/>.
     20#
     21# Creator/Owner: Max Reitz <mreitz@redhat.com>
     22
     23import iotests
     24from iotests import log, qemu_img, qemu_io_silent
     25
     26# Need backing file support
     27iotests.script_initialize(supported_fmts=['qcow2', 'qcow', 'qed', 'vmdk'],
     28                          supported_platforms=['linux'])
     29
     30log('')
     31log('=== Copy-on-read across nodes ===')
     32log('')
     33
     34# The old copy-on-read mechanism without a filter node cannot request
     35# WRITE_UNCHANGED permissions for its child.  Therefore it just tries
     36# to sneak its write by the usual permission system and holds its
     37# fingers crossed.  However, that sneaking does not work so well when
     38# there is a filter node in the way: That will receive the write
     39# request and re-issue a new one to its child, which this time is a
     40# proper write request that will make the permission system cough --
     41# unless there is someone at the top (like a guest device) that has
     42# requested write permissions.
     43#
     44# A COR filter node, however, can request the proper permissions for
     45# its child and therefore is not hit by this issue.
     46
     47with iotests.FilePath('base.img') as base_img_path, \
     48     iotests.FilePath('top.img') as top_img_path, \
     49     iotests.VM() as vm:
     50
     51    log('--- Setting up images ---')
     52    log('')
     53
     54    assert qemu_img('create', '-f', iotests.imgfmt, base_img_path, '64M') == 0
     55    assert qemu_io_silent(base_img_path, '-c', 'write -P 1 0M 1M') == 0
     56    assert qemu_img('create', '-f', iotests.imgfmt, '-b', base_img_path,
     57                    '-F', iotests.imgfmt, top_img_path) == 0
     58    assert qemu_io_silent(top_img_path,  '-c', 'write -P 2 1M 1M') == 0
     59
     60    log('Done')
     61
     62    log('')
     63    log('--- Doing COR ---')
     64    log('')
     65
     66    # Compare with e.g. the following:
     67    #   vm.add_drive_raw('if=none,node-name=node0,copy-on-read=on,driver=raw,' \
     68    #                    'file.driver=%s,file.file.filename=%s' %
     69    #                       (iotests.imgfmt, top_img_path))
     70    # (Remove the blockdev-add instead.)
     71    # ((Not tested here because it hits an assertion in the permission
     72    #   system.))
     73
     74    vm.launch()
     75
     76    log(vm.qmp('blockdev-add',
     77                    node_name='node0',
     78                    driver='copy-on-read',
     79                    file={
     80                        'driver': 'raw',
     81                        'file': {
     82                            'driver': 'copy-on-read',
     83                            'file': {
     84                                'driver': 'raw',
     85                                'file': {
     86                                    'driver': iotests.imgfmt,
     87                                    'file': {
     88                                        'driver': 'file',
     89                                        'filename': top_img_path
     90                                    },
     91                                    'backing': {
     92                                        'driver': iotests.imgfmt,
     93                                        'file': {
     94                                            'driver': 'file',
     95                                            'filename': base_img_path
     96                                        }
     97                                    }
     98                                }
     99                            }
    100                        }
    101                    }))
    102
    103    # Trigger COR
    104    log(vm.qmp('human-monitor-command',
    105               command_line='qemu-io node0 "read 0 64M"'))
    106
    107    vm.shutdown()
    108
    109    log('')
    110    log('--- Checking COR result ---')
    111    log('')
    112
    113    assert qemu_io_silent(base_img_path, '-c', 'discard 0 64M') == 0
    114    assert qemu_io_silent(top_img_path,  '-c', 'read -P 1 0M 1M') == 0
    115    assert qemu_io_silent(top_img_path,  '-c', 'read -P 2 1M 1M') == 0
    116
    117    log('Done')