#! /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