New version, more bug fixes. Thanks for Carl-Daniel for testing!
- Restore the original ROM before beginning the second set of tests.
- The last iteration of the second test (un-aligned partial writes) was
causing problems on a 128KB part (emulated). I've removed it for now since
I'm in a hurry to get out tonight.
- Fixed a copy + paste error in the 4k aligned test layout.
- Added $FLASHROM_PARAM to the list of parameters passed into Flashrom.
On Tue, Oct 26, 2010 at 5:33 PM, David Hendricks <[email protected]>wrote:
> On Tue, Oct 26, 2010 at 4:42 PM, David Hendricks <[email protected]>wrote:
>
>> After a few tries at manually verifying partial writes and realizing that
>> it's awfully tedious to do any exhaustive testing, I hastily threw together
>> a shell script to help automate the process. Since there are others on this
>> list doing similar things, I figured it might be helpful to throw it up
>> here.
>>
>> Note: It's unfinished and probably has bugs, but I figure it's at least a
>> start, even if only to kickstart a conversation about how to test partial
>> writes in a standard and useful manner.
>>
>
> idwer already noticed at least one issue, so I attempted to correct it
> along with a couple others.
>
> - Default path for flashrom binary should be "../flashrom" since that is
> where a user will typically have built a fresh binary. This can be
> overridden easily.
> - Suppressed some annoying output from "dd" command.
> - Implemented better checks for uuencode and pre-installed (assumed to be
> stable) flashrom binary.
>
> Signed-off-by: David Hendricks <[email protected]>
>
> --
> David Hendricks (dhendrix)
> Systems Software Engineer, Google Inc.
>
--
David Hendricks (dhendrix)
Systems Software Engineer, Google Inc.
Index: layout.c
===================================================================
--- layout.c (revision 1217)
+++ layout.c (working copy)
@@ -31,7 +31,7 @@
#endif
static int romimages = 0;
-#define MAX_ROMLAYOUT 16
+#define MAX_ROMLAYOUT 32
typedef struct {
unsigned int start;
Index: util/flashrom_partial_write_test.sh
===================================================================
--- util/flashrom_partial_write_test.sh (revision 0)
+++ util/flashrom_partial_write_test.sh (revision 0)
@@ -0,0 +1,267 @@
+#!/bin/sh
+#
+# Copyright (C) 2010 Google Inc.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+#
+# This script attempts to test Flashrom partial write capability by writing
+# patterns of 0xff and 0x00 bytes to the lowest 128KB of flash. 128KB is chosen
+# since 64KB is usually the largest possible block size, so we will try to
+# cover at least two blocks with this test.
+
+EXIT_SUCCESS=0
+EXIT_FAILURE=1
+
+# The copy of flashrom to test. If unset, we'll assume the user wants to test
+# a newly built flashrom binary in the parent directory (this script should
+# reside in flashrom/util).
+if [ -z "$FLASHROM" ] ; then
+ FLASHROM="../flashrom"
+fi
+echo "testing flashrom binary: ${FLASHROM}"
+
+OLDDIR=$(pwd)
+if [ -z "$TMPDIR" ]; then
+ TMPDIR=$(mktemp -d) # test data location
+fi
+
+ZERO_4K="00_4k.bin"
+FF_4K="ff_4k.bin"
+FF_4K_TEXT="ff_4k.txt"
+
+TESTFILE="test.bin"
+
+which uuencode > /dev/null
+if [ "$?" != "0" ] ; then
+ echo "uuencode is required to use this script"
+ exit $EXIT_FAILURE
+fi
+
+which flashrom > /dev/null
+if [ "$?" != "0" ] ; then
+ echo "Please install a stable version of flashrom in your path."
+ echo "This will be used to compare the test flashrom binary and "
+ echo "restore your firmware image at the end of the test."
+ exit $EXIT_FAILURE
+fi
+
+# Keep a copy of flashrom with the test data
+cp "$FLASHROM" "${TMPDIR}/"
+cd "$TMPDIR"
+echo "Running test in ${TMPDIR}"
+
+# Make 4k worth of 0xff bytes
+echo "begin 640 $FF_4K" > "$FF_4K_TEXT"
+for i in `seq 0 90` ; do
+ echo "M____________________________________________________________" >> "$FF_4K_TEXT"
+done
+echo "!_P``" >> "$FF_4K_TEXT"
+echo "\`" >> "$FF_4K_TEXT"
+echo "end" >> "$FF_4K_TEXT"
+uudecode -o "$FF_4K" "$FF_4K_TEXT"
+rm -f "$FF_4K_TEXT"
+
+# Make 4k worth of 0x00 bytes
+dd if=/dev/zero of="$ZERO_4K" bs=1 count=4096 2>/dev/null
+echo "ffh pattern written in ${FF_4K}"
+echo "00h pattern written in ${ZERO_4K}"
+
+echo "Reading BIOS image"
+BIOS="bios.bin"
+flashrom -r "$BIOS" 2>&1 > /dev/null
+echo "Original image saved as ${BIOS}"
+
+# $1: exit code
+do_exit() {
+ echo "restoring original bios image using system's flashrom"
+ flashrom -w "$BIOS"
+ echo "test files remain in ${TMPDIR}"
+ cd "$OLDDIR"
+ exit "$1"
+}
+
+#
+# Actual tests are performed below.
+#
+NUM_REGIONS=16
+
+# Make a layout - 4K regions on 4K boundaries. This will test basic
+# functionality of erasing and writing specific blocks.
+echo "
+0x000000:0x000fff 00_0
+0x001000:0x001fff ff_0
+
+0x002000:0x002fff 00_1
+0x003000:0x003fff ff_1
+
+0x004000:0x004fff 00_2
+0x005000:0x005fff ff_2
+
+0x006000:0x006fff 00_3
+0x007000:0x007fff ff_3
+
+0x008000:0x008fff 00_4
+0x009000:0x009fff ff_4
+
+0x00a000:0x00afff 00_5
+0x00b000:0x00bfff ff_5
+
+0x00c000:0x00cfff 00_6
+0x00d000:0x00dfff ff_6
+
+0x00e000:0x00efff 00_7
+0x00f000:0x00ffff ff_7
+
+0x010000:0x010fff 00_8
+0x011000:0x011fff ff_8
+
+0x012000:0x012fff 00_9
+0x013000:0x013fff ff_9
+
+0x014000:0x014fff 00_10
+0x015000:0x015fff ff_10
+
+0x016000:0x016fff 00_11
+0x017000:0x017fff ff_11
+
+0x018000:0x018fff 00_12
+0x019000:0x019fff ff_12
+
+0x01a000:0x01afff 00_13
+0x01b000:0x01bfff ff_13
+
+0x01c000:0x01cfff 00_14
+0x01d000:0x01dfff ff_14
+
+0x01e000:0x01efff 00_15
+0x01f000:0x01ffff ff_15
+" > layout_4k_aligned.txt
+
+cp "$BIOS" "$TESTFILE"
+i=0
+while [ $i -lt $NUM_REGIONS ] ; do
+ offset=$((${i} * 8192))
+ dd if=${ZERO_4K} of=${TESTFILE} bs=1 conv=notrunc seek=${offset} 2>/dev/null
+ dd if=${FF_4K} of=${TESTFILE} bs=1 conv=notrunc seek=$((${offset} + 4096)) 2>/dev/null
+
+ ./flashrom "$FLASHROM_PARAM" -l layout_4k_aligned.txt -i 00_${i} -i ff_${i} -w "$TESTFILE" >/dev/null
+ if [ "$?" != "0" ] ; then
+ echo "partial flash failed on iteration ${i}"
+ echo "Result: FAIL"
+ do_exit "$EXIT_FAILURE"
+ fi
+
+ # download the entire ROM image and use diff to compare to ensure
+ # flashrom logic does not violate user-specified regions
+ flashrom -r difftest.bin > /dev/null
+ diff -q difftest.bin "$TESTFILE"
+ if [ "$?" != "0" ] ; then
+ echo "diff test failed on iteration ${i}"
+ echo "Result: FAIL"
+ do_exit "$EXIT_FAILURE"
+ fi
+ rm -f difftest.bin
+
+ i=$((${i} + 1))
+done
+
+# Make a layout - 4K regions on 4.5K boundaries. This will help find problems
+# with logic that only operates on part of a block. For example, if a user
+# wishes to re-write a fraction of a block, then:
+# 1. The whole block must be erased.
+# 2. The old content must be restored at unspecified offsets.
+# 3. The new content must be written at specified offsets.
+echo "
+0x000800:0x0017ff 00_0
+0x001800:0x0027ff ff_0
+
+0x002800:0x0037ff 00_1
+0x003800:0x0047ff ff_1
+
+0x004800:0x0057ff 00_2
+0x005800:0x0067ff ff_2
+
+0x006800:0x0077ff 00_3
+0x007800:0x0087ff ff_3
+
+0x008800:0x0097ff 00_4
+0x009800:0x00a7ff ff_4
+
+0x00a800:0x00b7ff 00_5
+0x00b800:0x00c7ff ff_5
+
+0x00c800:0x00d7ff 00_6
+0x00d800:0x00e7ff ff_6
+
+0x00e800:0x00f7ff 00_7
+0x00f800:0x0107ff ff_7
+
+0x010800:0x0117ff 00_8
+0x011800:0x0127ff ff_8
+
+0x012800:0x0137ff 00_9
+0x013800:0x0147ff ff_9
+
+0x014800:0x0157ff 00_10
+0x015800:0x0167ff ff_10
+
+0x016800:0x0177ff 00_11
+0x017800:0x0187ff ff_11
+
+0x018800:0x0197ff 00_12
+0x019800:0x01a7ff ff_12
+
+0x01a800:0x01b7ff 00_13
+0x01b800:0x01c7ff ff_13
+
+0x01c800:0x01d7ff 00_14
+0x01d800:0x01e7ff ff_14
+" > layout_unaligned.txt
+
+# reset the test file and ROM to the original state
+flashrom -w "$BIOS"
+cp "$BIOS" "$TESTFILE"
+
+i=0
+# Note to self -- we will need to do something weird about the last iteration
+# to stay within 128K, rather than going to 128K + 2048k...
+while [ $i -lt $NUM_REGIONS ] ; do
+ offset=$(($((${i} * 8192)) + 2048))
+ dd if=${ZERO_4K} of=${TESTFILE} bs=1 conv=notrunc seek=${offset} 2>/dev/null
+ dd if=${FF_4K} of=${TESTFILE} bs=1 conv=notrunc seek=$((${offset} + 4096)) 2>/dev/null
+
+ ./flashrom "$FLASHROM_PARAM" -l layout_unaligned.txt -i 00_${i} -i ff_${i} -w "$TESTFILE" >/dev/null
+ if [ "$?" != "0" ] ; then
+ echo "partial flash failed on iteration ${i}"
+ echo "Result: FAIL"
+ do_exit "$EXIT_FAILURE"
+ fi
+
+ # download the entire ROM image and use diff to compare to ensure
+ # flashrom logic does not violate user-specified regions
+ flashrom -r difftest.bin > /dev/null
+ diff -q difftest.bin "$TESTFILE"
+ if [ "$?" != "0" ] ; then
+ echo "diff test failed on iteration ${i}"
+ echo "Result: FAIL"
+ do_exit "$EXIT_FAILURE"
+ fi
+ rm -f difftest.bin
+
+ i=$((${i} + 1))
+done
+
+echo "Result: PASS"
+do_exit "$EXIT_SUCCESS"
_______________________________________________
flashrom mailing list
[email protected]
http://www.flashrom.org/mailman/listinfo/flashrom