Commit 7dfe7ca9 authored by Hon Ching \(Vicky) Lo's avatar Hon Ching \(Vicky) Lo Committed by Greg Kroah-Hartman

vTPM: Fix missing NULL check

commit 31574d32 upstream.

The current code passes the address of tpm_chip as the argument to
dev_get_drvdata() without prior NULL check in
tpm_ibmvtpm_get_desired_dma.  This resulted an oops during kernel
boot when vTPM is enabled in Power partition configured in active
memory sharing mode.

The vio_driver's get_desired_dma() is called before the probe(), which
for vtpm is tpm_ibmvtpm_probe, and it's this latter function that
initializes the driver and set data.  Attempting to get data before
the probe() caused the problem.

This patch adds a NULL check to the tpm_ibmvtpm_get_desired_dma.

fixes: 9e0d39d8 ("tpm: Remove useless priv field in struct tpm_vendor_specific")
Signed-off-by: default avatarHon Ching(Vicky) Lo <honclo@linux.vnet.ibm.com>
Reviewed-by: default avatarJarkko Sakkine <jarkko.sakkinen@linux.intel.com>
Signed-off-by: default avatarJarkko Sakkinen <jarkko.sakkinen@linux.intel.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent ecae4733
...@@ -295,6 +295,8 @@ static int tpm_ibmvtpm_remove(struct vio_dev *vdev) ...@@ -295,6 +295,8 @@ static int tpm_ibmvtpm_remove(struct vio_dev *vdev)
} }
kfree(ibmvtpm); kfree(ibmvtpm);
/* For tpm_ibmvtpm_get_desired_dma */
dev_set_drvdata(&vdev->dev, NULL);
return 0; return 0;
} }
...@@ -309,13 +311,16 @@ static int tpm_ibmvtpm_remove(struct vio_dev *vdev) ...@@ -309,13 +311,16 @@ static int tpm_ibmvtpm_remove(struct vio_dev *vdev)
static unsigned long tpm_ibmvtpm_get_desired_dma(struct vio_dev *vdev) static unsigned long tpm_ibmvtpm_get_desired_dma(struct vio_dev *vdev)
{ {
struct tpm_chip *chip = dev_get_drvdata(&vdev->dev); struct tpm_chip *chip = dev_get_drvdata(&vdev->dev);
struct ibmvtpm_dev *ibmvtpm = dev_get_drvdata(&chip->dev); struct ibmvtpm_dev *ibmvtpm;
/* ibmvtpm initializes at probe time, so the data we are /*
* asking for may not be set yet. Estimate that 4K required * ibmvtpm initializes at probe time, so the data we are
* for TCE-mapped buffer in addition to CRQ. * asking for may not be set yet. Estimate that 4K required
*/ * for TCE-mapped buffer in addition to CRQ.
if (!ibmvtpm) */
if (chip)
ibmvtpm = dev_get_drvdata(&chip->dev);
else
return CRQ_RES_BUF_SIZE + PAGE_SIZE; return CRQ_RES_BUF_SIZE + PAGE_SIZE;
return CRQ_RES_BUF_SIZE + ibmvtpm->rtce_size; return CRQ_RES_BUF_SIZE + ibmvtpm->rtce_size;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment