All of lore.kernel.org
 help / color / mirror / Atom feed
From: Stefan Berger <stefanb@linux.vnet.ibm.com>
To: "Marc-André Lureau" <marcandre.lureau@redhat.com>
Cc: qemu-devel@nongnu.org, amarnath valluri <amarnath.valluri@intel.com>
Subject: Re: [Qemu-devel] [PATCH 14/42] tpm: add TPMBackendCmd to hold the request state
Date: Tue, 10 Oct 2017 21:27:04 -0400	[thread overview]
Message-ID: <8c88f6a8-959b-b99c-8e5a-013bb8ae54eb@linux.vnet.ibm.com> (raw)
In-Reply-To: <1503690906.28245457.1507652169247.JavaMail.zimbra@redhat.com>

On 10/10/2017 12:16 PM, Marc-André Lureau wrote:
> Hi
>
> ----- Original Message -----
>> On 10/09/2017 06:55 PM, Marc-André Lureau wrote:
>>> This simplifies a bit locality handling, and argument passing, and
>>> could pave the way to queuing requests (if that makes sense).
>> We won't queue requests. The TPM interfaces all send one request and
>> expect the driver to wait until the response comes back.
> Even on different localities? (I am not familiar enough with that part)

Yes, I believe so.

>
>>> Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
>> Reviewed-by: Stefan Berger <stefanb@linux.vnet.ibm.com>
>>
>>> ---
>>>    hw/tpm/tpm_int.h             |  1 +
>>>    include/sysemu/tpm_backend.h | 16 +++++++++++++---
>>>    backends/tpm.c               |  6 +++---
>>>    hw/tpm/tpm_emulator.c        | 29 +++++++++++++++--------------
>>>    hw/tpm/tpm_passthrough.c     | 24 +++++-------------------
>>>    hw/tpm/tpm_tis.c             | 18 +++++++++++++-----
>>>    6 files changed, 50 insertions(+), 44 deletions(-)
>>>
>>> diff --git a/hw/tpm/tpm_int.h b/hw/tpm/tpm_int.h
>>> index f2f285b3cc..6d7b3dc850 100644
>>> --- a/hw/tpm/tpm_int.h
>>> +++ b/hw/tpm/tpm_int.h
>>> @@ -26,6 +26,7 @@ struct TPMState {
>>>    
>>>        uint8_t     locty_number;
>>>        TPMLocality *locty_data;
>>> +    TPMBackendCmd cmd;
>>>    
>>>        char *backend;
>>>        TPMBackend *be_driver;
>>> diff --git a/include/sysemu/tpm_backend.h b/include/sysemu/tpm_backend.h
>>> index 9c83a512e1..3bb90be3de 100644
>>> --- a/include/sysemu/tpm_backend.h
>>> +++ b/include/sysemu/tpm_backend.h
>>> @@ -30,7 +30,16 @@
>>>    typedef struct TPMBackendClass TPMBackendClass;
>>>    typedef struct TPMBackend TPMBackend;
>>>    
>>> -typedef void (TPMRecvDataCB)(TPMState *, bool selftest_done);
>>> +typedef void (TPMRecvDataCB)(TPMState *);
>>> +
>>> +typedef struct TPMBackendCmd {
>>> +    uint8_t locty;
>>> +    const uint8_t *in;
>>> +    uint32_t in_len;
>>> +    uint8_t *out;
>>> +    uint32_t out_len;
>>> +    bool selftest_done;
>>> +} TPMBackendCmd;
>>>    
>>>    struct TPMBackend {
>>>        Object parent;
>>> @@ -76,7 +85,7 @@ struct TPMBackendClass {
>>>    
>>>        void (*opened)(TPMBackend *s, Error **errp);
>>>    
>>> -    void (*handle_request)(TPMBackend *s);
>>> +    void (*handle_request)(TPMBackend *s, TPMBackendCmd *cmd);
>>>    };
>>>    
>>>    /**
>>> @@ -121,11 +130,12 @@ bool tpm_backend_had_startup_error(TPMBackend *s);
>>>    /**
>>>     * tpm_backend_deliver_request:
>>>     * @s: the backend to send the request to
>>> + * @cmd: the command to deliver
>>>     *
>>>     * Send a request to the backend. The backend will then send the request
>>>     * to the TPM implementation.
>>>     */
>>> -void tpm_backend_deliver_request(TPMBackend *s);
>>> +void tpm_backend_deliver_request(TPMBackend *s, TPMBackendCmd *cmd);
>>>    
>>>    /**
>>>     * tpm_backend_reset:
>>> diff --git a/backends/tpm.c b/backends/tpm.c
>>> index 34e82085ec..dc7c831ff8 100644
>>> --- a/backends/tpm.c
>>> +++ b/backends/tpm.c
>>> @@ -25,7 +25,7 @@ static void tpm_backend_worker_thread(gpointer data,
>>> gpointer user_data)
>>>        TPMBackendClass *k  = TPM_BACKEND_GET_CLASS(s);
>>>    
>>>        assert(k->handle_request != NULL);
>>> -    k->handle_request(s);
>>> +    k->handle_request(s, (TPMBackendCmd *)data);
>>>    }
>>>    
>>>    static void tpm_backend_thread_end(TPMBackend *s)
>>> @@ -76,9 +76,9 @@ bool tpm_backend_had_startup_error(TPMBackend *s)
>>>        return s->had_startup_error;
>>>    }
>>>    
>>> -void tpm_backend_deliver_request(TPMBackend *s)
>>> +void tpm_backend_deliver_request(TPMBackend *s, TPMBackendCmd *cmd)
>>>    {
>>> -    g_thread_pool_push(s->thread_pool, NULL, NULL);
>>> +    g_thread_pool_push(s->thread_pool, cmd, NULL);
>>>    }
>>>    
>>>    void tpm_backend_reset(TPMBackend *s)
>>> diff --git a/hw/tpm/tpm_emulator.c b/hw/tpm/tpm_emulator.c
>>> index 4fe405353a..788ab9876d 100644
>>> --- a/hw/tpm/tpm_emulator.c
>>> +++ b/hw/tpm/tpm_emulator.c
>>> @@ -172,28 +172,29 @@ static int tpm_emulator_set_locality(TPMEmulator
>>> *tpm_emu, uint8_t locty_number)
>>>        return 0;
>>>    }
>>>    
>>> -static void tpm_emulator_handle_request(TPMBackend *tb)
>>> +static void tpm_emulator_handle_request(TPMBackend *tb, TPMBackendCmd
>>> *cmd)
>>>    {
>>>        TPMEmulator *tpm_emu = TPM_EMULATOR(tb);
>>> -    TPMLocality *locty = NULL;
>>> -    bool selftest_done = false;
>>>        Error *err = NULL;
>>>    
>>>        DPRINTF("processing TPM command");
>>>    
>>> -    locty = tb->tpm_state->locty_data;
>>> -    if (tpm_emulator_set_locality(tpm_emu,
>>> -                                  tb->tpm_state->locty_number) < 0 ||
>>> -        tpm_emulator_unix_tx_bufs(tpm_emu, locty->w_buffer.buffer,
>>> -                                  locty->w_offset, locty->r_buffer.buffer,
>>> -                                  locty->r_buffer.size, &selftest_done,
>>> -                                  &err) < 0) {
>>> -        tpm_util_write_fatal_error_response(locty->r_buffer.buffer,
>>> -                                            locty->r_buffer.size);
>>> -        error_report_err(err);
>>> +    if (tpm_emulator_set_locality(tpm_emu, tb->tpm_state->locty_number) <
>>> 0) {
>>> +        goto error;
>>> +    }
>>> +
>>> +    if (tpm_emulator_unix_tx_bufs(tpm_emu, cmd->in, cmd->in_len,
>>> +                                  cmd->out, cmd->out_len,
>>> +                                  &cmd->selftest_done, &err) < 0) {
>>> +        goto error;
>>>        }
>>>    
>>> -    tb->recv_data_callback(tb->tpm_state, selftest_done);
>>> +    tb->recv_data_callback(tb->tpm_state);
>>> +    return;
>>> +
>>> +error:
>>> +    tpm_util_write_fatal_error_response(cmd->out, cmd->out_len);
>>> +    error_report_err(err);
>>>    }
>>>    
>>>    static int tpm_emulator_probe_caps(TPMEmulator *tpm_emu)
>>> diff --git a/hw/tpm/tpm_passthrough.c b/hw/tpm/tpm_passthrough.c
>>> index 0ae4596932..93d72b8e9e 100644
>>> --- a/hw/tpm/tpm_passthrough.c
>>> +++ b/hw/tpm/tpm_passthrough.c
>>> @@ -137,30 +137,16 @@ err_exit:
>>>        return ret;
>>>    }
>>>    
>>> -static int tpm_passthrough_unix_transfer(TPMPassthruState *tpm_pt,
>>> -                                         const TPMLocality *locty_data,
>>> -                                         bool *selftest_done)
>>> -{
>>> -    return tpm_passthrough_unix_tx_bufs(tpm_pt,
>>> -                                        locty_data->w_buffer.buffer,
>>> -                                        locty_data->w_offset,
>>> -                                        locty_data->r_buffer.buffer,
>>> -                                        locty_data->r_buffer.size,
>>> -                                        selftest_done);
>>> -}
>>> -
>>> -static void tpm_passthrough_handle_request(TPMBackend *tb)
>>> +static void tpm_passthrough_handle_request(TPMBackend *tb, TPMBackendCmd
>>> *cmd)
>>>    {
>>>        TPMPassthruState *tpm_pt = TPM_PASSTHROUGH(tb);
>>> -    bool selftest_done = false;
>>>    
>>> -    DPRINTF("tpm_passthrough: processing command\n");
>>> +    DPRINTF("tpm_passthrough: processing command %p\n", cmd);
>>>    
>>> -    tpm_passthrough_unix_transfer(tpm_pt,
>>> -                                  tb->tpm_state->locty_data,
>>> -                                  &selftest_done);
>>> +    tpm_passthrough_unix_tx_bufs(tpm_pt, cmd->in, cmd->in_len,
>>> +                                 cmd->out, cmd->out_len,
>>> &cmd->selftest_done);
>>>    
>>> -    tb->recv_data_callback(tb->tpm_state, selftest_done);
>>> +    tb->recv_data_callback(tb->tpm_state);
>>>    }
>>>    
>>>    static void tpm_passthrough_reset(TPMBackend *tb)
>>> diff --git a/hw/tpm/tpm_tis.c b/hw/tpm/tpm_tis.c
>>> index 345a4fbee5..ffed7bfaf9 100644
>>> --- a/hw/tpm/tpm_tis.c
>>> +++ b/hw/tpm/tpm_tis.c
>>> @@ -215,7 +215,15 @@ static void tpm_tis_tpm_send(TPMState *s, uint8_t
>>> locty)
>>>         */
>>>        tis->loc[locty].state = TPM_TIS_STATE_EXECUTION;
>>>    
>>> -    tpm_backend_deliver_request(s->be_driver);
>>> +    s->cmd = (TPMBackendCmd) {
>>> +        .locty = locty,
>>> +        .in = s->locty_data->w_buffer.buffer,
>>> +        .in_len = s->locty_data->w_offset,
>>> +        .out = s->locty_data->r_buffer.buffer,
>>> +        .out_len = s->locty_data->r_buffer.size
>>> +    };
>>> +
>>> +    tpm_backend_deliver_request(s->be_driver, &s->cmd);
>>>    }
>>>    
>>>    /* raise an interrupt if allowed */
>>> @@ -352,7 +360,7 @@ static void tpm_tis_receive_bh(void *opaque)
>>>    {
>>>        TPMState *s = opaque;
>>>        TPMTISEmuState *tis = &s->s.tis;
>>> -    uint8_t locty = s->locty_number;
>>> +    uint8_t locty = s->cmd.locty;
>>>    
>>>        tpm_tis_sts_set(&tis->loc[locty],
>>>                        TPM_TIS_STS_VALID | TPM_TIS_STS_DATA_AVAILABLE);
>>> @@ -371,11 +379,11 @@ static void tpm_tis_receive_bh(void *opaque)
>>>    /*
>>>     * Callback from the TPM to indicate that the response was received.
>>>     */
>>> -static void tpm_tis_receive_cb(TPMState *s,
>>> -                               bool is_selftest_done)
>>> +static void tpm_tis_receive_cb(TPMState *s)
>>>    {
>>>        TPMTISEmuState *tis = &s->s.tis;
>>> -    uint8_t locty = s->locty_number;
>>> +    bool is_selftest_done = s->cmd.selftest_done;
>>> +    uint8_t locty = s->cmd.locty;
>>>        uint8_t l;
>>>    
>>>        if (is_selftest_done) {
>>
>>

  reply	other threads:[~2017-10-11  1:27 UTC|newest]

Thread overview: 116+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-10-09 22:55 [Qemu-devel] [PATCH 00/42] TPM: code cleanup & CRB device Marc-André Lureau
2017-10-09 22:55 ` [Qemu-devel] [PATCH 01/42] tpm-tis: remove unused hw_access argument Marc-André Lureau
2017-10-10  2:34   ` Stefan Berger
2017-10-09 22:55 ` [Qemu-devel] [PATCH 02/42] tpm-tis: remove RAISE_STS_IRQ Marc-André Lureau
2017-10-10  2:36   ` Stefan Berger
2017-10-09 22:55 ` [Qemu-devel] [PATCH 03/42] tpm: make tpm_get_backend_driver() static Marc-André Lureau
2017-10-10  2:36   ` Stefan Berger
2017-10-09 22:55 ` [Qemu-devel] [PATCH 04/42] tpm: lookup tpm backend class in tpm_driver_find_by_type() Marc-André Lureau
2017-10-10  2:38   ` Stefan Berger
2017-10-09 22:55 ` [Qemu-devel] [PATCH 05/42] tpm: replace tpm_get_backend_driver() to drop be_drivers Marc-André Lureau
2017-10-10  2:40   ` Stefan Berger
2017-10-09 22:55 ` [Qemu-devel] [PATCH 06/42] tpm: remove tpm_register_driver() Marc-André Lureau
2017-10-10  2:41   ` Stefan Berger
2017-10-09 22:55 ` [Qemu-devel] [PATCH 07/42] tpm: move TPMSizedBuffer to tpm_tis.h Marc-André Lureau
2017-10-10  2:41   ` Stefan Berger
2017-10-09 22:55 ` [Qemu-devel] [PATCH 08/42] tpm: remove TPMDriverOps Marc-André Lureau
2017-10-10  7:12   ` Valluri, Amarnath
2017-10-10  7:29     ` Valluri, Amarnath
2017-10-19 14:43   ` Stefan Berger
2017-10-09 22:55 ` [Qemu-devel] [PATCH 09/42] tpm: remove init() class method Marc-André Lureau
2017-10-10 15:30   ` Stefan Berger
2017-10-09 22:55 ` [Qemu-devel] [PATCH 10/42] tpm: remove configure_tpm() hop Marc-André Lureau
2017-10-10 15:31   ` Stefan Berger
2017-10-09 22:55 ` [Qemu-devel] [PATCH 11/42] tpm: remove unused TPMBackendCmd Marc-André Lureau
2017-10-19 14:39   ` Stefan Berger
2017-10-09 22:55 ` [Qemu-devel] [PATCH 12/42] tpm: remove needless cast Marc-André Lureau
2017-10-10 15:31   ` Stefan Berger
2017-10-09 22:55 ` [Qemu-devel] [PATCH 13/42] tpm: remove locty argument from receive_cb Marc-André Lureau
2017-10-10 15:32   ` Stefan Berger
2017-10-09 22:55 ` [Qemu-devel] [PATCH 14/42] tpm: add TPMBackendCmd to hold the request state Marc-André Lureau
2017-10-10 15:38   ` Stefan Berger
2017-10-10 16:16     ` Marc-André Lureau
2017-10-11  1:27       ` Stefan Berger [this message]
2017-10-09 22:55 ` [Qemu-devel] [PATCH 15/42] tpm-emulator: fix error handling Marc-André Lureau
2017-10-10 15:39   ` Stefan Berger
2017-10-09 22:55 ` [Qemu-devel] [PATCH 16/42] tpm: remove locty_data from TPMState Marc-André Lureau
2017-10-10 15:42   ` Stefan Berger
2017-10-09 22:55 ` [Qemu-devel] [PATCH 17/42] tpm-tis: move TPMState to TIS header Marc-André Lureau
2017-10-10 15:45   ` Stefan Berger
2017-10-10 16:01     ` Marc-André Lureau
2017-10-09 22:55 ` [Qemu-devel] [PATCH 18/42] tpm-tis: remove tpm_tis.h header Marc-André Lureau
2017-10-10 18:03   ` Stefan Berger
2017-10-09 22:56 ` [Qemu-devel] [PATCH 19/42] tpm-tis: fold TPMTISEmuState in TPMState Marc-André Lureau
2017-10-10 18:07   ` Stefan Berger
2017-10-09 22:56 ` [Qemu-devel] [PATCH 20/42] tpm: add a QOM TPM interface Marc-André Lureau
2017-10-10 18:09   ` Stefan Berger
2017-10-09 22:56 ` [Qemu-devel] [PATCH 21/42] tpm: move recv_data_callback to " Marc-André Lureau
2017-10-10 20:17   ` Stefan Berger
2017-10-09 22:56 ` [Qemu-devel] [PATCH 22/42] tpm-backend: store TPMIf interface, improve backend_init() Marc-André Lureau
2017-10-10  8:18   ` Valluri, Amarnath
2017-10-10 11:02     ` Marc-André Lureau
2017-10-09 22:56 ` [Qemu-devel] [PATCH 23/42] tpm-tis: no longer expose TPMState Marc-André Lureau
2017-10-10 20:17   ` Stefan Berger
2017-10-09 22:56 ` [Qemu-devel] [PATCH 24/42] tpm-be: call request_completed() out of thread Marc-André Lureau
2017-10-19 14:35   ` Stefan Berger
2017-10-19 22:02   ` Stefan Berger
2017-10-19 23:21     ` Stefan Berger
2017-10-09 22:56 ` [Qemu-devel] [PATCH 25/42] tpm-be: report error instead of front-end Marc-André Lureau
2017-10-10 20:20   ` Stefan Berger
2017-10-09 22:56 ` [Qemu-devel] [PATCH 26/42] tpm-be: ask model to the TPM interface Marc-André Lureau
2017-10-10 20:22   ` Stefan Berger
2017-10-09 22:56 ` [Qemu-devel] [PATCH 27/42] tpm: remove unused opened code Marc-André Lureau
2017-10-10 20:50   ` Stefan Berger
2017-10-10 22:27     ` Marc-André Lureau
2017-10-11  1:30       ` Stefan Berger
2017-10-09 22:56 ` [Qemu-devel] [PATCH 28/42] tpm-passthrough: don't save guessed cancel_path in options Marc-André Lureau
2017-10-10 20:26   ` Stefan Berger
2017-10-09 22:56 ` [Qemu-devel] [PATCH 29/42] tpm-be: update optional function pointers Marc-André Lureau
2017-10-10 20:28   ` Stefan Berger
2017-10-09 22:56 ` [Qemu-devel] [PATCH 30/42] tpm-passthrough: pass TPMPassthruState to handle_device_opts Marc-André Lureau
2017-10-10 20:29   ` Stefan Berger
2017-10-09 22:56 ` [Qemu-devel] [PATCH 31/42] tpm-backend: move set 'id' to common code Marc-André Lureau
2017-10-10  8:15   ` Valluri, Amarnath
2017-10-10 10:47     ` Marc-André Lureau
2017-10-10 11:39       ` Valluri, Amarnath
2017-10-10 20:31   ` Stefan Berger
2017-10-09 22:56 ` [Qemu-devel] [PATCH 32/42] tpm-passthrough: make it safer to destroy after creation Marc-André Lureau
2017-10-10 18:13   ` Stefan Berger
2017-10-09 22:56 ` [Qemu-devel] [PATCH 33/42] tpm-passthrough: remove error cleanup from handle_device_opts Marc-André Lureau
2017-10-10 20:34   ` Stefan Berger
2017-10-10 22:19     ` Marc-André Lureau
2017-10-11  1:28       ` Stefan Berger
2017-10-09 22:56 ` [Qemu-devel] [PATCH 34/42] tpm-passthrough: workaround a possible race Marc-André Lureau
2017-10-10 20:37   ` Stefan Berger
2017-10-09 22:56 ` [Qemu-devel] [PATCH 35/42] tpm-tis: simplify header inclusion Marc-André Lureau
2017-10-10 20:38   ` Stefan Berger
2017-10-09 22:56 ` [Qemu-devel] [PATCH 36/42] tpm: rename qemu_find_tpm() -> qemu_find_tpm_be() Marc-André Lureau
2017-10-10 20:38   ` Stefan Berger
2017-10-09 22:56 ` [Qemu-devel] [PATCH 37/42] tpm: lookup the the TPM interface instead of TIS device Marc-André Lureau
2017-10-10 20:21   ` Eduardo Habkost
2017-10-10 20:47     ` Stefan Berger
2017-10-10 22:31       ` Marc-André Lureau
2017-10-10 20:42   ` Stefan Berger
2017-10-09 22:56 ` [Qemu-devel] [PATCH 38/42] tpm: add TPM interface to lookup TPM version Marc-André Lureau
2017-10-10 20:43   ` Stefan Berger
2017-10-09 22:56 ` [Qemu-devel] [PATCH 39/42] tpm: add tpm_cmd_get_size() to tpm_util Marc-André Lureau
2017-10-10 18:23   ` Stefan Berger
2017-10-09 22:56 ` [Qemu-devel] [PATCH 40/42] acpi: change TPM TIS data conditions Marc-André Lureau
2017-10-10 18:22   ` Stefan Berger
2017-10-09 22:56 ` [Qemu-devel] [PATCH 41/42] tpm-emulator: add a FIXME comment about blocking cancel Marc-André Lureau
2017-10-10 18:21   ` Stefan Berger
2017-10-09 22:56 ` [Qemu-devel] [PATCH 42/42] WIP: add TPM CRB device Marc-André Lureau
2017-10-10 18:28   ` Stefan Berger
2017-10-10 20:19     ` Eduardo Habkost
2017-10-20 15:31   ` Stefan Berger
2017-11-06 17:49   ` Stefan Berger
2017-10-09 23:32 ` [Qemu-devel] [PATCH 00/42] TPM: code cleanup & " no-reply
2017-10-10  2:34 ` Stefan Berger
2017-10-10 12:14   ` Marc-André Lureau
2017-10-10 18:20     ` Stefan Berger
2017-10-19 14:26 ` Stefan Berger
2017-10-19 14:33   ` Marc-André Lureau
2017-10-19 14:44     ` Stefan Berger
2017-10-19 16:50       ` Stefan Berger
2017-10-19 17:00         ` Marc-André Lureau
2017-10-19 23:55           ` Stefan Berger

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=8c88f6a8-959b-b99c-8e5a-013bb8ae54eb@linux.vnet.ibm.com \
    --to=stefanb@linux.vnet.ibm.com \
    --cc=amarnath.valluri@intel.com \
    --cc=marcandre.lureau@redhat.com \
    --cc=qemu-devel@nongnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.