lkml.org 
[lkml]   [2018]   [Nov]   [5]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v3 10/16] tpm: move TPM space code out of tpm_transmit()
    Date
    Prepare and commit TPM space before and after calling tpm_transmit()
    instead of doing that inside tpm_transmit(). After this change we can
    remove TPM_TRANSMIT_NESTED flag from tpm2_prepare_space() and
    tpm2_commit_space() and replace it with TPM_TRANSMIT_UNLOCKED.

    Signed-off-by: Jarkko Sakkinen <jarkko.sakkinen@linux.intel.com>
    ---
    drivers/char/tpm/tpm-dev-common.c | 30 ++++++++++++++++++++++++++----
    drivers/char/tpm/tpm-interface.c | 29 +++--------------------------
    drivers/char/tpm/tpm2-space.c | 12 ++++++------
    3 files changed, 35 insertions(+), 36 deletions(-)

    diff --git a/drivers/char/tpm/tpm-dev-common.c b/drivers/char/tpm/tpm-dev-common.c
    index cbb0ee30b511..87b0d0b37bc0 100644
    --- a/drivers/char/tpm/tpm-dev-common.c
    +++ b/drivers/char/tpm/tpm-dev-common.c
    @@ -30,13 +30,35 @@ static DEFINE_MUTEX(tpm_dev_wq_lock);
    static ssize_t tpm_dev_transmit(struct tpm_chip *chip, struct tpm_space *space,
    u8 *buf, size_t bufsiz)
    {
    - ssize_t ret;
    + struct tpm_output_header *header = (void *)buf;
    + ssize_t ret, len;

    mutex_lock(&chip->tpm_mutex);
    - ret = tpm_transmit(chip, space, buf, bufsiz, TPM_TRANSMIT_UNLOCKED);
    - mutex_unlock(&chip->tpm_mutex);
    + ret = tpm2_prepare_space(chip, space, buf, bufsiz);
    + /* If the command is not implemented by the TPM, synthesize a
    + * response with a TPM2_RC_COMMAND_CODE return for user-space.
    + */
    + if (ret == -EOPNOTSUPP) {
    + header->length = cpu_to_be32(sizeof(*header));
    + header->tag = cpu_to_be16(TPM2_ST_NO_SESSIONS);
    + header->return_code = cpu_to_be32(TPM2_RC_COMMAND_CODE |
    + TSS2_RESMGR_TPM_RC_LAYER);
    + ret = sizeof(*header);
    + }
    + if (ret)
    + goto out_lock;

    - return ret;
    + len = tpm_transmit(chip, space, buf, bufsiz, TPM_TRANSMIT_UNLOCKED);
    + if (len < 0)
    + ret = len;
    +
    + if (ret)
    + tpm2_flush_space(chip);
    + else
    + ret = tpm2_commit_space(chip, space, buf, &len);
    +out_lock:
    + mutex_unlock(&chip->tpm_mutex);
    + return ret ? ret : len;
    }

    static void tpm_dev_async_work(struct work_struct *work)
    diff --git a/drivers/char/tpm/tpm-interface.c b/drivers/char/tpm/tpm-interface.c
    index 3bf0c51b7b4f..50cc46c6bfff 100644
    --- a/drivers/char/tpm/tpm-interface.c
    +++ b/drivers/char/tpm/tpm-interface.c
    @@ -147,27 +147,12 @@ static ssize_t tpm_try_transmit(struct tpm_chip *chip,
    return -E2BIG;
    }

    - rc = tpm2_prepare_space(chip, space, buf, bufsiz);
    - /*
    - * If the command is not implemented by the TPM, synthesize a
    - * response with a TPM2_RC_COMMAND_CODE return for user-space.
    - */
    - if (rc == -EOPNOTSUPP) {
    - header->length = cpu_to_be32(sizeof(*header));
    - header->tag = cpu_to_be16(TPM2_ST_NO_SESSIONS);
    - header->return_code = cpu_to_be32(TPM2_RC_COMMAND_CODE |
    - TSS2_RESMGR_TPM_RC_LAYER);
    - return sizeof(*header);
    - }
    - if (rc)
    - return rc;
    -
    rc = chip->ops->send(chip, buf, count);
    if (rc < 0) {
    if (rc != -EPIPE)
    dev_err(&chip->dev,
    "%s: tpm_send: error %d\n", __func__, rc);
    - goto out_space;
    + return rc;
    }

    if (chip->flags & TPM_CHIP_FLAG_IRQ)
    @@ -182,8 +167,7 @@ static ssize_t tpm_try_transmit(struct tpm_chip *chip,

    if (chip->ops->req_canceled(chip, status)) {
    dev_err(&chip->dev, "Operation Canceled\n");
    - rc = -ECANCELED;
    - goto out_space;
    + return -ECANCELED;
    }

    tpm_msleep(TPM_TIMEOUT_POLL);
    @@ -192,8 +176,7 @@ static ssize_t tpm_try_transmit(struct tpm_chip *chip,

    chip->ops->cancel(chip);
    dev_err(&chip->dev, "Operation Timed out\n");
    - rc = -ETIME;
    - goto out_space;
    + return -ETIME;

    out_recv:
    len = chip->ops->recv(chip, buf, bufsiz);
    @@ -205,12 +188,6 @@ static ssize_t tpm_try_transmit(struct tpm_chip *chip,
    } else if (len < TPM_HEADER_SIZE || len != be32_to_cpu(header->length))
    rc = -EFAULT;

    -out_space:
    - if (rc)
    - tpm2_flush_space(chip);
    - else
    - rc = tpm2_commit_space(chip, space, buf, &len);
    -
    return rc ? rc : len;
    }

    diff --git a/drivers/char/tpm/tpm2-space.c b/drivers/char/tpm/tpm2-space.c
    index 20c295fadd50..942f307eedd6 100644
    --- a/drivers/char/tpm/tpm2-space.c
    +++ b/drivers/char/tpm/tpm2-space.c
    @@ -39,7 +39,7 @@ static void tpm2_flush_sessions(struct tpm_chip *chip, struct tpm_space *space)
    for (i = 0; i < ARRAY_SIZE(space->session_tbl); i++) {
    if (space->session_tbl[i])
    tpm2_flush_context_cmd(chip, space->session_tbl[i],
    - TPM_TRANSMIT_NESTED);
    + TPM_TRANSMIT_UNLOCKED);
    }
    }

    @@ -84,7 +84,7 @@ static int tpm2_load_context(struct tpm_chip *chip, u8 *buf,
    tpm_buf_append(&tbuf, &buf[*offset], body_size);

    rc = tpm_transmit_cmd(chip, NULL, &tbuf, 4,
    - TPM_TRANSMIT_NESTED, NULL);
    + TPM_TRANSMIT_UNLOCKED, NULL);
    if (rc < 0) {
    dev_warn(&chip->dev, "%s: failed with a system error %d\n",
    __func__, rc);
    @@ -133,7 +133,7 @@ static int tpm2_save_context(struct tpm_chip *chip, u32 handle, u8 *buf,
    tpm_buf_append_u32(&tbuf, handle);

    rc = tpm_transmit_cmd(chip, NULL, &tbuf, 0,
    - TPM_TRANSMIT_NESTED, NULL);
    + TPM_TRANSMIT_UNLOCKED, NULL);
    if (rc < 0) {
    dev_warn(&chip->dev, "%s: failed with a system error %d\n",
    __func__, rc);
    @@ -170,7 +170,7 @@ void tpm2_flush_space(struct tpm_chip *chip)
    for (i = 0; i < ARRAY_SIZE(space->context_tbl); i++)
    if (space->context_tbl[i] && ~space->context_tbl[i])
    tpm2_flush_context_cmd(chip, space->context_tbl[i],
    - TPM_TRANSMIT_NESTED);
    + TPM_TRANSMIT_UNLOCKED);

    tpm2_flush_sessions(chip, space);
    }
    @@ -419,7 +419,7 @@ static int tpm2_map_response_header(struct tpm_chip *chip, u32 cc, u8 *rsp,

    return 0;
    out_no_slots:
    - tpm2_flush_context_cmd(chip, phandle, TPM_TRANSMIT_NESTED);
    + tpm2_flush_context_cmd(chip, phandle, TPM_TRANSMIT_UNLOCKED);
    dev_warn(&chip->dev, "%s: out of slots for 0x%08X\n", __func__,
    phandle);
    return -ENOMEM;
    @@ -507,7 +507,7 @@ static int tpm2_save_space(struct tpm_chip *chip)
    return rc;

    tpm2_flush_context_cmd(chip, space->context_tbl[i],
    - TPM_TRANSMIT_NESTED);
    + TPM_TRANSMIT_UNLOCKED);
    space->context_tbl[i] = ~0;
    }

    --
    2.19.1
    \
     
     \ /
      Last update: 2018-11-05 02:48    [W:3.261 / U:1.120 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site