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

260 (3043B)


      1#!/usr/bin/env python3
      2# group: rw quick
      3#
      4# Tests for temporary external snapshot when we have bitmaps.
      5#
      6# Copyright (c) 2019 Virtuozzo International GmbH. All rights reserved.
      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
     22import iotests
     23from iotests import qemu_img_create, file_path, log, filter_qmp_event
     24
     25iotests.script_initialize(
     26    supported_fmts=['qcow2']
     27)
     28
     29base, top = file_path('base', 'top')
     30size = 64 * 1024 * 3
     31
     32
     33def print_bitmap(msg, vm):
     34    result = vm.qmp('query-block')['return'][0]
     35    info = result.get("inserted", {})
     36    if 'dirty-bitmaps' in info:
     37        bitmap = info['dirty-bitmaps'][0]
     38        log('{}: name={} dirty-clusters={}'.format(msg, bitmap['name'],
     39            bitmap['count'] // 64 // 1024))
     40    else:
     41        log(msg + ': not found')
     42
     43
     44def test(persistent, restart):
     45    assert persistent or not restart
     46    log("\nTestcase {}persistent {} restart\n".format(
     47            '' if persistent else 'non-', 'with' if restart else 'without'))
     48
     49    qemu_img_create('-f', iotests.imgfmt, base, str(size))
     50
     51    vm = iotests.VM().add_drive(base)
     52    vm.launch()
     53
     54    vm.qmp_log('block-dirty-bitmap-add', node='drive0', name='bitmap0',
     55               persistent=persistent)
     56    vm.hmp_qemu_io('drive0', 'write 0 64K')
     57    print_bitmap('initial bitmap', vm)
     58
     59    vm.qmp_log('blockdev-snapshot-sync', device='drive0', snapshot_file=top,
     60               format=iotests.imgfmt, filters=[iotests.filter_qmp_testfiles])
     61    vm.hmp_qemu_io('drive0', 'write 64K 512')
     62    print_bitmap('check that no bitmaps are in snapshot', vm)
     63
     64    if restart:
     65        log("... Restart ...")
     66        vm.shutdown()
     67        vm = iotests.VM().add_drive(top)
     68        vm.launch()
     69
     70    vm.qmp_log('block-commit', device='drive0', top=top,
     71               filters=[iotests.filter_qmp_testfiles])
     72    ev = vm.events_wait((('BLOCK_JOB_READY', None),
     73                         ('BLOCK_JOB_COMPLETED', None)))
     74    log(filter_qmp_event(ev))
     75    if (ev['event'] == 'BLOCK_JOB_COMPLETED'):
     76        vm.shutdown()
     77        log(vm.get_log())
     78        exit()
     79
     80    vm.qmp_log('block-job-complete', device='drive0')
     81    ev = vm.event_wait('BLOCK_JOB_COMPLETED')
     82    log(filter_qmp_event(ev))
     83    print_bitmap('check bitmap after commit', vm)
     84
     85    vm.hmp_qemu_io('drive0', 'write 128K 64K')
     86    print_bitmap('check updated bitmap', vm)
     87
     88    vm.shutdown()
     89
     90
     91test(persistent=False, restart=False)
     92test(persistent=True, restart=False)
     93test(persistent=True, restart=True)