blob: ec2d0337dcc1f93239bced8c417c8d03fae82f2e [file] [log] [blame]
#! /bin/sh -e
# Copyright (c) 2010 The Chromium OS Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
#
# Finds the largest NV space that can be defined on the TPM in this state
# (i.e. without removing existing spaces).
#
# The TPM must be unowned, and physical presence must be on.
low=1
high=1500
try=$high
# Binary search with no upper bound
while true; do
## echo trying $try [ $low $high ]
if /usr/bin/tpmc definespace 0xf004 $(printf "%#x" $try) 0x1 \
> /dev/null 2>&1; then
# definespace success: end, or $try must grow
if [ $try -eq $low ]; then
echo $low
exit 0
elif [ $try -lt $high ]; then
low=$try
try=$(( ( $high + $low ) / 2 ))
else
# special case: when try == high, expand the search
low=$try
try=$(( $try * 2 ))
high=$try
fi
else
# check for unexpected errors
result=$?
if [ $result -ne 17 ]; then
echo running tpmc definespace 0xf004 0x1 0x1
/usr/bin/tpmc definespace 0xf004 0x1 0x1
echo please correct this condition and try again
exit 1
fi
# definespace failure: end, or $try must shrink
if [ $try -eq $low ]; then
echo 0
exit 0
fi
high=$try
try=$(( ( $high + $low ) / 2 ))
fi
done