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

153 (8678B)


      1#!/usr/bin/env bash
      2# group: rw quick
      3#
      4# Test image locking
      5#
      6# Copyright 2016, 2017 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=famz@redhat.com
     24
     25seq="$(basename $0)"
     26echo "QA output created by $seq"
     27
     28tmp=/tmp/$$
     29status=1	# failure is the default!
     30
     31_cleanup()
     32{
     33    _cleanup_test_img
     34    for img in "${TEST_IMG}".{base,overlay,convert,a,b,c,lnk}; do
     35        _rm_test_img "$img"
     36    done
     37}
     38trap "_cleanup; exit \$status" 0 1 2 3 15
     39
     40# get standard environment, filters and checks
     41. ./common.rc
     42. ./common.filter
     43. ./common.qemu
     44
     45size=32M
     46
     47_check_ofd()
     48{
     49    _make_test_img $size >/dev/null
     50    if $QEMU_IMG_PROG info --image-opts "driver=file,locking=on,filename=$TEST_IMG" 2>&1 |
     51        grep -q 'falling back to POSIX file'; then
     52        return 1
     53    else
     54        return 0
     55    fi
     56}
     57
     58_check_ofd || _notrun "OFD lock not available"
     59
     60_supported_fmt qcow2
     61_supported_proto file
     62
     63_run_cmd()
     64{
     65    echo
     66    (echo "$@"; "$@" 2>&1 1>/dev/null) | _filter_testdir
     67}
     68
     69_do_run_qemu()
     70{
     71    (
     72        if ! test -t 0; then
     73            while read cmd; do
     74                echo $cmd
     75            done
     76        fi
     77        echo quit
     78    ) | $QEMU -nographic -monitor stdio -serial none "$@" 1>/dev/null
     79}
     80
     81_run_qemu_with_images()
     82{
     83    _do_run_qemu \
     84        $(for i in $@; do echo "-drive if=none,file=$i"; done) 2>&1 \
     85        | _filter_testdir | _filter_qemu
     86}
     87
     88echo "== readonly=off,force-share=on should be rejected =="
     89_run_qemu_with_images null-co://,readonly=off,force-share=on
     90
     91for opts1 in "" "read-only=on" "read-only=on,force-share=on"; do
     92    echo
     93    echo "== Creating base image =="
     94    TEST_IMG="${TEST_IMG}.base" _make_test_img $size
     95
     96    echo
     97    echo "== Creating test image =="
     98    _make_test_img -b "${TEST_IMG}.base" -F $IMGFMT
     99
    100    echo
    101    echo "== Launching QEMU, opts: '$opts1' =="
    102    _launch_qemu -drive file="${TEST_IMG}",if=none,$opts1
    103    h=$QEMU_HANDLE
    104
    105    for opts2 in "" "read-only=on" "read-only=on,force-share=on"; do
    106        echo
    107        echo "== Launching another QEMU, opts: '$opts2' =="
    108        echo "quit" | \
    109            $QEMU -nographic -monitor stdio \
    110            -drive file="${TEST_IMG}",if=none,$opts2 2>&1 1>/dev/null | \
    111            _filter_testdir | _filter_qemu
    112    done
    113
    114    for L in "" "-U"; do
    115
    116        echo
    117        echo "== Running utility commands $L =="
    118        _run_cmd $QEMU_IO $L -c "read 0 512" "${TEST_IMG}"
    119        _run_cmd $QEMU_IO $L -r -c "read 0 512" "${TEST_IMG}"
    120        _run_cmd $QEMU_IO -c "open $L ${TEST_IMG}" -c "read 0 512"
    121        _run_cmd $QEMU_IO -c "open -r $L ${TEST_IMG}" -c "read 0 512"
    122        _run_cmd $QEMU_IMG info        $L "${TEST_IMG}"
    123        _run_cmd $QEMU_IMG check       $L "${TEST_IMG}"
    124        _run_cmd $QEMU_IMG compare     $L "${TEST_IMG}" "${TEST_IMG}"
    125        _run_cmd $QEMU_IMG map         $L "${TEST_IMG}"
    126        _run_cmd $QEMU_IMG amend -o "size=$size" $L "${TEST_IMG}"
    127        _run_cmd $QEMU_IMG commit      $L "${TEST_IMG}"
    128        _run_cmd $QEMU_IMG resize      $L "${TEST_IMG}" $size
    129        _run_cmd $QEMU_IMG rebase      $L "${TEST_IMG}" -b "${TEST_IMG}.base" -F $IMGFMT
    130        _run_cmd $QEMU_IMG snapshot -l $L "${TEST_IMG}"
    131        _run_cmd $QEMU_IMG convert     $L "${TEST_IMG}" "${TEST_IMG}.convert"
    132        _run_cmd $QEMU_IMG dd          $L if="${TEST_IMG}" of="${TEST_IMG}.convert" bs=512 count=1
    133        _run_cmd $QEMU_IMG bench       $L -c 1 "${TEST_IMG}"
    134        _run_cmd $QEMU_IMG bench       $L -w -c 1 "${TEST_IMG}"
    135
    136        # qemu-img create does not support -U
    137        if [ -z "$L" ]; then
    138            _run_cmd $QEMU_IMG create -f $IMGFMT "${TEST_IMG}" \
    139                                      -b ${TEST_IMG}.base -F $IMGFMT
    140            # Read the file format.  It used to be the case that
    141            # file-posix simply truncated the file, but the qcow2
    142            # driver then failed to format it because it was unable
    143            # to acquire the necessary WRITE permission.  However, the
    144            # truncation was already wrong, and the whole process
    145            # resulted in the file being completely empty and thus its
    146            # format would be detected to be raw.
    147            # So we read it here to see that creation either completed
    148            # successfully (thus the format is qcow2) or it aborted
    149            # before the file was changed at all (thus the format stays
    150            # qcow2).
    151            _img_info -U | grep 'file format'
    152        fi
    153    done
    154    _send_qemu_cmd $h "{ 'execute': 'quit' }" ''
    155    echo
    156    echo "Round done"
    157    _cleanup_qemu
    158done
    159
    160test_opts="read-only=off read-only=on read-only=on,force-share=on"
    161for opt1 in $test_opts; do
    162    for opt2 in $test_opts; do
    163        echo
    164        echo "== Two devices with the same image ($opt1 - $opt2) =="
    165        _run_qemu_with_images "${TEST_IMG},$opt1" "${TEST_IMG},$opt2"
    166    done
    167done
    168
    169echo
    170echo "== Creating ${TEST_IMG}.[abc] ==" | _filter_testdir
    171$QEMU_IMG create -f qcow2 "${TEST_IMG}.a" -b "${TEST_IMG}" -F $IMGFMT | _filter_img_create
    172$QEMU_IMG create -f qcow2 "${TEST_IMG}.b" -b "${TEST_IMG}" -F $IMGFMT | _filter_img_create
    173$QEMU_IMG create -f qcow2 "${TEST_IMG}.c" -b "${TEST_IMG}.b" -F $IMGFMT \
    174    | _filter_img_create
    175
    176echo
    177echo "== Two devices sharing the same file in backing chain =="
    178_run_qemu_with_images "${TEST_IMG}.a" "${TEST_IMG}.b"
    179_run_qemu_with_images "${TEST_IMG}.a" "${TEST_IMG}.c"
    180
    181echo
    182echo "== Backing image also as an active device =="
    183_run_qemu_with_images "${TEST_IMG}.a" "${TEST_IMG}"
    184
    185echo
    186echo "== Backing image also as an active device (ro) =="
    187_run_qemu_with_images "${TEST_IMG}.a" "${TEST_IMG},readonly=on"
    188
    189echo
    190echo "== Symbolic link =="
    191rm -f "${TEST_IMG}.lnk" &>/dev/null
    192ln -s ${TEST_IMG} "${TEST_IMG}.lnk" || echo "Failed to create link"
    193_run_qemu_with_images "${TEST_IMG}.lnk" "${TEST_IMG}"
    194
    195echo
    196echo "== Active commit to intermediate layer should work when base in use =="
    197_launch_qemu -drive format=$IMGFMT,file="${TEST_IMG}.a",id=drive0,if=none \
    198             -device virtio-blk,drive=drive0
    199
    200_send_qemu_cmd $QEMU_HANDLE \
    201    "{ 'execute': 'qmp_capabilities' }" \
    202    'return'
    203_run_cmd $QEMU_IMG commit -b "${TEST_IMG}.b" "${TEST_IMG}.c"
    204
    205_cleanup_qemu
    206
    207_launch_qemu
    208
    209_send_qemu_cmd $QEMU_HANDLE \
    210    "{ 'execute': 'qmp_capabilities' }" \
    211    'return'
    212
    213echo "Adding drive"
    214_send_qemu_cmd $QEMU_HANDLE \
    215    "{ 'execute': 'human-monitor-command',
    216       'arguments': { 'command-line': 'drive_add 0 if=none,id=d0,file=${TEST_IMG}' } }" \
    217    'return'
    218
    219_run_cmd $QEMU_IO "${TEST_IMG}" -c 'write 0 512'
    220
    221echo "Creating overlay with qemu-img when the guest is running should be allowed"
    222_run_cmd $QEMU_IMG create -f $IMGFMT -b "${TEST_IMG}" -F $IMGFMT "${TEST_IMG}.overlay"
    223
    224echo "== Closing an image should unlock it =="
    225_send_qemu_cmd $QEMU_HANDLE \
    226    "{ 'execute': 'human-monitor-command',
    227       'arguments': { 'command-line': 'drive_del d0' } }" \
    228    'return'
    229
    230_run_cmd $QEMU_IO "${TEST_IMG}" -c 'write 0 512'
    231
    232echo "Adding two and closing one"
    233for d in d0 d1; do
    234    _send_qemu_cmd $QEMU_HANDLE \
    235        "{ 'execute': 'human-monitor-command',
    236           'arguments': { 'command-line': 'drive_add 0 if=none,id=$d,file=${TEST_IMG},readonly=on' } }" \
    237        'return'
    238done
    239
    240_run_cmd $QEMU_IMG info "${TEST_IMG}"
    241
    242_send_qemu_cmd $QEMU_HANDLE \
    243    "{ 'execute': 'human-monitor-command',
    244       'arguments': { 'command-line': 'drive_del d0' } }" \
    245    'return'
    246
    247_run_cmd $QEMU_IO "${TEST_IMG}" -c 'write 0 512'
    248
    249echo "Closing the other"
    250_send_qemu_cmd $QEMU_HANDLE \
    251    "{ 'execute': 'human-monitor-command',
    252       'arguments': { 'command-line': 'drive_del d1' } }" \
    253    'return'
    254
    255_run_cmd $QEMU_IO "${TEST_IMG}" -c 'write 0 512'
    256
    257_cleanup_qemu
    258
    259echo
    260echo "== Detecting -U and force-share conflicts =="
    261
    262echo
    263echo 'No conflict:'
    264$QEMU_IMG info -U --image-opts driver=null-co,force-share=on
    265echo
    266echo 'Conflict:'
    267$QEMU_IMG info -U --image-opts driver=null-co,force-share=off
    268
    269echo
    270echo 'No conflict:'
    271$QEMU_IO -c 'open -r -U -o driver=null-co,force-share=on'
    272echo
    273echo 'Conflict:'
    274$QEMU_IO -c 'open -r -U -o driver=null-co,force-share=off'
    275
    276# success, all done
    277echo "*** done"
    278rm -f $seq.full
    279status=0