summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVadim Bendebury <vbendeb@chromium.org>2016-07-16 18:14:02 -0700
committerchrome-bot <chrome-bot@chromium.org>2016-07-21 17:32:23 -0700
commitc2434ec5eb46b6c28fd22c8f10ae6dd43c48475d (patch)
tree875b80c226a86715f06f07ce091fcee41a28cff7
parent9b752cbcd41be2d6cf6c8dbbe655aac3e53f146a (diff)
downloadchrome-ec-c2434ec5eb46b6c28fd22c8f10ae6dd43c48475d.tar.gz
CR50: do not try searching in uninitialized TPM NV RAM.
The manufacturing status check verifies if the proper certificates are found in the device NV RAM. This check can not succeed unless NV RAM metadata is initialized by calling _TPM_Init(). If the check shows that the device has not been through manufacturing sequence yet, TPM_Manufacture() needs to be invoked to make sure that all relevant TPM structures are initialized and properly stored in NV RAM. _TPM_Init() needs to be invoked again after that. BRANCH=ToT BUG=chrome-os-partner:43025 TEST=restarting Kevin device with pre-manufactured CR50 takes it through factory initialization on every reboot. Restarting Kevin once TPM is through manufacturing process shows that the previously saved rollback counters are preserved. Signed-off-by: Vadim Bendebury <vbendeb@chromium.org> Reviewed-on: https://chromium-review.googlesource.com/361093 Reviewed-by: Nagendra Modadugu <ngm@google.com> (cherry picked from commit 61a0fe734e808d1dbdf56fb6023e04adf66553b3) (cherry picked from commit 3207a57fb2f5957b6e833d9ab1f9ea46021c5e1e) Change-Id: I80b69f2c4b8d0e4cca154db510867df39c707ce2 Reviewed-on: https://chromium-review.googlesource.com/362084
-rw-r--r--common/tpm_registers.c29
1 files changed, 14 insertions, 15 deletions
diff --git a/common/tpm_registers.c b/common/tpm_registers.c
index 5a71dea1b2..66b6bcbf81 100644
--- a/common/tpm_registers.c
+++ b/common/tpm_registers.c
@@ -17,6 +17,7 @@
#include "signed_header.h"
#include "system.h"
#include "task.h"
+#include "tpm_manufacture.h"
#include "tpm_registers.h"
#include "util.h"
#include "watchdog.h"
@@ -447,12 +448,8 @@ void tpm_register_get(uint32_t regaddr, uint8_t *dest, uint32_t data_size)
CPRINTF("\n");
}
-
static void tpm_init(void)
{
- uint32_t saved_value;
- const uint32_t manufacturing_done = 0x12344321;
-
set_tpm_state(tpm_state_idle);
tpm_.regs.access = tpm_reg_valid_sts;
tpm_.regs.sts = (tpm_family_tpm2 << tpm_family_shift) |
@@ -463,22 +460,24 @@ static void tpm_init(void)
/*
- * TODO(ngm): CRBUG/50115, initialize state expected by TPM2
- * compliance tests.
+ * Make sure NV RAM metadata is initialized, needed to check
+ * manufactured status. This is a speculative call which will have to
+ * be repeated in case the TPM has not been through the manufacturing
+ * sequence yet.
*
- * Until it is done properly, use location at offset 0 in the generic
- * section of NVRAM to store the manufacturing status. Otherwise the
- * NV RAM is wiped out on every reboot.
+ * No harm in calling it twice in that case.
*/
- nvmem_read(0, sizeof(saved_value), &saved_value, NVMEM_CR50);
- if (saved_value != manufacturing_done) {
+ _TPM_Init();
+
+ if (!tpm_manufactured()) {
+ /*
+ * If tpm has not been manufactured yet - this needs to run on
+ * every startup. It will wipe out NV RAM, among other things.
+ */
TPM_Manufacture(1);
- saved_value = manufacturing_done;
- nvmem_write(0, sizeof(saved_value), &saved_value, NVMEM_CR50);
- nvmem_commit();
+ _TPM_Init();
}
- _TPM_Init();
_plat__SetNvAvail();
}