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

071 (6903B)


      1#!/usr/bin/env bash
      2# group: rw auto quick
      3#
      4# Test case for the QMP blkdebug and blkverify interfaces
      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=mreitz@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 fuse
     42_require_drivers blkdebug blkverify
     43# blkdebug can only inject errors on bs->file, not on the data_file,
     44# so thie test does not work with external data files
     45_unsupported_imgopts data_file
     46
     47do_run_qemu()
     48{
     49    echo Testing: "$@" | _filter_imgfmt
     50    $QEMU -nographic -qmp stdio -serial none "$@"
     51    echo
     52}
     53
     54run_qemu()
     55{
     56    do_run_qemu "$@" 2>&1 | _filter_testdir | _filter_qemu | _filter_qmp | _filter_qemu_io
     57}
     58
     59IMG_SIZE=64M
     60
     61echo
     62echo "=== Testing blkverify through filename ==="
     63echo
     64
     65# _make_test_img may set variables that we need to retain.  Everything
     66# in a pipe is executed in a subshell, so doing so would throw away
     67# all changes.  Therefore, we have to store the output in some temp
     68# file and filter that.
     69scratch_out="$TEST_DIR/img-create.out"
     70
     71TEST_IMG="$TEST_IMG.base" IMGFMT="raw" _make_test_img --no-opts $IMG_SIZE \
     72    >"$scratch_out"
     73_filter_imgfmt <"$scratch_out"
     74rm -f "$scratch_out"
     75
     76_make_test_img $IMG_SIZE
     77$QEMU_IO -c "open -o driver=raw,file.driver=blkverify,file.raw.filename=$TEST_IMG.base $TEST_IMG" \
     78         -c 'read 0 512' -c 'write -P 42 0x38000 512' -c 'read -P 42 0x38000 512' | _filter_qemu_io
     79
     80$QEMU_IO -c 'write -P 42 0 512' "$TEST_IMG" | _filter_qemu_io
     81
     82$QEMU_IO -c "open -o driver=raw,file.driver=blkverify,file.raw.filename=$TEST_IMG.base $TEST_IMG" \
     83         -c 'read -P 42 0 512' | _filter_qemu_io
     84
     85echo
     86echo "=== Testing blkverify through file blockref ==="
     87echo
     88
     89TEST_IMG="$TEST_IMG.base" IMGFMT="raw" _make_test_img --no-opts $IMG_SIZE \
     90    >"$scratch_out"
     91_filter_imgfmt <"$scratch_out"
     92
     93_make_test_img $IMG_SIZE
     94$QEMU_IO -c "open -o driver=raw,file.driver=blkverify,file.raw.filename=$TEST_IMG.base,file.test.driver=$IMGFMT,file.test.file.filename=$TEST_IMG" \
     95         -c 'read 0 512' -c 'write -P 42 0x38000 512' -c 'read -P 42 0x38000 512' | _filter_qemu_io
     96
     97$QEMU_IO -c 'write -P 42 0 512' "$TEST_IMG" | _filter_qemu_io
     98
     99$QEMU_IO -c "open -o driver=raw,file.driver=blkverify,file.raw.filename=$TEST_IMG.base $TEST_IMG" \
    100         -c 'read -P 42 0 512' | _filter_qemu_io
    101
    102echo
    103echo "=== Testing blkdebug through filename ==="
    104echo
    105
    106$QEMU_IO -c "open -o file.driver=blkdebug,file.inject-error.event=l2_load $TEST_IMG" \
    107         -c 'read -P 42 0x38000 512'
    108
    109echo
    110echo "=== Testing blkdebug through file blockref ==="
    111echo
    112
    113$QEMU_IO -c "open -o driver=$IMGFMT,file.driver=blkdebug,file.inject-error.event=l2_load,file.image.filename=$TEST_IMG" \
    114         -c 'read -P 42 0x38000 512'
    115
    116echo
    117echo "=== Testing blkdebug on existing block device ==="
    118echo
    119
    120run_qemu <<EOF
    121{ "execute": "qmp_capabilities" }
    122{ "execute": "blockdev-add",
    123    "arguments": {
    124        "node-name": "drive0",
    125        "driver": "file",
    126        "filename": "$TEST_IMG"
    127    }
    128}
    129{ "execute": "blockdev-add",
    130    "arguments": {
    131        "driver": "$IMGFMT",
    132        "node-name": "drive0-debug",
    133        "file": {
    134            "driver": "blkdebug",
    135            "image": "drive0",
    136            "inject-error": [{
    137                "event": "l2_load"
    138            }]
    139        }
    140    }
    141}
    142{ "execute": "human-monitor-command",
    143    "arguments": {
    144        "command-line": 'qemu-io drive0-debug "read 0 512"'
    145    }
    146}
    147{ "execute": "quit" }
    148EOF
    149
    150echo
    151echo "=== Testing blkverify on existing block device ==="
    152echo
    153
    154run_qemu <<EOF
    155{ "execute": "qmp_capabilities" }
    156{ "execute": "blockdev-add",
    157    "arguments": {
    158        "node-name": "drive0",
    159        "driver": "$IMGFMT",
    160        "file": {
    161            "driver": "file",
    162            "filename": "$TEST_IMG"
    163        }
    164    }
    165}
    166{ "execute": "blockdev-add",
    167    "arguments": {
    168        "driver": "blkverify",
    169        "node-name": "drive0-verify",
    170        "test": "drive0",
    171        "raw": {
    172            "driver": "file",
    173            "filename": "$TEST_IMG.base"
    174        }
    175    }
    176}
    177{ "execute": "human-monitor-command",
    178    "arguments": {
    179        "command-line": 'qemu-io drive0-verify "read 0 512"'
    180    }
    181}
    182{ "execute": "quit" }
    183EOF
    184
    185echo
    186echo "=== Testing blkverify on existing raw block device ==="
    187echo
    188
    189run_qemu <<EOF
    190{ "execute": "qmp_capabilities" }
    191{ "execute": "blockdev-add",
    192    "arguments": {
    193        "node-name": "drive0",
    194        "driver": "file",
    195        "filename": "$TEST_IMG.base"
    196    }
    197}
    198{ "execute": "blockdev-add",
    199    "arguments": {
    200        "driver": "blkverify",
    201        "node-name": "drive0-verify",
    202        "test": {
    203            "driver": "$IMGFMT",
    204            "file": {
    205                "driver": "file",
    206                "filename": "$TEST_IMG"
    207            }
    208        },
    209        "raw": "drive0"
    210    }
    211}
    212{ "execute": "human-monitor-command",
    213    "arguments": {
    214        "command-line": 'qemu-io drive0-verify "read 0 512"'
    215    }
    216}
    217{ "execute": "quit" }
    218EOF
    219
    220echo
    221echo "=== Testing blkdebug's set-state through QMP ==="
    222echo
    223
    224run_qemu <<EOF
    225{ "execute": "qmp_capabilities" }
    226{ "execute": "blockdev-add",
    227    "arguments": {
    228        "node-name": "drive0",
    229        "driver": "file",
    230        "filename": "$TEST_IMG"
    231    }
    232}
    233{ "execute": "blockdev-add",
    234    "arguments": {
    235        "driver": "$IMGFMT",
    236        "node-name": "drive0-debug",
    237        "file": {
    238            "driver": "blkdebug",
    239            "image": "drive0",
    240            "inject-error": [{
    241                "event": "read_aio",
    242                "state": 42
    243            }],
    244            "set-state": [{
    245                "event": "write_aio",
    246                "new_state": 42
    247            }]
    248        }
    249    }
    250}
    251{ "execute": "human-monitor-command",
    252    "arguments": {
    253        "command-line": 'qemu-io drive0-debug "read 0 512"'
    254    }
    255}
    256{ "execute": "human-monitor-command",
    257    "arguments": {
    258        "command-line": 'qemu-io drive0-debug "write 0 512"'
    259    }
    260}
    261{ "execute": "human-monitor-command",
    262    "arguments": {
    263        "command-line": 'qemu-io drive0-debug "read 0 512"'
    264    }
    265}
    266{ "execute": "quit" }
    267EOF
    268
    269# success, all done
    270echo "*** done"
    271rm -f $seq.full
    272status=0