diff mbox series

[v18,4/6] tpm: tpm_tis: Verify TPM_STS register is valid after locality request

Message ID 20211102152056.241769-5-amirmizi6@gmail.com (mailing list archive)
State New, archived
Headers show
Series Add tpm i2c ptp driver | expand

Commit Message

Amir Mizinski Nov. 2, 2021, 3:20 p.m. UTC
From: Amir Mizinski <amirmizi6@gmail.com>

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.

Suggested-by: Benoit Houyere <benoit.houyere@st.com>
Signed-off-by: Amir Mizinski <amirmizi6@gmail.com>
---
 drivers/char/tpm/tpm_tis_core.c | 8 +++++++-
 1 file changed, 7 insertions(+), 1 deletion(-)

Comments

Jarkko Sakkinen Nov. 2, 2021, 8:35 p.m. UTC | #1
On Tue, 2021-11-02 at 17:20 +0200, amirmizi6@gmail.com wrote:
> From: Amir Mizinski <amirmizi6@gmail.com>
> 
> 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.
> 
> Suggested-by: Benoit Houyere <benoit.houyere@st.com>
> Signed-off-by: Amir Mizinski <amirmizi6@gmail.com>
> ---
>  drivers/char/tpm/tpm_tis_core.c | 8 +++++++-
>  1 file changed, 7 insertions(+), 1 deletion(-)
> 
> diff --git a/drivers/char/tpm/tpm_tis_core.c b/drivers/char/tpm/tpm_tis_core.c
> index 90d92a1..f06c6c6 100644
> --- a/drivers/char/tpm/tpm_tis_core.c
> +++ b/drivers/char/tpm/tpm_tis_core.c
> @@ -177,8 +177,14 @@ 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 (wait_for_tpm_stat(chip, TPM_STS_GO, 0,
> +                                                         chip->timeout_c,
> +                                                         &priv->int_queue,
> +                                                         false) < 0)

Does this compile with the change in 1/6?

/Jarkko
diff mbox series

Patch

diff --git a/drivers/char/tpm/tpm_tis_core.c b/drivers/char/tpm/tpm_tis_core.c
index 90d92a1..f06c6c6 100644
--- a/drivers/char/tpm/tpm_tis_core.c
+++ b/drivers/char/tpm/tpm_tis_core.c
@@ -177,8 +177,14 @@  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 (wait_for_tpm_stat(chip, TPM_STS_GO, 0,
+							  chip->timeout_c,
+							  &priv->int_queue,
+							  false) < 0)
+					return -ETIME;
 				return l;
+			}
 			tpm_msleep(TPM_TIMEOUT);
 		} while (time_before(jiffies, stop));
 	}