sandbox: tpm: Track whether the state is valid
authorSimon Glass <sjg@chromium.org>
Sun, 18 Jul 2021 20:18:02 +0000 (14:18 -0600)
committerSimon Glass <sjg@chromium.org>
Sun, 1 Aug 2021 15:05:24 +0000 (09:05 -0600)
Add checking as to whether the current TPM state is valid, so we can
implement reading/writing the state.

Signed-off-by: Simon Glass <sjg@chromium.org>
drivers/tpm/tpm2_tis_sandbox.c

index 5e0bd30..c287ca2 100644 (file)
@@ -49,6 +49,7 @@ static const u8 sandbox_extended_once_pcr[] = {
  * Information about our TPM emulation. This is preserved in the sandbox
  * state file if enabled.
  *
+ * @valid: true if this is valid (only used in s_state)
  * @init_done: true if open() has been called
  * @startup_done: true if TPM2_CC_STARTUP has been processed
  * @tests_done: true if TPM2_CC_SELF_TEST has be processed
@@ -62,6 +63,7 @@ static const u8 sandbox_extended_once_pcr[] = {
  * @nvdata: non-volatile data, used to store important things for the platform
  */
 struct sandbox_tpm2 {
+       bool valid;
        /* TPM internal states */
        bool init_done;
        bool startup_done;
@@ -73,6 +75,8 @@ struct sandbox_tpm2 {
        u32 pcr_extensions[SANDBOX_TPM_PCR_NB];
 };
 
+static struct sandbox_tpm2 s_state, *g_state;
+
 /*
  * Check the tag validity depending on the command (authentication required or
  * not). If authentication is required, check it is valid. Update the auth
@@ -606,11 +610,13 @@ static int sandbox_tpm2_probe(struct udevice *dev)
        /* Use the TPM v2 stack */
        priv->version = TPM_V2;
 
-       memset(tpm, 0, sizeof(*tpm));
-
        priv->pcr_count = 32;
        priv->pcr_select_min = 2;
 
+       if (s_state.valid)
+               memcpy(tpm, &s_state, sizeof(*tpm));
+       g_state = tpm;
+
        return 0;
 }