Commit 6da2517d authored by jmlatten@linux.vnet.ibm.com's avatar jmlatten@linux.vnet.ibm.com Committed by Peter Huewe

tpm/ibmvtpm: Additional LE support for tpm_ibmvtpm_send

Problem: When IMA and VTPM are both enabled in kernel config,
kernel hangs during bootup on LE OS.

Why?: IMA calls tpm_pcr_read() which results in tpm_ibmvtpm_send
and tpm_ibmtpm_recv getting called. A trace showed that
tpm_ibmtpm_recv was hanging.

Resolution: tpm_ibmtpm_recv was hanging because tpm_ibmvtpm_send
was sending CRQ message that probably did not make much sense
to phype because of Endianness. The fix below sends correctly
converted CRQ for LE. This was not caught before because it
seems IMA is not enabled by default in kernel config and
IMA exercises this particular code path in vtpm.

Tested with IMA and VTPM enabled in kernel config and VTPM
enabled on both a BE OS and a LE OS ppc64 lpar. This exercised
CRQ and TPM command code paths in vtpm.
Patch is against Peter's tpmdd tree on github which included
Vicky's previous vtpm le patches.
Signed-off-by: default avatarJoy Latten <jmlatten@linux.vnet.ibm.com>
Cc: <stable@vger.kernel.org> # eb71f8a5: "Added Little Endian support to vtpm module"
Cc: <stable@vger.kernel.org>
Reviewed-by: default avatarAshley Lai <ashley@ahsleylai.com>
Signed-off-by: default avatarPeter Huewe <peterhuewe@gmx.de>
parent 74f0414b
...@@ -124,7 +124,7 @@ static int tpm_ibmvtpm_send(struct tpm_chip *chip, u8 *buf, size_t count) ...@@ -124,7 +124,7 @@ static int tpm_ibmvtpm_send(struct tpm_chip *chip, u8 *buf, size_t count)
{ {
struct ibmvtpm_dev *ibmvtpm; struct ibmvtpm_dev *ibmvtpm;
struct ibmvtpm_crq crq; struct ibmvtpm_crq crq;
u64 *word = (u64 *) &crq; __be64 *word = (__be64 *)&crq;
int rc; int rc;
ibmvtpm = (struct ibmvtpm_dev *)TPM_VPRIV(chip); ibmvtpm = (struct ibmvtpm_dev *)TPM_VPRIV(chip);
...@@ -145,11 +145,11 @@ static int tpm_ibmvtpm_send(struct tpm_chip *chip, u8 *buf, size_t count) ...@@ -145,11 +145,11 @@ static int tpm_ibmvtpm_send(struct tpm_chip *chip, u8 *buf, size_t count)
memcpy((void *)ibmvtpm->rtce_buf, (void *)buf, count); memcpy((void *)ibmvtpm->rtce_buf, (void *)buf, count);
crq.valid = (u8)IBMVTPM_VALID_CMD; crq.valid = (u8)IBMVTPM_VALID_CMD;
crq.msg = (u8)VTPM_TPM_COMMAND; crq.msg = (u8)VTPM_TPM_COMMAND;
crq.len = (u16)count; crq.len = cpu_to_be16(count);
crq.data = ibmvtpm->rtce_dma_handle; crq.data = cpu_to_be32(ibmvtpm->rtce_dma_handle);
rc = ibmvtpm_send_crq(ibmvtpm->vdev, cpu_to_be64(word[0]), rc = ibmvtpm_send_crq(ibmvtpm->vdev, be64_to_cpu(word[0]),
cpu_to_be64(word[1])); be64_to_cpu(word[1]));
if (rc != H_SUCCESS) { if (rc != H_SUCCESS) {
dev_err(ibmvtpm->dev, "tpm_ibmvtpm_send failed rc=%d\n", rc); dev_err(ibmvtpm->dev, "tpm_ibmvtpm_send failed rc=%d\n", rc);
rc = 0; rc = 0;
......
...@@ -22,9 +22,9 @@ ...@@ -22,9 +22,9 @@
struct ibmvtpm_crq { struct ibmvtpm_crq {
u8 valid; u8 valid;
u8 msg; u8 msg;
u16 len; __be16 len;
u32 data; __be32 data;
u64 reserved; __be64 reserved;
} __attribute__((packed, aligned(8))); } __attribute__((packed, aligned(8)));
struct ibmvtpm_crq_queue { struct ibmvtpm_crq_queue {
......
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