linux-integrity.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH v2 0/2] Fix TPM 1.2 resume
@ 2023-05-02  1:15 Jarkko Sakkinen
  2023-05-02  1:15 ` [PATCH v2 1/2] tpm_tis: Use tpm_chip_{start,stop} decoration inside tpm_tis_resume Jarkko Sakkinen
                   ` (2 more replies)
  0 siblings, 3 replies; 5+ messages in thread
From: Jarkko Sakkinen @ 2023-05-02  1:15 UTC (permalink / raw)
  To: linux-integrity, linux-kernel
  Cc: Jarkko Sakkinen, Vlastimil Babka, Jason A . Donenfeld,
	Jason Gunthorpe, Jerry Snitselaar

During TPM 1.2 resume, the first PCR read operation used inside
tpm1_do_selftest() fails. Fix the bugs preventing resume from working.

v2:
* Added Jerry's reviewed-by's.
* Rebased to 865fdb08197e ("Merge tag 'input-for-v6.4-rc0' of git://git.kernel.org/pub/scm/linux/kernel/git/dtor/input").
* Mirrored patches to linux-next.

Cc: Vlastimil Babka <vbabka@suse.cz>
Cc: Jason A. Donenfeld <Jason@zx2c4.com>
Cc: Jason Gunthorpe <jgg@ziepe.ca>
Cc: Jerry Snitselaar <jsnitsel@redhat.com>

Link: https://lore.kernel.org/linux-integrity/CS6UJMSTVA4L.FRQ5VL1I1EF4@suppilovahvero/T/#m236d62184229cc035605143fde10933bcde60065
Jarkko Sakkinen (2):
  tpm_tis: Use tpm_chip_{start,stop} decoration inside tpm_tis_resume
  tpm: Prevent hwrng from activating during resume

 drivers/char/tpm/tpm-chip.c      |  4 +++
 drivers/char/tpm/tpm-interface.c | 10 ++++++++
 drivers/char/tpm/tpm_tis_core.c  | 43 ++++++++++++++------------------
 include/linux/tpm.h              |  1 +
 4 files changed, 34 insertions(+), 24 deletions(-)

-- 
2.39.2


^ permalink raw reply	[flat|nested] 5+ messages in thread

* [PATCH v2 1/2] tpm_tis: Use tpm_chip_{start,stop} decoration inside tpm_tis_resume
  2023-05-02  1:15 [PATCH v2 0/2] Fix TPM 1.2 resume Jarkko Sakkinen
