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

077 (5591B)


      1#!/usr/bin/env bash
      2# group: rw quick
      3#
      4# Test concurrent pread/pwrite
      5#
      6# Copyright (C) 2014 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 raw
     41_supported_proto generic
     42_supported_os Linux
     43
     44CLUSTER_SIZE=4k
     45size=128M
     46
     47_make_test_img $size
     48
     49echo
     50echo "== Some concurrent requests involving RMW =="
     51
     52test_io()
     53{
     54echo "open -o driver=$IMGFMT,file.align=4k blkdebug::$TEST_IMG"
     55# A simple RMW request
     56cat  <<EOF
     57aio_write -P 10 0x200 0x200
     58aio_flush
     59EOF
     60
     61# Sequential RMW requests on the same physical sector
     62off=0x1000
     63for ev in "head" "after_head"; do
     64cat  <<EOF
     65break pwritev_rmw_$ev A
     66aio_write -P 10 $((off + 0x200)) 0x200
     67wait_break A
     68aio_write -P 11 $((off + 0x400)) 0x200
     69sleep 100
     70resume A
     71aio_flush
     72EOF
     73off=$((off + 0x1000))
     74done
     75
     76# Chained dependencies
     77cat  <<EOF
     78break pwritev_rmw_after_tail A
     79aio_write -P 10 0x5000 0x200
     80wait_break A
     81aio_write -P 11 0x5200 0x200
     82aio_write -P 12 0x5400 0x200
     83aio_write -P 13 0x5600 0x200
     84aio_write -P 14 0x5800 0x200
     85aio_write -P 15 0x5a00 0x200
     86aio_write -P 16 0x5c00 0x200
     87aio_write -P 17 0x5e00 0x200
     88sleep 100
     89resume A
     90aio_flush
     91EOF
     92
     93# Overlapping multiple requests
     94cat  <<EOF
     95break pwritev_rmw_after_tail A
     96aio_write -P 10 0x6000 0x200
     97wait_break A
     98break pwritev_rmw_after_head B
     99aio_write -P 10 0x7e00 0x200
    100wait_break B
    101aio_write -P 11 0x6800 0x1000
    102resume A
    103sleep 100
    104resume B
    105aio_flush
    106EOF
    107
    108cat  <<EOF
    109break pwritev_rmw_after_tail A
    110aio_write -P 10 0x8000 0x200
    111wait_break A
    112break pwritev_rmw_after_head B
    113aio_write -P 10 0x9e00 0x200
    114wait_break B
    115aio_write -P 11 0x8800 0x1000
    116resume B
    117sleep 100
    118resume A
    119aio_flush
    120EOF
    121
    122cat  <<EOF
    123break pwritev_rmw_after_tail A
    124aio_write -P 10 0xa000 0x200
    125wait_break A
    126aio_write -P 11 0xa800 0x1000
    127break pwritev_rmw_after_head B
    128aio_write -P 10 0xbe00 0x200
    129wait_break B
    130resume A
    131sleep 100
    132resume B
    133aio_flush
    134EOF
    135
    136cat  <<EOF
    137break pwritev_rmw_after_tail A
    138aio_write -P 10 0xc000 0x200
    139wait_break A
    140aio_write -P 11 0xc800 0x1000
    141break pwritev_rmw_after_head B
    142aio_write -P 10 0xde00 0x200
    143wait_break B
    144resume B
    145sleep 100
    146resume A
    147aio_flush
    148EOF
    149
    150# Only RMW for the tail part
    151cat  <<EOF
    152break pwritev_rmw_after_tail A
    153aio_write -P 10 0xe000 0x1800
    154wait_break A
    155aio_write -P 11 0xf000 0xc00
    156sleep 100
    157resume A
    158aio_flush
    159EOF
    160
    161cat  <<EOF
    162break pwritev A
    163aio_write -P 10 0x10000 0x800
    164wait_break A
    165break pwritev_rmw_after_tail B
    166aio_write -P 11 0x10000 0x400
    167break pwritev_done C
    168resume A
    169wait_break C
    170resume C
    171sleep 100
    172wait_break B
    173resume B
    174aio_flush
    175EOF
    176
    177cat  <<EOF
    178break pwritev A
    179aio_write -P 10 0x11000 0x800
    180wait_break A
    181aio_write -P 11 0x11000 0x1000
    182sleep 100
    183resume A
    184aio_flush
    185EOF
    186}
    187
    188test_io | $QEMU_IO  | _filter_qemu_io | \
    189    sed -e 's,[0-9/]* bytes at offset [0-9]*,XXX/XXX bytes at offset XXX,g' \
    190        -e 's/^[0-9]* \(bytes\|KiB\)/XXX bytes/' \
    191        -e '/Suspended/d' \
    192        -e '/blkdebug: Resuming request/d'
    193
    194echo
    195echo "== Verify image content =="
    196
    197verify_io()
    198{
    199    # A simple RMW request
    200    echo read -P 0       0 0x200
    201    echo read -P 10  0x200 0x200
    202    echo read -P 0   0x400 0xc00
    203
    204    # Sequential RMW requests on the same physical sector
    205    echo read -P 0  0x1000 0x200
    206    echo read -P 10 0x1200 0x200
    207    echo read -P 11 0x1400 0x200
    208    echo read -P 0  0x1600 0xa00
    209
    210    echo read -P 0  0x2000 0x200
    211    echo read -P 10 0x2200 0x200
    212    echo read -P 11 0x2400 0x200
    213    echo read -P 0  0x2600 0xa00
    214
    215    # Chained dependencies
    216    echo read -P 10 0x5000 0x200
    217    echo read -P 11 0x5200 0x200
    218    echo read -P 12 0x5400 0x200
    219    echo read -P 13 0x5600 0x200
    220    echo read -P 14 0x5800 0x200
    221    echo read -P 15 0x5a00 0x200
    222    echo read -P 16 0x5c00 0x200
    223    echo read -P 17 0x5e00 0x200
    224
    225    # Overlapping multiple requests
    226    echo read -P 10 0x6000 0x200
    227    echo read -P  0 0x6200 0x600
    228    echo read -P 11 0x6800 0x1000
    229    echo read -P  0 0x7800 0x600
    230    echo read -P 10 0x7e00 0x200
    231
    232    echo read -P 10 0x8000 0x200
    233    echo read -P  0 0x8200 0x600
    234    echo read -P 11 0x8800 0x1000
    235    echo read -P  0 0x9800 0x600
    236    echo read -P 10 0x9e00 0x200
    237
    238    echo read -P 10 0xa000 0x200
    239    echo read -P  0 0xa200 0x600
    240    echo read -P 11 0xa800 0x1000
    241    echo read -P  0 0xb800 0x600
    242    echo read -P 10 0xbe00 0x200
    243
    244    echo read -P 10 0xc000 0x200
    245    echo read -P  0 0xc200 0x600
    246    echo read -P 11 0xc800 0x1000
    247    echo read -P  0 0xd800 0x600
    248    echo read -P 10 0xde00 0x200
    249
    250    # Only RMW for the tail part
    251    echo read -P 10 0xe000 0x1000
    252    echo read -P 11 0xf800 0x400
    253    echo read -P  0 0xfc00 0x400
    254
    255    echo read -P 11 0x10000 0x400
    256    echo read -P 10 0x10400 0x400
    257
    258    echo read -P 11 0x11800 0x800
    259}
    260
    261verify_io | $QEMU_IO "$TEST_IMG" | _filter_qemu_io
    262
    263_check_test_img
    264
    265# success, all done
    266echo "*** done"
    267rm -f $seq.full
    268status=0