62 lines
2.5 KiB
Python
62 lines
2.5 KiB
Python
# Copyright 2019 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.
|
|
|
|
import logging
|
|
import re
|
|
import time
|
|
|
|
from autotest_lib.client.common_lib import error
|
|
from autotest_lib.server.cros.faft.firmware_test import FirmwareTest
|
|
|
|
|
|
class firmware_Cr50TpmManufactured(FirmwareTest):
|
|
"""Check if the TPM is manufactured."""
|
|
version = 1
|
|
|
|
NUM_RESETS = 5
|
|
MANUFACTURED_RE = 'tpm_manufactured:( NOT)? manufactured'
|
|
|
|
def run_once(self):
|
|
"""Check if the TPM is manufactured."""
|
|
if not hasattr(self, 'cr50'):
|
|
raise error.TestNAError('Test can only be run on devices with '
|
|
'access to the Cr50 console')
|
|
|
|
# Signing is different in dev signed images. This test doesn't really
|
|
# apply.
|
|
if not self.cr50.using_prod_rw_keys():
|
|
raise error.TestNAError('Running dev signed image')
|
|
|
|
# Reset the AP a couple of times in case the console drops any
|
|
# characters.
|
|
for i in range(self.NUM_RESETS):
|
|
self.servo.get_power_state_controller().warm_reset()
|
|
time.sleep(10)
|
|
# Use cr50 uart capture to check the cr50 console messages. We could
|
|
# send sysrst pulse and check the cr50 response, but that would require
|
|
# opening cr50 which may not be possible if the TPM isn't manufactured.
|
|
# We want to make this as accessible as possible and checking the
|
|
# captured uart is the best way to do that.
|
|
self._record_uart_capture()
|
|
cr50_uart_file = self.servo.get_uart_logfile('cr50')
|
|
if not cr50_uart_file:
|
|
raise error.TestNAError('No saved uart file')
|
|
with open(cr50_uart_file, 'r') as f:
|
|
contents = f.read()
|
|
logging.debug('Cr50 reset logs:\n%s', contents)
|
|
|
|
found = re.findall(self.MANUFACTURED_RE, contents)
|
|
# The uart won't be captured if someone has the cr50 console open.
|
|
if not found:
|
|
raise error.TestNAError('Could not find %r. Close cr50 console' %
|
|
self.MANUFACTURED_RE)
|
|
logging.debug('Matches for tpm_manufactured: %r', found)
|
|
res = set(found)
|
|
if len(res) > 1:
|
|
raise error.TestError('Found more than one manufacture setting')
|
|
manufactured_state = res.pop()
|
|
logging.info('tpm%s manufactured', manufactured_state)
|
|
if ' NOT' == manufactured_state:
|
|
raise error.TestFail('TPM not manufactured')
|