FAILED: patch "[PATCH] tpm/ibmvtpm: Additional LE support for tpm_ibmvtpm_send" failed to apply to 4.0-stable tree
Subsystems (3)
[email protected]
maintainerThe patch below does not apply to the 4.0-stable tree.
If someone wants it applied there, or to any other stable or longterm tree, then please email the backport, including the original git commit id to <[email protected]>.
thanks,
greg k-h
------------------ original commit in Linus's tree ------------------
Quoted 1 line
From
6da2517ddb03cb12c6e8bbe449b5ed1b51878642Mon Sep 17 00:00:00 2001
From: "[email protected]" <[email protected]>
Date: Fri, 20 Feb 2015 18:11:24 -0600
Subject: [PATCH] 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.
drivers/char/tpm/tpm_ibmvtpm.c +5 -5
@@ -124,7 +124,7 @@ static int tpm_ibmvtpm_send(struct tpm_chip *chip, u8 *buf, size_t count) {struct ibmvtpm_dev *ibmvtpm;struct ibmvtpm_crq crq; -u64 *word = (u64 *) &crq; +__be64 *word = (__be64 *)&crq;int rc; 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)memcpy ((void *)ibmvtpm->rtce_buf, (void *)buf, count); crq.valid = (u8 )IBMVTPM_VALID_CMD ; crq.msg = (u8 )VTPM_TPM_COMMAND ; - crq.len = (u16 )count; - crq.data = ibmvtpm->rtce_dma_handle; + crq.len =cpu_to_be16 (count); + crq.data =cpu_to_be32 (ibmvtpm->rtce_dma_handle); - rc =ibmvtpm_send_crq (ibmvtpm->vdev,cpu_to_be64 (word[0 ]), -cpu_to_be64 (word[1 ])); + rc =ibmvtpm_send_crq (ibmvtpm->vdev,be64_to_cpu (word[0 ]), +be64_to_cpu (word[1 ]));if (rc !=H_SUCCESS ) {dev_err (ibmvtpm->dev,"tpm_ibmvtpm_send failed rc=%d\n" , rc); rc =0 ;
drivers/char/tpm/tpm_ibmvtpm.h +3 -3
@@ -22,9 +22,9 @@struct ibmvtpm_crq {u8 valid;u8 msg; -u16 len; -u32 data; -u64 reserved; +__be16 len; +__be32 data; +__be64 reserved; } __attribute__((packed,aligned (8 )));struct ibmvtpm_crq_queue {