blob: e31ac7495cc7ca33c85f2284e34bf71c56f147e8 [file] [log] [blame]
#!/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.
#
# 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
# Assume we can set a write protect range for 0-64KB
# This assumes the output from wp-status is:
# "some text ... start=0x00000000, len=0x00010000"
# where the start and length are key=value pairs
# FIXME: Should we intentionally disable write protection for this? The
# status register will not be changeable if hardware WP is in effect.
# Then again, if hardware WP is on, then we won't be able to disable WP
# either...
#
# FIXME #2: As per Carl-Daniel's comment, this test does not adequately
# check that encoding is correct. It only checks if the output matches
# the requested range.
#
. "$(pwd)/common.sh"
logfile="${0}.log"
# Try to write protect the uppermost block
new_wp_range_start=$((($(./flashrom ${FLASHROM_PARAM} --get-size 2>/dev/null) - 0x010000)))
new_wp_range_len=0x010000
# Back-up old settings
tmp=$(./flashrom ${FLASHROM_PARAM} --wp-status 2>/dev/null)
old_start=${tmp##*start=}
old_start=`printf "%s" "${old_start%%,*}"`
old_len=${tmp##*len=}
old_len=`printf "%s" "${old_len%%,*}"`
echo "old start: ${old_start}, old length: ${old_len}" >> ${logfile}
# If the old write protection settings are the same as the new ones, we need
# to choose new values. If this is the case, we'll drop the lower bound of the
# range by 1 block and extend the range 64K block.
if [ $((${old_start} == ${new_wp_range_start})) -ne 1 ] && [ $((${old_len} == ${new_wp_range_len})) -ne 1 ] ; then
new_wp_range_start=$((${new_wp_range_start} - 0x10000))
new_wp_range_len=$((${new_wp_range_len} + 0x10000))
fi
# Try to set new range values
echo "attempting to set write protect range: start=${new_wp_range_start} ${new_wp_range_len}" >> ${logfile}
do_test_flashrom --wp-range ${new_wp_range_start} ${new_wp_range_len}
if [ ${?} -ne ${EXIT_SUCCESS} ]; then
echo -n "failed to set write protect range" >> ${logfile}
return ${EXIT_FAILURE}
fi
tmp=$(./flashrom ${FLASHROM_PARAM} --wp-status 2>/dev/null)
new_start=${tmp##*start=}
new_start=`printf "%s" "${new_start%%,*}"`
new_len=${tmp##*len=}
new_len=`printf "%s" "${new_len%%,*}"`
if [ $((${new_start} == ${new_wp_range_start})) -ne 1 ]; then return ${EXIT_FAILURE} ; fi
if [ $((${new_len} == ${new_wp_range_len})) -ne 1 ]; then return ${EXIT_FAILURE} ; fi
# restore the old settings
do_test_flashrom --wp-range ${old_start} ${old_len}
if [ ${?} -ne ${EXIT_SUCCESS} ]; then
echo "failed to restore old settings" >> ${logfile}
return ${EXIT_FAILURE}
fi
echo "$0: passed" >> ${logfile}
return ${EXIT_SUCCESS}