Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(73)

Side by Side Diff: util/partial_writes_x86_bios.sh

Issue 5136001: Add new testing framework along with a few micro-tests. (Closed) Base URL: svn://coreboot.org/flashrom/trunk/util
Patch Set: General updates, add rough EC unit testing Created 10 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
(Empty)
1 #!/bin/sh
hailfinger 2010/11/23 20:05:34 Is this script identical to the partial write test
dhendrix 2010/11/24 02:48:14 Not quite. The one that is already present is stan
2 #
3 # Copyright (C) 2010 Google Inc.
4 # Written by David Hendricks for Google Inc.
5 #
6 # This program is free software; you can redistribute it and/or modify
7 # it under the terms of the GNU General Public License as published by
8 # the Free Software Foundation; either version 2 of the License, or
9 # (at your option) any later version.
10 #
11 # This program is distributed in the hope that it will be useful,
12 # but WITHOUT ANY WARRANTY; without even the implied warranty of
13 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 # GNU General Public License for more details.
15 #
16 # You should have received a copy of the GNU General Public License
17 # along with this program; if not, write to the Free Software
18 # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
19 #
20 # This script attempts to test Flashrom partial write capability by writing
21 # patterns of 0xff and 0x00 bytes to the lowest 128KB of flash. 128KB is chosen
22 # since 64KB is usually the largest possible block size, so we will try to
23 # cover at least two blocks with this test.
24 #
25 # TODO: We need to make sure to force re-writes when desired since flashrom
26 # may skip regions which do not need to be re-written.
27 #
28
29 LOGFILE="${0}.log"
30 ZERO_4K="00_4k.bin"
31 FF_4K="ff_4k.bin"
32 FF_4K_TEXT="ff_4k.txt"
33
34 TESTFILE="test.bin"
35
36 partial_writes_fail()
37 {
38 echo "$1" >> ${LOGFILE}
39 echo "$0: failed" >> ${LOGFILE}
40 exit ${EXIT_FAILURE}
41 }
42
43 # FIXME: this is a chromium-os -ism. most distros don't strip out "diff"...
44 which diff > /dev/null
45 if [ "$?" != "0" ] ; then
46 partial_writes_fail "diff is required to use this script"
47 fi
48
49 which uuencode > /dev/null
50 if [ "$?" != "0" ] ; then
51 partial_writes_fail "uuencode is required to use this script"
52 fi
53
54 # Make 4k worth of 0xff bytes
55 echo "begin 640 $FF_4K" > "$FF_4K_TEXT"
56 i=0
57 while [ $i -le 90 ] ; do
58 echo "M____________________________________________________________" >> "$FF_4K_TEXT"
59 i=$((${i} + 1))
60 done
61 echo "!_P``" >> "$FF_4K_TEXT"
62 echo "\`" >> "$FF_4K_TEXT"
63 echo "end" >> "$FF_4K_TEXT"
64 uudecode -o "$FF_4K" "$FF_4K_TEXT"
65 rm -f "$FF_4K_TEXT"
66
67 # Make 4k worth of 0x00 bytes
68 dd if=/dev/zero of="$ZERO_4K" bs=1 count=4096 2> /dev/null
69 echo "ffh pattern written in ${FF_4K}"
70 echo "00h pattern written in ${ZERO_4K}"
71
72 #
73 # Actual tests are performed below.
74 #
75 NUM_REGIONS=16
76
77 # Make a layout - 4K regions on 4K boundaries. This will test basic
Stefan Reinauer 2010/11/23 19:05:30 Maybe a separate function?
dhendrix 2010/11/24 02:48:14 As with the EC stuff, I made this into a loop. Mak
78 # functionality of erasing and writing specific blocks.
79 echo "
80 0x000000:0x000fff 00_0
81 0x001000:0x001fff ff_0
82
83 0x002000:0x002fff 00_1
84 0x003000:0x003fff ff_1
85
86 0x004000:0x004fff 00_2
87 0x005000:0x005fff ff_2
88
89 0x006000:0x006fff 00_3
90 0x007000:0x007fff ff_3
91
92 0x008000:0x008fff 00_4
93 0x009000:0x009fff ff_4
94
95 0x00a000:0x00afff 00_5
96 0x00b000:0x00bfff ff_5
97
98 0x00c000:0x00cfff 00_6
99 0x00d000:0x00dfff ff_6
100
101 0x00e000:0x00efff 00_7
102 0x00f000:0x00ffff ff_7
103
104 0x010000:0x010fff 00_8
105 0x011000:0x011fff ff_8
106
107 0x012000:0x012fff 00_9
108 0x013000:0x013fff ff_9
109
110 0x014000:0x014fff 00_10
111 0x015000:0x015fff ff_10
112
113 0x016000:0x016fff 00_11
114 0x017000:0x017fff ff_11
115
116 0x018000:0x018fff 00_12
117 0x019000:0x019fff ff_12
118
119 0x01a000:0x01afff 00_13
120 0x01b000:0x01bfff ff_13
121
122 0x01c000:0x01cfff 00_14
123 0x01d000:0x01dfff ff_14
124
125 0x01e000:0x01efff 00_15
126 0x01f000:0x01ffff ff_15
127 " > layout_4k_aligned.txt
128
129 cp "${BACKUP}" "$TESTFILE"
130 i=0
131 while [ $i -lt $NUM_REGIONS ] ; do
132 tmpstr="aligned region ${i} test: "
133 offset=$((${i} * 8192))
134 dd if=${ZERO_4K} of=${TESTFILE} bs=1 conv=notrunc seek=${offset} 2> /dev /null
135 dd if=${FF_4K} of=${TESTFILE} bs=1 conv=notrunc seek=$((${offset} + 4096 )) 2> /dev/null
136
137 ./flashrom ${FLASHROM_PARAM} -l layout_4k_aligned.txt -i 00_${i} -i ff_$ {i} -w "$TESTFILE" 2> /dev/null
138 if [ "$?" != "0" ] ; then
139 partial_writes_fail "failed to flash region"
140 fi
141
142 # download the entire ROM image and use diff to compare to ensure
143 # flashrom logic does not violate user-specified regions
144 flashrom ${FLASHROM_PARAM} -r difftest.bin 2> /dev/null
145 diff -q difftest.bin "$TESTFILE"
146 if [ "$?" != "0" ] ; then
147 partial_writes_fail "failed diff test"
148 fi
149 rm -f difftest.bin
150
151 i=$((${i} + 1))
152 echo "${tmpstr}passed" >> ${LOGFILE}
153 done
154
155 # Make a layout - 4K regions on 4.5K boundaries. This will help find problems
Stefan Reinauer 2010/11/23 19:05:30 ditto
156 # with logic that only operates on part of a block. For example, if a user
157 # wishes to re-write a fraction of a block, then:
158 # 1. The whole block must be erased.
159 # 2. The old content must be restored at unspecified offsets.
160 # 3. The new content must be written at specified offsets.
161 #
162 # Note: The last chunk of 0xff bytes is only 2K as to avoid overrunning a 128KB
163 # test image.
164 #
165 echo "
166 0x000800:0x0017ff 00_0
167 0x001800:0x0027ff ff_0
168
169 0x002800:0x0037ff 00_1
170 0x003800:0x0047ff ff_1
171
172 0x004800:0x0057ff 00_2
173 0x005800:0x0067ff ff_2
174
175 0x006800:0x0077ff 00_3
176 0x007800:0x0087ff ff_3
177
178 0x008800:0x0097ff 00_4
179 0x009800:0x00a7ff ff_4
180
181 0x00a800:0x00b7ff 00_5
182 0x00b800:0x00c7ff ff_5
183
184 0x00c800:0x00d7ff 00_6
185 0x00d800:0x00e7ff ff_6
186
187 0x00e800:0x00f7ff 00_7
188 0x00f800:0x0107ff ff_7
189
190 0x010800:0x0117ff 00_8
191 0x011800:0x0127ff ff_8
192
193 0x012800:0x0137ff 00_9
194 0x013800:0x0147ff ff_9
195
196 0x014800:0x0157ff 00_10
197 0x015800:0x0167ff ff_10
198
199 0x016800:0x0177ff 00_11
200 0x017800:0x0187ff ff_11
201
202 0x018800:0x0197ff 00_12
203 0x019800:0x01a7ff ff_12
204
205 0x01a800:0x01b7ff 00_13
206 0x01b800:0x01c7ff ff_13
207
208 0x01c800:0x01d7ff 00_14
209 0x01d800:0x01e7ff ff_14
210
211 0x01e800:0x01f7ff 00_15
212 0x01f800:0x01ffff ff_15
213 " > layout_unaligned.txt
214
215 # reset the test file and ROM to the original state
216 flashrom ${FLASHROM_PARAM} -w "${BACKUP}" > /dev/null
217 cp "$BACKUP" "$TESTFILE"
218
219 i=0
220 while [ $i -lt $NUM_REGIONS ] ; do
221 tmpstr="aligned region ${i} test: "
222 offset=$(($((${i} * 8192)) + 2048))
223 # Protect against too long write
224 writelen=4096
225 if [ $((${offset} + 4096 + 4096)) -ge 131072 ]; then
226 writelen=$((131072 - $((${offset} + 4096))))
227 if [ ${writelen} -lt 0 ]; then
228 writelen=0
229 fi
230 fi
231 dd if=${ZERO_4K} of=${TESTFILE} bs=1 conv=notrunc seek=${offset} 2> /dev /null
232 dd if=${FF_4K} of=${TESTFILE} bs=1 conv=notrunc seek=$((${offset} + 4096 )) count=writelen 2> /dev/null
233
234 ./flashrom ${FLASHROM_PARAM} -l layout_unaligned.txt -i 00_${i} -i ff_${ i} -w "$TESTFILE" 2> /dev/null
235 if [ "$?" != "0" ] ; then
236 partial_writes_fail "failed to flash region"
237 fi
238
239 # download the entire ROM image and use diff to compare to ensure
240 # flashrom logic does not violate user-specified regions
241 flashrom ${FLASHROM_PARAM} -r difftest.bin 2> /dev/null
242 diff -q difftest.bin "$TESTFILE"
243 if [ "$?" != "0" ] ; then
244 partial_writes_fail "failed diff test"
245 fi
246 rm -f difftest.bin
247
248 i=$((${i} + 1))
249 echo "${tmpstr}passed" >> ${LOGFILE}
250 done
251
252 return "$EXIT_SUCCESS"
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698