@ 2023-05-02  1:15 ` Jarkko Sakkinen
  2023-05-02  1:15 ` [PATCH v2 2/2] tpm: Prevent hwrng from activating during resume Jarkko Sakkinen
  2023-05-02  7:37 ` [PATCH v2 0/2] Fix TPM 1.2 resume Vlastimil Babka
  2 siblings, 0 replies; 5+ messages in thread
From: Jarkko Sakkinen @ 2023-05-02  1:15 UTC (permalink / raw)
  To: linux-integrity, linux-kernel
  Cc: Jarkko Sakkinen, Vlastimil Babka, Jason A . Donenfeld,
	Jason Gunthorpe, Jerry Snitselaar, stable

Before sending a TPM command, CLKRUN protocol must be disabled. This is not
done in the case of tpm1_do_selftest() call site inside tpm_tis_resume().

Address this by decorating the calls with tpm_chip_{start,stop}, which
should be always used to arm and disarm the TPM chip for transmission.

Finally, move the call to the main TPM driver callback as the last step
because it should arm the chip by itself, if it needs that type of
functionality.

Cc: stable@vger.kernel.org
Reported-by: Jason A. Donenfeld <Jason@zx2c4.com>
Closes: https://lore.kernel.org/linux-integrity/CS68AWILHXS4.3M36M1EKZLUMS@suppilovahvero/
Fixes: a3fbfae82b4c ("tpm: take TPM chip power gating out of tpm_transmit()")
Reviewed-by: Jerry Snitselaar <jsnitsel@redhat.com>
Signed-off-by: Jarkko Sakkinen <jarkko@kernel.org>
---
 drivers/char/tpm/tpm_tis_core.c | 43 +++++++++++++++------------------
 1 file changed, 19 insertions(+), 24 deletions(-)

diff --git a/drivers/char/tpm/tpm_tis_core.c b/drivers/char/tpm/tpm_tis_core.c
index 02945d53fcef..558144fa707a 100644
--- a/drivers/char/tpm/tpm_tis_core.c
+++ b/drivers/char/tpm/tpm_tis_core.c
@@ -1209,25 +1209,20 @@ static void tpm_tis_reenable_interrupts(struct tpm_chip *chip)
 	u32 intmask;
 	int rc;
 
-	if (chip->ops->clk_enable != NULL)
-		chip->ops->clk_enable(chip, true);
-
-	/* reenable interrupts that device may have lost or
-	 * BIOS/firmware may have disabled
+	/*
+	 * Re-enable interrupts that device may have lost or BIOS/firmware may
+	 * have disabled.
 	 */
 	rc = tpm_tis_write8(priv, TPM_INT_VECTOR(priv->locality), priv->irq);
-	if (rc < 0)
-		goto out;
+	if (rc < 0) {
+		dev_err(&chip->dev, "Setting IRQ failed.\n");
+		return;
+	}
 
 	intmask = priv->int_mask | TPM_GLOBAL_INT_ENABLE;
-
-	tpm_tis_write32(priv, TPM_INT_ENABLE(priv->locality), intmask);
-
-out:
-	if (chip->ops->clk_enable != NULL)
-		chip->ops->clk_enable(chip, false);
-
-	return;
+	rc = tpm_tis_write32(priv, TPM_INT_ENABLE(priv->locality), intmask);
+	if (rc < 0)
+		dev_err(&chip->dev, "Enabling interrupts failed.\n");
 }
 
 int tpm_tis_resume(struct device *dev)
@@ -1235,27 +1230,27 @@ int tpm_tis_resume(struct device *dev)
 	struct tpm_chip *chip = dev_get_drvdata(dev);
 	int ret;
 
-	ret = tpm_tis_request_locality(chip, 0);
-	if (ret < 0)
+	ret = tpm_chip_start(chip);
+	if (ret)
 		return ret;
 
 	if (chip->flags & TPM_CHIP_FLAG_IRQ)
 		tpm_tis_reenable_interrupts(chip);
 
-	ret = tpm_pm_resume(dev);
-	if (ret)
-		goto out;
-
 	/*
 	 * TPM 1.2 requires self-test on resume. This function actually returns
 	 * an error code but for unknown reason it isn't handled.
 	 */
 	if (!(chip->flags & TPM_CHIP_FLAG_TPM2))
 		tpm1_do_selftest(chip);
-out:
-	tpm_tis_relinquish_locality(chip, 0);
 
-	return ret;
+	tpm_chip_stop(chip);
+
+	ret = tpm_pm_resume(dev);
+	if (ret)
+		return ret;
+
+	return 0;
 }
 EXPORT_SYMBOL_GPL(tpm_tis_resume);
 #endif
-- 
2.39.2


^ permalink raw reply related	[flat|nested] 5+ messages in thread

* [PATCH v2 2/2] tpm: Prevent hwrng from activating during resume
  2023-05-02  1:15 [PATCH v2 0/2] Fix TPM 1.2 resume Jarkko Sakkinen
  2023-05-02  1:15 ` [PATCH v2 1/2] tpm_tis: Use tpm_chip_{start,stop} decoration inside tpm_tis_resume Jarkko Sakkinen
@ 2023-05-02  1:15 ` Jarkko Sakkinen
  2023-05-02  7:37 ` [PATCH v2 0/2] Fix TPM 1.2 resume Vlastimil Babka
  2 siblings, 0 replies; 5+ messages in thread
From: Jarkko Sakkinen @ 2023-05-02  1:15 UTC (permalink / raw)
  To: linux-integrity, linux-kernel
  Cc: Jarkko Sakkinen, Vlastimil Babka, Jason A . Donenfeld,
	Jason Gunthorpe, Jerry Snitselaar, stable

