51 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
			
		
		
	
	
			51 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
| #! /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 "0x%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
 |