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
 |