Thread (11 messages) 11 messages, 3 authors, 2022-01-14

Re: [PATCH v19 3/5] tpm: tpm_tis: Verify TPM_STS register is valid after locality request

From: Jarkko Sakkinen <jarkko@kernel.org>
Date: 2021-11-17 08:10:56
Also in: linux-devicetree, lkml

On Thu, 2021-11-04 at 16:02 +0200, amirmizi6@gmail.com wrote:
From: Amir Mizinski <redacted>

An invalid TPM_STS value could be used when the following two events occur:
TPM does not update TPM_STS register after a locality request (TPM_STS
Initial value = 0xFF), and a TPM_STS register read occurs in the
tpm_tis_status(chip) function call.

In probe_itpm(), a call to tpm_tis_send_data() function is made after a
request_locality() call, and the condition
("if ((status & TPM_STS_COMMAND_READY) == 0)") is checked. At this moment
if the status value is 0xFF, then it is considered, wrongly, in “ready”
state (by checking only one bit). However, at this moment the TPM is, in
fact, in "Idle" state and remains in "Idle" state because
"tpm_tis_ready(chip);" was not executed.
Waiting for the condition TPM_STS.tpmGo == 0, will ensure that the TPM
status register has the correct value.
You should use imperative form in commit message, e.g. "Wait for TPM_STS.tpmGo
to reset to zero, ...".
quoted hunk ↗ jump to hunk
Suggested-by: Benoit Houyere <redacted>
Signed-off-by: Amir Mizinski <redacted>
---
 drivers/char/tpm/tpm_tis_core.c | 6 +++++-
 1 file changed, 5 insertions(+), 1 deletion(-)
diff --git a/drivers/char/tpm/tpm_tis_core.c b/drivers/char/tpm/tpm_tis_core.c
index 6ff8b44..770685a 100644
--- a/drivers/char/tpm/tpm_tis_core.c
+++ b/drivers/char/tpm/tpm_tis_core.c
@@ -177,8 +177,12 @@ static int request_locality(struct tpm_chip *chip, int l)
        } else {
                /* wait for burstcount */
                do {
-                       if (check_locality(chip, l))
+                       if (check_locality(chip, l)) {
+                               if (tpm_tis_wait_for_stat(chip, TPM_STS_GO, 0, chip->timeout_c,
+                                                         &priv->int_queue, false) < 0)
You would need to explain this with an inline comment.
+                                       return -ETIME;
                                return l;
+                       }
                        tpm_msleep(TPM_TIMEOUT);
                } while (time_before(jiffies, stop));
        }

/Jarkko
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help