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