You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
81 lines
2.4 KiB
81 lines
2.4 KiB
/* 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. |
|
* |
|
* Temporary fix for running the TPM selftest and other essential |
|
* intializations that we forgot to put in the BIOS. |
|
* |
|
* This works in a very specific situation: we assume TPM_Startup has been |
|
* executed, but we don't know if the self test has run. On a ST TPM version |
|
* 1.2.7.0, GetCapabilities fails before the self test has run, so we use that |
|
* to check if we need to run it. |
|
* |
|
* This also enables the TPM if it is disabled, and activates it if it is |
|
* deactivated. |
|
* |
|
* Exit status always 0. Prints "reboot" to request reboot, "fail" for errors, |
|
* "success" when everything worked. |
|
*/ |
|
|
|
#include <stdint.h> |
|
#include <stdio.h> |
|
#include <syslog.h> |
|
|
|
#include "tlcl.h" |
|
|
|
int main(int argc, char* argv[]) { |
|
uint32_t result; |
|
uint8_t disable, deactivated; |
|
int pri = LOG_USER | LOG_ERR; |
|
|
|
TlclLibInit(); |
|
TlclStartup(); /* ignore result */ |
|
|
|
/* On the dogfood device, GetFlags causes an assertion failure because the |
|
* device uses an older TPM which is not compatible with the current spec. |
|
* We take advantage of this to cause the program to exit and not run the |
|
* self test again (which takes 1 second). |
|
*/ |
|
result = TlclGetFlags(NULL, NULL, NULL); |
|
|
|
result = TlclSelfTestFull(); |
|
if (result != 0) { |
|
syslog(pri, "TPM selftest failed with code 0x%x\n", result); |
|
printf("fail\n"); |
|
return 0; |
|
} |
|
|
|
/* Optional one-time enabling of TPM. */ |
|
result = TlclAssertPhysicalPresence(); |
|
if (result != 0) { |
|
syslog(pri, "TPM assertpp failed with code 0x%x\n", result); |
|
printf("fail\n"); |
|
return 0; |
|
} |
|
result = TlclGetFlags(&disable, &deactivated, NULL); |
|
if (result != 0) { |
|
syslog(pri, "TPM getflags failed with code 0x%x\n", result); |
|
printf("fail\n"); |
|
return 0; |
|
} |
|
if (disable) { |
|
result = TlclSetEnable(); |
|
if (result != 0) { |
|
syslog(pri, "TPM physical enable failed with code 0x%x\n", result); |
|
printf("fail\n"); |
|
return 0; |
|
} |
|
} |
|
if (deactivated) { |
|
result = TlclSetDeactivated(0); |
|
if (result != 0) { |
|
syslog(pri, "TPM physical activate failed with code 0x%x\n", result); |
|
printf("fail\n"); |
|
} else { |
|
printf("reboot\n"); |
|
} |
|
return 0; /* needs reboot */ |
|
} |
|
printf("success\n"); |
|
return 0; |
|
}
|
|
|