Set TPM_CHIP_FLAG_SUSPENDED in tpm_pm_suspend() and reset in
tpm_pm_resume(). While the flag is set, tpm_hwrng() gives back zero
bytes. This prevents hwrng from racing during resume.

Cc: stable@vger.kernel.org
Fixes: 6e592a065d51 ("tpm: Move Linux RNG connection to hwrng")
Reviewed-by: Jerry Snitselaar <jsnitsel@redhat.com>
Signed-off-by: Jarkko Sakkinen <jarkko@kernel.org>
---
 drivers/char/tpm/tpm-chip.c      |  4 ++++
 drivers/char/tpm/tpm-interface.c | 10 ++++++++++
 include/linux/tpm.h              |  1 +
 3 files changed, 15 insertions(+)

diff --git a/drivers/char/tpm/tpm-chip.c b/drivers/char/tpm/tpm-chip.c
index c10a4aa97373..cd48033b804a 100644
--- a/drivers/char/tpm/tpm-chip.c
+++ b/drivers/char/tpm/tpm-chip.c
@@ -571,6 +571,10 @@ static int tpm_hwrng_read(struct hwrng *rng, void *data, size_t max, bool wait)
 {
 	struct tpm_chip *chip = container_of(rng, struct tpm_chip, hwrng);
 
+	/* Give back zero bytes, as TPM chip has not yet fully resumed: */
+	if (chip->flags & TPM_CHIP_FLAG_SUSPENDED)
+		return 0;
+
 	return tpm_get_random(chip, data, max);
 }
 
diff --git a/drivers/char/tpm/tpm-interface.c b/drivers/char/tpm/tpm-interface.c
index 4463d0018290..586ca10b0d72 100644
--- a/drivers/char/tpm/tpm-interface.c
+++ b/drivers/char/tpm/tpm-interface.c
@@ -412,6 +412,8 @@ int tpm_pm_suspend(struct device *dev)
 	}
 
 suspended:
+	chip->flags |= TPM_CHIP_FLAG_SUSPENDED;
+
 	if (rc)
 		dev_err(dev, "Ignoring error %d while suspending\n", rc);
 	return 0;
@@ -429,6 +431,14 @@ int tpm_pm_resume(struct device *dev)
 	if (chip == NULL)
 		return -ENODEV;
 
+	chip->flags &= ~TPM_CHIP_FLAG_SUSPENDED;
+
+	/*
+	 * Guarantee that SUSPENDED is written last, so that hwrng does not
+	 * activate before the chip has been fully resumed.
+	 */
+	wmb();
+
 	return 0;
 }
 EXPORT_SYMBOL_GPL(tpm_pm_resume);
diff --git a/include/linux/tpm.h b/include/linux/tpm.h
index 77693389c3f9..6a1e8f157255 100644
--- a/include/linux/tpm.h
+++ b/include/linux/tpm.h
@@ -282,6 +282,7 @@ enum tpm_chip_flags {
 	TPM_CHIP_FLAG_ALWAYS_POWERED		= BIT(5),
 	TPM_CHIP_FLAG_FIRMWARE_POWER_MANAGED	= BIT(6),
 	TPM_CHIP_FLAG_FIRMWARE_UPGRADE		= BIT(7),
+	TPM_CHIP_FLAG_SUSPENDED			= BIT(8),
 };
 
 #define to_tpm_chip(d) container_of(d, struct tpm_chip, dev)
-- 
2.39.2


^ permalink raw reply related	[flat|nested] 5+ messages in thread

* Re: [PATCH v2 0/2] Fix TPM 1.2 resume
  2023-05-02  1:15 [PATCH v2 0/2] Fix TPM 1.2 resume Jarkko Sakkinen
  2023-05-02  1:15 ` [PATCH v2 1/2] tpm_tis: Use tpm_chip_{start,stop} decoration inside tpm_tis_resume Jarkko Sakkinen
  2023-05-02  1:15 ` [PATCH v2 2/2] tpm: Prevent hwrng from activating during resume Jarkko Sakkinen
