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

051 (13496B)


      1#!/usr/bin/env bash
      2# group: rw
      3#
      4# Test command line configuration of block devices and driver-specific options
      5#
      6# Copyright (C) 2013 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
     22# creator
     23owner=kwolf@redhat.com
     24
     25seq=`basename $0`
     26echo "QA output created by $seq"
     27
     28status=1	# failure is the default!
     29
     30_cleanup()
     31{
     32	_cleanup_test_img
     33}
     34trap "_cleanup; exit \$status" 0 1 2 3 15
     35
     36# get standard environment, filters and checks
     37. ./common.rc
     38. ./common.filter
     39
     40_supported_fmt qcow2
     41_supported_proto file
     42# A compat=0.10 image is created in this test which does not support anything
     43# other than refcount_bits=16;
     44# it also will not support an external data file
     45_unsupported_imgopts 'refcount_bits=\([^1]\|.\([^6]\|$\)\)' data_file
     46_require_drivers nbd
     47
     48do_run_qemu()
     49{
     50    echo Testing: "$@"
     51    (
     52        if ! test -t 0; then
     53            while read cmd; do
     54                echo $cmd
     55            done
     56        fi
     57        echo quit
     58    ) | $QEMU -nographic -monitor stdio -serial none "$@"
     59    echo
     60}
     61
     62run_qemu()
     63{
     64    do_run_qemu "$@" 2>&1 | _filter_testdir | _filter_qemu |
     65        _filter_generated_node_ids | _filter_hmp
     66}
     67
     68size=128M
     69device_id="drive0"
     70
     71_make_test_img $size
     72cp "$TEST_IMG" "$TEST_IMG.orig"
     73mv "$TEST_IMG" "$TEST_IMG.base"
     74_make_test_img -b "$TEST_IMG.base" -F $IMGFMT $size
     75
     76echo
     77echo === Unknown option ===
     78echo
     79
     80run_qemu -drive file="$TEST_IMG",format=qcow2,unknown_opt=,if=none,id=$device_id
     81run_qemu -drive file="$TEST_IMG",format=qcow2,unknown_opt=on,if=none,id=$device_id
     82run_qemu -drive file="$TEST_IMG",format=qcow2,unknown_opt=1234,if=none,id=$device_id
     83run_qemu -drive file="$TEST_IMG",format=qcow2,unknown_opt=foo,if=none,id=$device_id
     84
     85echo
     86echo === Unknown protocol option ===
     87echo
     88
     89run_qemu -drive file="$TEST_IMG",format=qcow2,file.unknown_opt=
     90run_qemu -drive file="$TEST_IMG",format=qcow2,file.unknown_opt=on
     91run_qemu -drive file="$TEST_IMG",format=qcow2,file.unknown_opt=1234
     92run_qemu -drive file="$TEST_IMG",format=qcow2,file.unknown_opt=foo
     93
     94echo
     95echo === Invalid format ===
     96echo
     97
     98run_qemu -drive file="$TEST_IMG",format=foo
     99run_qemu -drive file="$TEST_IMG",driver=foo
    100run_qemu -drive file="$TEST_IMG",driver=raw,format=qcow2
    101run_qemu -drive file="$TEST_IMG",driver=qcow2,format=qcow2
    102
    103echo
    104echo === Node names ===
    105echo
    106
    107# Maximum length: 31 characters
    108run_qemu -drive file="$TEST_IMG",node-name=x123456789012345678901234567890
    109run_qemu -drive file="$TEST_IMG",node-name=x1234567890123456789012345678901
    110
    111# First character must be alphabetic
    112# Following characters alphanumeric or -._
    113run_qemu -drive file="$TEST_IMG",node-name=All-Types.of_all0wed_chars
    114run_qemu -drive file="$TEST_IMG",node-name=123foo
    115run_qemu -drive file="$TEST_IMG",node-name=_foo
    116run_qemu -drive file="$TEST_IMG",node-name=foo#12
    117
    118echo
    119echo === Device without drive ===
    120echo
    121
    122run_qemu -device virtio-scsi -device scsi-hd
    123
    124echo
    125echo === Overriding backing file ===
    126echo
    127
    128echo "info block" | run_qemu -drive file="$TEST_IMG",driver=qcow2,backing.file.filename="$TEST_IMG.orig",if=none,id=$device_id -nodefaults\
    129                  | _filter_generated_node_ids
    130
    131# Drivers that don't support backing files
    132run_qemu -drive file="$TEST_IMG",driver=raw,backing.file.filename="$TEST_IMG.orig"
    133run_qemu -drive file="$TEST_IMG",file.backing.driver=file,file.backing.filename="$TEST_IMG.orig"
    134run_qemu -drive file="$TEST_IMG",file.backing.driver=qcow2,file.backing.file.filename="$TEST_IMG.orig"
    135
    136echo
    137echo === Enable and disable lazy refcounting on the command line, plus some invalid values ===
    138echo
    139
    140_make_test_img -o compat=1.1 "$size"
    141
    142run_qemu -drive file="$TEST_IMG",format=qcow2,lazy-refcounts=on
    143run_qemu -drive file="$TEST_IMG",format=qcow2,lazy-refcounts=off
    144run_qemu -drive file="$TEST_IMG",format=qcow2,lazy-refcounts=
    145run_qemu -drive file="$TEST_IMG",format=qcow2,lazy-refcounts=42
    146run_qemu -drive file="$TEST_IMG",format=qcow2,lazy-refcounts=foo
    147
    148
    149echo
    150echo === With version 2 images enabling lazy refcounts must fail ===
    151echo
    152
    153_make_test_img -o compat=0.10 $size
    154
    155run_qemu -drive file="$TEST_IMG",format=qcow2,lazy-refcounts=on
    156run_qemu -drive file="$TEST_IMG",format=qcow2,lazy-refcounts=off
    157
    158echo
    159echo === No medium ===
    160echo
    161
    162case "$QEMU_DEFAULT_MACHINE" in
    163    pc)
    164        run_qemu -drive if=floppy
    165        run_qemu -drive if=ide,media=cdrom
    166        run_qemu -drive if=ide
    167        ;;
    168     *)
    169        ;;
    170esac
    171
    172run_qemu -drive if=virtio
    173
    174case "$QEMU_DEFAULT_MACHINE" in
    175    pc)
    176        run_qemu -drive if=none,id=disk -device ide-cd,drive=disk
    177        run_qemu -drive if=none,id=disk -device lsi53c895a -device scsi-cd,drive=disk
    178        run_qemu -drive if=none,id=disk -device ide-hd,drive=disk
    179        run_qemu -drive if=none,id=disk -device lsi53c895a -device scsi-hd,drive=disk
    180        ;;
    181     *)
    182        ;;
    183esac
    184
    185echo
    186echo === Attach to node in non-default iothread ===
    187echo
    188
    189case "$QEMU_DEFAULT_MACHINE" in
    190    pc)
    191        iothread="-drive file=$TEST_IMG,if=none,node-name=disk -object iothread,id=thread0 -device virtio-scsi,iothread=thread0,id=virtio-scsi0 -device scsi-hd,bus=virtio-scsi0.0,drive=disk,share-rw=on"
    192
    193        # Can't add a device in the main thread while virtio-scsi0 uses the node
    194        run_qemu $iothread -device ide-hd,drive=disk,share-rw=on
    195        run_qemu $iothread -device virtio-blk-pci,drive=disk,share-rw=on
    196        run_qemu $iothread -device lsi53c895a,id=lsi0 -device scsi-hd,bus=lsi0.0,drive=disk,share-rw=on
    197        run_qemu $iothread -device virtio-scsi,id=virtio-scsi1 -device scsi-hd,bus=virtio-scsi1.0,drive=disk,share-rw=on
    198
    199        # virtio-blk enables the iothread only when the driver initialises the
    200        # device, so a second virtio-blk device can't be added even with the
    201        # same iothread. virtio-scsi allows this.
    202        run_qemu $iothread -device virtio-blk-pci,drive=disk,iothread=iothread0,share-rw=on
    203        run_qemu $iothread -device virtio-scsi,id=virtio-scsi1,iothread=thread0 -device scsi-hd,bus=virtio-scsi1.0,drive=disk,share-rw=on
    204        ;;
    205     *)
    206        ;;
    207esac
    208
    209echo
    210echo === Read-only ===
    211echo
    212
    213case "$QEMU_DEFAULT_MACHINE" in
    214    pc)
    215        run_qemu -drive file="$TEST_IMG",if=floppy,readonly=on
    216        run_qemu -drive file="$TEST_IMG",if=ide,media=cdrom,readonly=on
    217        run_qemu -drive file="$TEST_IMG",if=ide,readonly=on
    218        ;;
    219     *)
    220        ;;
    221esac
    222
    223run_qemu -drive file="$TEST_IMG",if=virtio,readonly=on
    224
    225case "$QEMU_DEFAULT_MACHINE" in
    226    pc)
    227        run_qemu -drive file="$TEST_IMG",if=none,id=disk,readonly=on -device ide-cd,drive=disk
    228        run_qemu -drive file="$TEST_IMG",if=none,id=disk,readonly=on -device lsi53c895a -device scsi-cd,drive=disk
    229        run_qemu -drive file="$TEST_IMG",if=none,id=disk,readonly=on -device ide-hd,drive=disk
    230        run_qemu -drive file="$TEST_IMG",if=none,id=disk,readonly=on -device lsi53c895a -device scsi-hd,drive=disk
    231        ;;
    232     *)
    233        ;;
    234esac
    235
    236echo
    237echo === Cache modes ===
    238echo
    239
    240# Cannot use the test image because cache=none might not work on the host FS
    241# Use cdrom so that we won't get errors about missing media
    242
    243run_qemu -drive driver=null-co,read-zeroes=on,cache=none
    244run_qemu -drive driver=null-co,read-zeroes=on,cache=directsync
    245run_qemu -drive driver=null-co,read-zeroes=on,cache=writeback
    246run_qemu -drive driver=null-co,read-zeroes=on,cache=writethrough
    247run_qemu -drive driver=null-co,read-zeroes=on,cache=unsafe
    248run_qemu -drive driver=null-co,cache=invalid_value
    249
    250# Can't test direct=on here because O_DIRECT might not be supported on this FS
    251# Test 142 checks the direct=on cases
    252
    253for cache in writeback writethrough unsafe invalid_value; do
    254    printf "info block %s\n" '' file backing backing-file | \
    255    run_qemu -drive file="$TEST_IMG",cache=$cache,backing.file.filename="$TEST_IMG.base",backing.cache.no-flush=on,backing.node-name=backing,backing.file.node-name=backing-file,file.node-name=file,if=none,id=$device_id -nodefaults
    256done
    257
    258echo
    259echo === Specifying the protocol layer ===
    260echo
    261
    262run_qemu -drive file="$TEST_IMG",file.driver=file
    263
    264echo
    265echo === Leaving out required options ===
    266echo
    267
    268run_qemu -drive driver=file
    269run_qemu -drive driver=file,filename=
    270run_qemu -drive driver=nbd
    271run_qemu -drive driver=raw
    272run_qemu -drive file.driver=file
    273run_qemu -drive file.driver=nbd
    274run_qemu -drive file.driver=raw
    275run_qemu -drive foo=bar
    276
    277echo
    278echo === Specifying both an option and its legacy alias ===
    279echo
    280
    281run_qemu -drive file="$TEST_IMG",iops=1234,throttling.iops-total=5678
    282run_qemu -drive file="$TEST_IMG",iops_rd=1234,throttling.iops-read=5678
    283run_qemu -drive file="$TEST_IMG",iops_wr=1234,throttling.iops-write=5678
    284
    285run_qemu -drive file="$TEST_IMG",bps=1234,throttling.bps-total=5678
    286run_qemu -drive file="$TEST_IMG",bps_rd=1234,throttling.bps-read=5678
    287run_qemu -drive file="$TEST_IMG",bps_wr=1234,throttling.bps-write=5678
    288
    289run_qemu -drive file="$TEST_IMG",iops_max=1234,throttling.iops-total-max=5678
    290run_qemu -drive file="$TEST_IMG",iops_rd_max=1234,throttling.iops-read-max=5678
    291run_qemu -drive file="$TEST_IMG",iops_wr_max=1234,throttling.iops-write-max=5678
    292
    293run_qemu -drive file="$TEST_IMG",bps_max=1234,throttling.bps-total-max=5678
    294run_qemu -drive file="$TEST_IMG",bps_rd_max=1234,throttling.bps-read-max=5678
    295run_qemu -drive file="$TEST_IMG",bps_wr_max=1234,throttling.bps-write-max=5678
    296
    297run_qemu -drive file="$TEST_IMG",iops_size=1234,throttling.iops-size=5678
    298run_qemu -drive file="$TEST_IMG",readonly=on,read-only=off
    299
    300echo
    301echo === Catching negative/large throttling values ===
    302echo
    303
    304run_qemu -drive file="$TEST_IMG",iops=-1
    305run_qemu -drive file="$TEST_IMG",bps=-2
    306run_qemu -drive file="$TEST_IMG",bps_rd=-3
    307run_qemu -drive file="$TEST_IMG",bps_rd_max=-3
    308run_qemu -drive file="$TEST_IMG",throttling.iops-total=-4
    309run_qemu -drive file="$TEST_IMG",throttling.bps-total=-5
    310# These are accepted
    311run_qemu -drive file="$TEST_IMG",bps=0
    312run_qemu -drive file="$TEST_IMG",bps=1
    313run_qemu -drive file="$TEST_IMG",bps=1000000000000000
    314# While these are not
    315run_qemu -drive file="$TEST_IMG",bps=1000000000000001
    316run_qemu -drive file="$TEST_IMG",bps=9999999999999999
    317
    318echo
    319echo === Parsing protocol from file name ===
    320echo
    321
    322# Protocol strings are supposed to be parsed from traditional option strings,
    323# but not when using driver-specific options. We can distinguish them by the
    324# error message for non-existing files.
    325
    326run_qemu -hda foo:bar
    327run_qemu -drive file=foo:bar
    328run_qemu -drive file.filename=foo:bar
    329
    330run_qemu -hda "file:$TEST_IMG"
    331run_qemu -drive file="file:$TEST_IMG"
    332run_qemu -drive file.filename="file:$TEST_IMG"
    333
    334echo
    335echo === Snapshot mode ===
    336echo
    337
    338$QEMU_IO -c "write -P 0x11 0 4k" "$TEST_IMG" | _filter_qemu_io
    339
    340
    341echo "qemu-io $device_id \"write -P 0x22 0 4k\"" | run_qemu -drive file="$TEST_IMG",if=none,id=$device_id -snapshot | _filter_qemu_io
    342echo "qemu-io $device_id \"write -P 0x22 0 4k\"" | run_qemu -drive file="$TEST_IMG",snapshot=on,if=none,id=$device_id | _filter_qemu_io
    343echo "qemu-io $device_id \"write -P 0x22 0 4k\"" | run_qemu -drive file.filename="$TEST_IMG",driver=qcow2,snapshot=on,if=none,id=$device_id\
    344                                                 | _filter_qemu_io
    345echo "qemu-io $device_id \"write -P 0x22 0 4k\"" | run_qemu -drive file.filename="$TEST_IMG",driver=qcow2,if=none,id=$device_id -snapshot\
    346                                                 | _filter_qemu_io
    347echo "qemu-io $device_id \"write -P 0x22 0 4k\"" | run_qemu -drive file="file:$TEST_IMG",if=none,id=$device_id -snapshot | _filter_qemu_io
    348echo "qemu-io $device_id \"write -P 0x22 0 4k\"" | run_qemu -drive file="file:$TEST_IMG",snapshot=on,if=none,id=$device_id | _filter_qemu_io
    349
    350# Opening a read-only file r/w with snapshot=on
    351chmod u-w "$TEST_IMG"
    352echo "qemu-io $device_id \"write -P 0x22 0 4k\"" | run_qemu -drive file="$TEST_IMG",if=none,id=$device_id -snapshot | _filter_qemu_io
    353echo "qemu-io $device_id \"write -P 0x22 0 4k\"" | run_qemu -drive file="$TEST_IMG",snapshot=on,if=none,id=$device_id | _filter_qemu_io
    354chmod u+w "$TEST_IMG"
    355
    356$QEMU_IO -c "read -P 0x11 0 4k" "$TEST_IMG" | _filter_qemu_io
    357
    358echo "qemu-io $device_id \"write -P 0x22 0 4k\"" | run_qemu -drive file="$TEST_IMG",snapshot=off,if=none,id=$device_id | _filter_qemu_io
    359
    360$QEMU_IO -c "read -P 0x22 0 4k" "$TEST_IMG" | _filter_qemu_io
    361
    362printf %b "qemu-io $device_id \"write -P 0x33 0 4k\"\ncommit $device_id\n" |
    363    run_qemu -drive file="$TEST_IMG",snapshot=on,if=none,id=$device_id |
    364    _filter_qemu_io
    365
    366$QEMU_IO -c "read -P 0x33 0 4k" "$TEST_IMG" | _filter_qemu_io
    367
    368# Using snapshot=on with a non-existent TMPDIR
    369if [ "${VALGRIND_QEMU_VM}" == "y" ]; then
    370    _casenotrun "Valgrind needs a valid TMPDIR for itself"
    371fi
    372VALGRIND_QEMU_VM= \
    373TMPDIR=/nonexistent run_qemu -drive driver=null-co,snapshot=on
    374
    375# Using snapshot=on together with read-only=on
    376echo "info block" |
    377    run_qemu -drive file="$TEST_IMG",snapshot=on,read-only=on,if=none,id=$device_id |
    378    _filter_qemu_io |
    379    sed -e 's#"[^"]*/vl\.[A-Za-z0-9]\{6\}"#SNAPSHOT_PATH#g'
    380
    381
    382# success, all done
    383echo "*** done"
    384rm -f $seq.full
    385status=0