lkml.org 
[lkml]   [2015]   [Apr]   [7]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 3.13.y-ckt 069/156] tpm/ibmvtpm: Additional LE support for tpm_ibmvtpm_send
    Date
    3.13.11-ckt19 -stable review patch.  If anyone has any objections, please let me know.

    ------------------

    From: "jmlatten@linux.vnet.ibm.com" <jmlatten@linux.vnet.ibm.com>

    commit 62dfd912ab3b5405b6fe72d0135c37e9648071f1 upstream.

    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: Joy Latten <jmlatten@linux.vnet.ibm.com>
    Reviewed-by: Ashley Lai <ashley@ahsleylai.com>
    Signed-off-by: Peter Huewe <peterhuewe@gmx.de>
    Signed-off-by: Kamal Mostafa <kamal@canonical.com>
    ---
    drivers/char/tpm/tpm_ibmvtpm.c | 10 +++++-----
    drivers/char/tpm/tpm_ibmvtpm.h | 6 +++---
    2 files changed, 8 insertions(+), 8 deletions(-)

    diff --git a/drivers/char/tpm/tpm_ibmvtpm.c b/drivers/char/tpm/tpm_ibmvtpm.c
    index da6727b..7116dcb3 100644
    --- a/drivers/char/tpm/tpm_ibmvtpm.c
    +++ b/drivers/char/tpm/tpm_ibmvtpm.c
    @@ -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;
    diff --git a/drivers/char/tpm/tpm_ibmvtpm.h b/drivers/char/tpm/tpm_ibmvtpm.h
    index bd82a79..b2c231b 100644
    --- a/drivers/char/tpm/tpm_ibmvtpm.h
    +++ b/drivers/char/tpm/tpm_ibmvtpm.h
    @@ -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 {
    --
    1.9.1


    \
     
     \ /
      Last update: 2015-04-08 02:01    [W:4.563 / U:0.320 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site