@ 2023-05-02  7:37 ` Vlastimil Babka
  2023-05-10 22:06   ` Jarkko Sakkinen
  2 siblings, 1 reply; 5+ messages in thread
From: Vlastimil Babka @ 2023-05-02  7:37 UTC (permalink / raw)
  To: Jarkko Sakkinen, linux-integrity, linux-kernel
  Cc: Jason A . Donenfeld, Jason Gunthorpe, Jerry Snitselaar

On 5/2/23 03:15, Jarkko Sakkinen wrote:
> During TPM 1.2 resume, the first PCR read operation used inside
> tpm1_do_selftest() fails. Fix the bugs preventing resume from working.

Thanks for fixing this, unfortunately I can no longer test the fix as I've
got a new laptop since when I was hitting the bug on the older one.

Vlastimil

> v2:
> * Added Jerry's reviewed-by's.
> * Rebased to 865fdb08197e ("Merge tag 'input-for-v6.4-rc0' of git://git.kernel.org/pub/scm/linux/kernel/git/dtor/input").
> * Mirrored patches to linux-next.
> 
> Cc: Vlastimil Babka <vbabka@suse.cz>
> Cc: Jason A. Donenfeld <Jason@zx2c4.com>
> Cc: Jason Gunthorpe <jgg@ziepe.ca>
> Cc: Jerry Snitselaar <jsnitsel@redhat.com>
> 
> Link: https://lore.kernel.org/linux-integrity/CS6UJMSTVA4L.FRQ5VL1I1EF4@suppilovahvero/T/#m236d62184229cc035605143fde10933bcde60065
> Jarkko Sakkinen (2):
>   tpm_tis: Use tpm_chip_{start,stop} decoration inside tpm_tis_resume
>   tpm: Prevent hwrng from activating during resume
> 
>  drivers/char/tpm/tpm-chip.c      |  4 +++
>  drivers/char/tpm/tpm-interface.c | 10 ++++++++
>  drivers/char/tpm/tpm_tis_core.c  | 43 ++++++++++++++------------------
>  include/linux/tpm.h              |  1 +
>  4 files changed, 34 insertions(+), 24 deletions(-)
> 


^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [PATCH v2 0/2] Fix TPM 1.2 resume
  2023-05-02  7:37 ` [PATCH v2 0/2] Fix TPM 1.2 resume Vlastimil Babka
@ 2023-05-10 22:06   ` Jarkko Sakkinen
  0 siblings, 0 replies; 5+ messages in thread
From: Jarkko Sakkinen @ 2023-05-10 22:06 UTC (permalink / raw)
  To: Vlastimil Babka, linux-integrity, linux-kernel
  Cc: Jason A . Donenfeld, Jason Gunthorpe, Jerry Snitselaar

On Tue May 2, 2023 at 10:37 AM EEST, Vlastimil Babka wrote:
> On 5/2/23 03:15, Jarkko Sakkinen wrote:
> > During TPM 1.2 resume, the first PCR read operation used inside
> > tpm1_do_selftest() fails. Fix the bugs preventing resume from working.
>
> Thanks for fixing this, unfortunately I can no longer test the fix as I've
> got a new laptop since when I was hitting the bug on the older one.

I don't think these fixed make things worse, and I could reproduce
the bug locally, so I'll put them to my PR :-)

BR, Jarkko

^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2023-05-10 22:06 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2023-05-02  1:15 [PATCH v2 0/2] Fix TPM 1.2 resume Jarkko Sakkinen
2023-05-02  1:15 ` [PATCH v2 1/2] tpm_tis: Use tpm_chip_{start,stop} decoration inside tpm_tis_resume Jarkko Sakkinen
2023-05-02  1:15 ` [PATCH v2 2/2] tpm: Prevent hwrng from activating during resume Jarkko Sakkinen
2023-05-02  7:37 ` [PATCH v2 0/2] Fix TPM 1.2 resume Vlastimil Babka
2023-05-10 22:06   ` Jarkko Sakkinen

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).