xref: /openbmc/qemu/tests/qemu-iotests/171 (revision 11a82d14293cd66f428f535741717ff338c0722b)
1*11a82d14SPhilippe Mathieu-Daudé#!/usr/bin/env bash
2ccc47808STomáš Golembiovský#
3ccc47808STomáš Golembiovský# Test 'offset' and 'size' options of the raw driver. Make sure we can't
4ccc47808STomáš Golembiovský# (or can) read and write outside of the image size.
5ccc47808STomáš Golembiovský#
6ccc47808STomáš Golembiovský# Copyright (C) 2016 Red Hat, Inc.
7ccc47808STomáš Golembiovský#
8ccc47808STomáš Golembiovský# This program is free software; you can redistribute it and/or modify
9ccc47808STomáš Golembiovský# it under the terms of the GNU General Public License as published by
10ccc47808STomáš Golembiovský# the Free Software Foundation; either version 2 of the License, or
11ccc47808STomáš Golembiovský# (at your option) any later version.
12ccc47808STomáš Golembiovský#
13ccc47808STomáš Golembiovský# This program is distributed in the hope that it will be useful,
14ccc47808STomáš Golembiovský# but WITHOUT ANY WARRANTY; without even the implied warranty of
15ccc47808STomáš Golembiovský# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16ccc47808STomáš Golembiovský# GNU General Public License for more details.
17ccc47808STomáš Golembiovský#
18ccc47808STomáš Golembiovský# You should have received a copy of the GNU General Public License
19ccc47808STomáš Golembiovský# along with this program.  If not, see <http://www.gnu.org/licenses/>.
20ccc47808STomáš Golembiovský#
21ccc47808STomáš Golembiovský
22ccc47808STomáš Golembiovský# creator
23ccc47808STomáš Golembiovskýowner=tgolembi@redhat.com
24ccc47808STomáš Golembiovský
25ccc47808STomáš Golembiovskýseq=`basename $0`
26ccc47808STomáš Golembiovskýecho "QA output created by $seq"
27ccc47808STomáš Golembiovský
28ccc47808STomáš Golembiovskýstatus=1	# failure is the default!
29ccc47808STomáš Golembiovský
30ccc47808STomáš Golembiovský_cleanup()
31ccc47808STomáš Golembiovský{
32ccc47808STomáš Golembiovský    _cleanup_test_img
33ccc47808STomáš Golembiovský}
34ccc47808STomáš Golembiovskýtrap "_cleanup; exit \$status" 0 1 2 3 15
35ccc47808STomáš Golembiovský
36ccc47808STomáš Golembiovský# get standard environment, filters and checks
37ccc47808STomáš Golembiovský. ./common.rc
38ccc47808STomáš Golembiovský. ./common.filter
39ccc47808STomáš Golembiovský
40ccc47808STomáš Golembiovský_supported_fmt raw
41ccc47808STomáš Golembiovský_supported_proto file
42ccc47808STomáš Golembiovský_supported_os Linux
43ccc47808STomáš Golembiovský
44ccc47808STomáš Golembiovský
45ccc47808STomáš Golembiovský# Create JSON with options
46ccc47808STomáš Golembiovskýimg_json() {
47b43671f8SEric Blake    printf %s 'json:{"driver":"raw", '
48b43671f8SEric Blake    printf %s "\"offset\":\"$img_offset\", "
49ccc47808STomáš Golembiovský    if [ "$img_size" -ne -1 ] ; then
50b43671f8SEric Blake        printf %s "\"size\":\"$img_size\", "
51ccc47808STomáš Golembiovský    fi
52b43671f8SEric Blake    printf %s '"file": {'
53b43671f8SEric Blake    printf %s   '"driver":"file", '
54b43671f8SEric Blake    printf %s   "\"filename\":\"$TEST_IMG\" "
55b43671f8SEric Blake    printf %s "} }"
56ccc47808STomáš Golembiovský}
57ccc47808STomáš Golembiovský
58ccc47808STomáš Golembiovskýdo_general_test() {
59ccc47808STomáš Golembiovský    if [ "$img_size" -ge 0 ] ; then
60ccc47808STomáš Golembiovský        test_size=$img_size
61ccc47808STomáš Golembiovský    else
62ccc47808STomáš Golembiovský        test_size=$((size-img_offset))
63ccc47808STomáš Golembiovský    fi
64ccc47808STomáš Golembiovský
65ccc47808STomáš Golembiovský    echo
66ccc47808STomáš Golembiovský    echo "write to image"
67ccc47808STomáš Golembiovský    $QEMU_IO -c "write -P 0x0a 0 $test_size" "$(img_json)" | _filter_qemu_io
68ccc47808STomáš Golembiovský
69ccc47808STomáš Golembiovský    echo
70ccc47808STomáš Golembiovský    echo "read the image"
71ccc47808STomáš Golembiovský    $QEMU_IO -c "read -P 0x0a 0 $test_size" "$(img_json)" | _filter_qemu_io
72ccc47808STomáš Golembiovský
73ccc47808STomáš Golembiovský    echo
74ccc47808STomáš Golembiovský    echo "check that offset is respected"
75ccc47808STomáš Golembiovský    $QEMU_IO -c "read -v $((img_offset-2)) 4" $TEST_IMG | _filter_qemu_io
76ccc47808STomáš Golembiovský
77ccc47808STomáš Golembiovský    echo
78ccc47808STomáš Golembiovský    echo "write before image boundary"
79ccc47808STomáš Golembiovský    $QEMU_IO -c "write $((test_size-1)) 1" "$(img_json)" | _filter_qemu_io
80ccc47808STomáš Golembiovský
81ccc47808STomáš Golembiovský    echo
82ccc47808STomáš Golembiovský    echo "write across image boundary"
83ccc47808STomáš Golembiovský    $QEMU_IO -c "write $((test_size-1)) 2" "$(img_json)" | _filter_qemu_io
84ccc47808STomáš Golembiovský
85ccc47808STomáš Golembiovský    echo
86ccc47808STomáš Golembiovský    echo "write at image boundary"
87ccc47808STomáš Golembiovský    $QEMU_IO -c "write $test_size 1" "$(img_json)" | _filter_qemu_io
88ccc47808STomáš Golembiovský
89ccc47808STomáš Golembiovský    echo
90ccc47808STomáš Golembiovský    echo "write after image boundary"
91ccc47808STomáš Golembiovský    $QEMU_IO -c "write $((test_size+512)) 1" "$(img_json)" | _filter_qemu_io
92ccc47808STomáš Golembiovský
93ccc47808STomáš Golembiovský    echo
94ccc47808STomáš Golembiovský    echo "writev before/after image boundary"
95ccc47808STomáš Golembiovský    $QEMU_IO -c "writev $((test_size-512)) 512 512" "$(img_json)" | _filter_qemu_io
96ccc47808STomáš Golembiovský
97ccc47808STomáš Golembiovský    echo
98ccc47808STomáš Golembiovský    echo "read before image boundary"
99ccc47808STomáš Golembiovský    $QEMU_IO -c "read $((test_size-1)) 1" "$(img_json)" | _filter_qemu_io
100ccc47808STomáš Golembiovský
101ccc47808STomáš Golembiovský    echo
102ccc47808STomáš Golembiovský    echo "read across image boundary"
103ccc47808STomáš Golembiovský    $QEMU_IO -c "read $((test_size-1)) 2" "$(img_json)" | _filter_qemu_io
104ccc47808STomáš Golembiovský
105ccc47808STomáš Golembiovský    echo
106ccc47808STomáš Golembiovský    echo "read at image boundary"
107ccc47808STomáš Golembiovský    $QEMU_IO -c "read $test_size 1" "$(img_json)" | _filter_qemu_io
108ccc47808STomáš Golembiovský
109ccc47808STomáš Golembiovský    echo
110ccc47808STomáš Golembiovský    echo "read after image boundary"
111ccc47808STomáš Golembiovský    $QEMU_IO -c "read $((test_size+512)) 1" "$(img_json)" | _filter_qemu_io
112ccc47808STomáš Golembiovský
113ccc47808STomáš Golembiovský    echo
114ccc47808STomáš Golembiovský    echo "readv before/after image boundary"
115ccc47808STomáš Golembiovský    $QEMU_IO -c "readv $((test_size-512)) 512 512" "$(img_json)" | _filter_qemu_io
116ccc47808STomáš Golembiovský
117ccc47808STomáš Golembiovský    echo
118ccc47808STomáš Golembiovský    echo "fill image with pattern"
119ccc47808STomáš Golembiovský    $QEMU_IO -c "write -P 0x0a 0 $size" $TEST_IMG | _filter_qemu_io
120ccc47808STomáš Golembiovský
121ccc47808STomáš Golembiovský    echo
122ccc47808STomáš Golembiovský    echo "write zeroes and check"
123ccc47808STomáš Golembiovský    $QEMU_IO -c "write -z 0 512" "$(img_json)" | _filter_qemu_io
124ccc47808STomáš Golembiovský    $QEMU_IO -c "read -v $((img_offset-2)) 4" $TEST_IMG | _filter_qemu_io
125ccc47808STomáš Golembiovský
126ccc47808STomáš Golembiovský    echo
127ccc47808STomáš Golembiovský    echo "write zeroes across image boundary"
128ccc47808STomáš Golembiovský    $QEMU_IO -c "write -z $((test_size-1)) 2" "$(img_json)" | _filter_qemu_io
129ccc47808STomáš Golembiovský
130ccc47808STomáš Golembiovský    echo
131ccc47808STomáš Golembiovský    echo "write zeroes at image boundary and check"
132ccc47808STomáš Golembiovský    $QEMU_IO -c "write -z $((test_size-2)) 2" "$(img_json)" | _filter_qemu_io
133ccc47808STomáš Golembiovský    $QEMU_IO -c "read -v $((img_offset+test_size-2)) 2" $TEST_IMG | _filter_qemu_io
134ccc47808STomáš Golembiovský    $QEMU_IO -c "read -v $((img_offset+test_size)) 2" $TEST_IMG | _filter_qemu_io
135ccc47808STomáš Golembiovský
136ccc47808STomáš Golembiovský    echo
137ccc47808STomáš Golembiovský    echo "fill image with pattern"
138ccc47808STomáš Golembiovský    $QEMU_IO -c "write -P 0x0a 0 $size" $TEST_IMG | _filter_qemu_io
139ccc47808STomáš Golembiovský
140ccc47808STomáš Golembiovský    echo
141ccc47808STomáš Golembiovský    echo "discard and check"
142ccc47808STomáš Golembiovský    $QEMU_IO -c "discard 0 512" "$(img_json)" | _filter_qemu_io
143ccc47808STomáš Golembiovský    $QEMU_IO -c "read -v $((img_offset-2)) 4" $TEST_IMG | _filter_qemu_io
144ccc47808STomáš Golembiovský
145ccc47808STomáš Golembiovský    echo
146ccc47808STomáš Golembiovský    echo "discard across image boundary"
147ccc47808STomáš Golembiovský    $QEMU_IO -c "discard $((test_size-1)) 2" "$(img_json)" | _filter_qemu_io
148ccc47808STomáš Golembiovský
149ccc47808STomáš Golembiovský    echo
150ccc47808STomáš Golembiovský    echo "discard at image boundary and check"
151ccc47808STomáš Golembiovský    $QEMU_IO -c "discard $((test_size-2)) 2" "$(img_json)" | _filter_qemu_io
152ccc47808STomáš Golembiovský    $QEMU_IO -c "read -v $((img_offset+test_size-2)) 2" $TEST_IMG | _filter_qemu_io
153ccc47808STomáš Golembiovský    $QEMU_IO -c "read -v $((img_offset+test_size)) 2" $TEST_IMG | _filter_qemu_io
154ccc47808STomáš Golembiovský}
155ccc47808STomáš Golembiovský
156ccc47808STomáš Golembiovskýecho
157ccc47808STomáš Golembiovskýecho "== test 'offset' option =="
158ccc47808STomáš Golembiovskýsize=4096
159ccc47808STomáš Golembiovskýimg_offset=512
160ccc47808STomáš Golembiovskýimg_size=-1
161ccc47808STomáš Golembiovský_make_test_img $size
162ccc47808STomáš Golembiovskýdo_general_test
163ccc47808STomáš Golembiovský_cleanup_test_img
164ccc47808STomáš Golembiovský
165ccc47808STomáš Golembiovskýecho
166ccc47808STomáš Golembiovskýecho "== test 'offset' and 'size' options =="
167ccc47808STomáš Golembiovskýsize=4096
168ccc47808STomáš Golembiovskýimg_offset=512
169ccc47808STomáš Golembiovskýimg_size=2048
170ccc47808STomáš Golembiovský_make_test_img $size
171ccc47808STomáš Golembiovskýdo_general_test
172ccc47808STomáš Golembiovský_cleanup_test_img
173ccc47808STomáš Golembiovský
174ccc47808STomáš Golembiovskýecho
175ccc47808STomáš Golembiovskýecho "== test misaligned 'offset' =="
176ccc47808STomáš Golembiovskýsize=4096
177ccc47808STomáš Golembiovskýimg_offset=10
178ccc47808STomáš Golembiovskýimg_size=2048
179ccc47808STomáš Golembiovský_make_test_img $size
180ccc47808STomáš Golembiovskýdo_general_test
181ccc47808STomáš Golembiovský_cleanup_test_img
182ccc47808STomáš Golembiovský
183ccc47808STomáš Golembiovskýecho
184ccc47808STomáš Golembiovskýecho "== test reopen =="
185ccc47808STomáš Golembiovskýsize=4096
186ccc47808STomáš Golembiovskýimg_offset=512
187ccc47808STomáš Golembiovskýimg_size=512
188ccc47808STomáš Golembiovský_make_test_img $size
189ccc47808STomáš Golembiovský(
190ccc47808STomáš Golembiovský$QEMU_IO "$(img_json)"  <<EOT
191ccc47808STomáš Golembiovskýwrite -P 0x0a 0 512
192ccc47808STomáš Golembiovskýwrite -P 0x0a 511 1
193ccc47808STomáš Golembiovskýwrite -P 0x0a 512 1
194ccc47808STomáš Golembiovskýreopen -o driver=raw,offset=1536,size=1024
195ccc47808STomáš Golembiovskýwrite -P 0x0a 0 1024
196ccc47808STomáš Golembiovskýwrite -P 0x0a 1023 1
197ccc47808STomáš Golembiovskýwrite -P 0x0a 1024 1
198ccc47808STomáš GolembiovskýEOT
199ccc47808STomáš Golembiovský) | _filter_qemu_io
200ccc47808STomáš Golembiovskýecho "checking boundaries"
201ccc47808STomáš Golembiovský$QEMU_IO -c "read -v 510 4" $TEST_IMG | _filter_qemu_io
202ccc47808STomáš Golembiovský$QEMU_IO -c "read -v 1022 4" $TEST_IMG | _filter_qemu_io
203ccc47808STomáš Golembiovský$QEMU_IO -c "read -v 1534 4" $TEST_IMG | _filter_qemu_io
204ccc47808STomáš Golembiovský$QEMU_IO -c "read -v 2558 4" $TEST_IMG | _filter_qemu_io
205ccc47808STomáš Golembiovský_cleanup_test_img
206ccc47808STomáš Golembiovský
207ccc47808STomáš Golembiovský# success, all done
208ccc47808STomáš Golembiovskýecho
209ccc47808STomáš Golembiovskýecho "*** done"
210ccc47808STomáš Golembiovskýrm -f $seq.full
211ccc47808STomáš Golembiovskýstatus=0
212