mirror of
https://review.coreboot.org/flashrom.git
synced 2025-04-26 22:52:34 +02:00

Change-Id: I7bfc339673cbf5ee2d2ff7564c4db04ca088d0a4 Signed-off-by: Elyes HAOUAS <ehaouas@noos.fr> Reviewed-on: https://review.coreboot.org/25381 Tested-by: build bot (Jenkins) <no-reply@coreboot.org> Reviewed-by: Nico Huber <nico.h@gmx.de>
290 lines
7.0 KiB
Bash
Executable File
290 lines
7.0 KiB
Bash
Executable File
#!/bin/sh
|
|
#
|
|
# Copyright (C) 2010 Google Inc.
|
|
# Written by David Hendricks for 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.
|
|
#
|
|
# 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)
|
|
|
|
# test data location
|
|
TMPDIR=$(mktemp -d -t flashrom_test.XXXXXXXXXX)
|
|
if [ "$?" != "0" ] ; then
|
|
echo "Could not create temporary directory"
|
|
exit $EXIT_FAILURE
|
|
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"
|
|
i=0
|
|
while [ $i -le 90 ] ; do
|
|
echo "M____________________________________________________________" >> "$FF_4K_TEXT"
|
|
i=$((${i} + 1))
|
|
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 ${FLASHROM_PARAM} -r "$BIOS" > /dev/null
|
|
echo "Original image saved as ${BIOS}"
|
|
|
|
# $1: exit code
|
|
do_exit() {
|
|
if [ ${1} -eq ${EXIT_FAILURE} ] ; then
|
|
echo "Result: FAILED"
|
|
else
|
|
echo "Result: PASSED"
|
|
fi
|
|
|
|
echo "restoring original bios image using system's flashrom"
|
|
flashrom ${FLASHROM_PARAM} -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
|
|
echo -n "aligned region ${i} test: "
|
|
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 "failed to flash region"
|
|
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 ${FLASHROM_PARAM} -r difftest.bin > /dev/null
|
|
diff -q difftest.bin "$TESTFILE"
|
|
if [ "$?" != "0" ] ; then
|
|
echo "failed diff test"
|
|
do_exit "$EXIT_FAILURE"
|
|
fi
|
|
rm -f difftest.bin
|
|
|
|
i=$((${i} + 1))
|
|
echo "passed"
|
|
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.
|
|
#
|
|
# Note: The last chunk of 0xff bytes is only 2k as to avoid overrunning a 128kB
|
|
# test image.
|
|
#
|
|
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
|
|
|
|
0x01e800:0x01f7ff 00_15
|
|
0x01f800:0x01ffff ff_15
|
|
" > layout_unaligned.txt
|
|
|
|
# reset the test file and ROM to the original state
|
|
flashrom ${FLASHROM_PARAM} -w "$BIOS" > /dev/null
|
|
cp "$BIOS" "$TESTFILE"
|
|
|
|
i=0
|
|
while [ $i -lt $NUM_REGIONS ] ; do
|
|
echo -n "unaligned region ${i} test: "
|
|
|
|
offset=$(($((${i} * 8192)) + 2048))
|
|
# Protect against too long write
|
|
writelen=4096
|
|
if [ $((${offset} + 4096 + 4096)) -ge 131072 ]; then
|
|
writelen=$((131072 - $((${offset} + 4096))))
|
|
if [ ${writelen} -lt 0 ]; then
|
|
writelen=0
|
|
fi
|
|
fi
|
|
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)) count=writelen 2> /dev/null
|
|
|
|
./flashrom ${FLASHROM_PARAM} -l layout_unaligned.txt -i 00_${i} -i ff_${i} -w "$TESTFILE" > /dev/null
|
|
if [ "$?" != "0" ] ; then
|
|
echo "failed to flash region"
|
|
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 ${FLASHROM_PARAM} -r difftest.bin > /dev/null
|
|
diff -q difftest.bin "$TESTFILE"
|
|
if [ "$?" != "0" ] ; then
|
|
echo "failed diff test"
|
|
do_exit "$EXIT_FAILURE"
|
|
fi
|
|
rm -f difftest.bin
|
|
|
|
i=$((${i} + 1))
|
|
echo "passed"
|
|
done
|
|
|
|
do_exit "$EXIT_SUCCESS"
|