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

028 (4152B)


      1#!/usr/bin/env bash
      2# group: rw backing quick
      3#
      4# Test that backing files can be smaller than the image
      5#
      6# Copyright (C) 2010 IBM, Corp.
      7#
      8# Based on 017:
      9# Copyright (C) 2009 Red Hat, Inc.
     10#
     11# This program is free software; you can redistribute it and/or modify
     12# it under the terms of the GNU General Public License as published by
     13# the Free Software Foundation; either version 2 of the License, or
     14# (at your option) any later version.
     15#
     16# This program is distributed in the hope that it will be useful,
     17# but WITHOUT ANY WARRANTY; without even the implied warranty of
     18# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     19# GNU General Public License for more details.
     20#
     21# You should have received a copy of the GNU General Public License
     22# along with this program.  If not, see <http://www.gnu.org/licenses/>.
     23#
     24
     25# creator
     26owner=stefanha@linux.vnet.ibm.com
     27
     28seq=`basename $0`
     29echo "QA output created by $seq"
     30
     31status=1	# failure is the default!
     32
     33_cleanup()
     34{
     35    _cleanup_qemu
     36    _rm_test_img "${TEST_IMG}.copy"
     37    _cleanup_test_img
     38}
     39trap "_cleanup; exit \$status" 0 1 2 3 15
     40
     41# get standard environment, filters and checks
     42. ./common.rc
     43. ./common.filter
     44. ./common.pattern
     45. ./common.qemu
     46
     47# Any format supporting backing files except vmdk and qcow which do not support
     48# smaller backing files.
     49_supported_fmt qcow2 qed
     50_supported_proto file fuse
     51_supported_os Linux
     52
     53# Choose a size that is not necessarily a cluster size multiple for image
     54# formats that use clusters.  This will ensure that the base image doesn't end
     55# precisely on a cluster boundary (the easy case).
     56image_size=$(( 4 * 1024 * 1024 * 1024 + 3 * 512 ))
     57
     58# The base image is smaller than the image file
     59base_size=$(( image_size - 1024 * 1024 * 1024 ))
     60
     61offset=$(( base_size - 32 * 1024 ))
     62
     63TEST_IMG_SAVE="$TEST_IMG"
     64TEST_IMG="$TEST_IMG.base"
     65
     66_make_test_img $base_size
     67
     68echo "Filling base image"
     69echo
     70
     71# Fill end of base image with a pattern, skipping every other sector
     72io writev $offset 512 1024 32
     73
     74_check_test_img
     75
     76echo "Creating test image with backing file"
     77echo
     78
     79TEST_IMG="$TEST_IMG_SAVE"
     80_make_test_img -b "$TEST_IMG.base" -F $IMGFMT $image_size
     81
     82echo "Filling test image"
     83echo
     84
     85# Write every other sector around where the base image ends
     86io writev $(( offset + 512 )) 512 1024 64
     87
     88_check_test_img
     89
     90echo "Reading"
     91echo
     92
     93# Base image sectors
     94io readv $(( offset )) 512 1024 32
     95
     96# Image sectors
     97io readv $(( offset + 512 )) 512 1024 64
     98
     99# Zero sectors beyond end of base image
    100io_zero readv $(( offset + 32 * 1024 )) 512 1024 32
    101
    102_check_test_img
    103
    104# Rebase it on top of its base image
    105$QEMU_IMG rebase -b "$TEST_IMG.base" -F $IMGFMT "$TEST_IMG"
    106
    107echo
    108echo block-backup
    109echo
    110
    111qemu_comm_method="monitor"
    112_launch_qemu -drive file="${TEST_IMG}",cache=${CACHEMODE},aio=${AIOMODE},id=disk
    113h=$QEMU_HANDLE
    114if [ "${VALGRIND_QEMU}" == "y" ]; then
    115    QEMU_COMM_TIMEOUT=7
    116else
    117    QEMU_COMM_TIMEOUT=1
    118fi
    119
    120TEST_IMG="$TEST_IMG.copy" _make_test_img $image_size
    121_send_qemu_cmd $h "drive_backup -n disk ${TEST_IMG}.copy" "(qemu)" \
    122    | _filter_imgfmt
    123
    124silent=y qemu_cmd_repeat=20 _send_qemu_cmd $h "info block-jobs" "No active jobs"
    125_send_qemu_cmd $h "info block-jobs" "No active jobs"
    126_send_qemu_cmd $h 'quit' ""
    127
    128# Base image sectors
    129TEST_IMG="${TEST_IMG}.copy" io readv $(( offset )) 512 1024 32
    130
    131# Image sectors
    132TEST_IMG="${TEST_IMG}.copy" io readv $(( offset + 512 )) 512 1024 64
    133
    134# Zero sectors beyond end of base image
    135TEST_IMG="${TEST_IMG}.copy" io_zero readv $(( offset + 32 * 1024 )) 512 1024 32
    136
    137
    138_check_test_img
    139
    140echo
    141echo '=== Reading across backing EOF in one operation ==='
    142echo
    143
    144# Use a cluster boundary as the base end here
    145base_size=$((3 * 1024 * 1024 * 1024))
    146
    147TEST_IMG="$TEST_IMG.base" _make_test_img $base_size
    148_make_test_img -b "$TEST_IMG.base" -F $IMGFMT $image_size
    149
    150# Write 16 times 42 at the end of the base image
    151$QEMU_IO -c "write -P 42 $((base_size - 16)) 16" "$TEST_IMG.base" \
    152    | _filter_qemu_io
    153
    154# Read 32 bytes across the base EOF from the top;
    155# should be 16 times 0x2a, then 16 times 0x00
    156$QEMU_IO -c "read -v $((base_size - 16)) 32" "$TEST_IMG" \
    157    | _filter_qemu_io
    158
    159# success, all done
    160echo "*** done"
    161rm -f $seq.full
    162status=0