From: Stefan Berger <stefanb@linux.vnet.ibm.com>
To: "Michael S. Tsirkin" <mst@redhat.com>
Cc: chrisw@redhat.com, anbang.ruan@cs.ox.ac.uk,
qemu-devel@nongnu.org, rrelyea@redhat.com, alevy@redhat.com,
andreas.niederl@iaik.tugraz.at, serge@hallyn.com
Subject: Re: [Qemu-devel] [PATCH V8 03/14] Add persistent state handling to TPM TIS frontend driver
Date: Thu, 01 Sep 2011 21:12:12 -0400 [thread overview]
Message-ID: <4E602D6C.80801@linux.vnet.ibm.com> (raw)
In-Reply-To: <20110901172037.GE10989@redhat.com>
On 09/01/2011 01:20 PM, Michael S. Tsirkin wrote:
> On Wed, Aug 31, 2011 at 10:35:54AM -0400, Stefan Berger wrote:
>> This patch adds support for handling of persistent state to the TPM TIS
>> frontend.
>>
>> The currently used buffer is determined (can only be in currently active
>> locality and either be a read or a write buffer) and only that buffer's content
>> is stored. The reverse is done when the state is restored from disk
>> where the buffer's content are copied into the currently used buffer.
>>
>> To keep compatibility with existing Xen implementation the VMStateDescription
>> was adapted to be compatible with existing state. For that I am adding Andreas
>> Niederl as an author to the file.
>>
>> v5:
>> - removing qdev.no_user=1
>>
>> v4:
>> - main thread releases the 'state' lock while periodically calling the
>> backends function that may request it to write data into block storage.
>>
>> v3:
>> - all functions prefixed with tis_
>> - while the main thread is waiting for an outstanding TPM command to finish,
>> it periodically does some work (writes data to the block storage)
>>
>> Signed-off-by: Stefan Berger<stefanb@linux.vnet.ibm.com>
>>
>> ---
>> hw/tpm_tis.c | 166 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
>> 1 file changed, 166 insertions(+)
>>
>> Index: qemu-git/hw/tpm_tis.c
>> ===================================================================
>> --- qemu-git.orig/hw/tpm_tis.c
>> +++ qemu-git/hw/tpm_tis.c
>> @@ -6,6 +6,8 @@
>> * Author: Stefan Berger<stefanb@us.ibm.com>
>> * David Safford<safford@us.ibm.com>
>> *
>> + * Xen 4 support: Andrease Niederl<andreas.niederl@iaik.tugraz.at>
>> + *
>> * This program is free software; you can redistribute it and/or
>> * modify it under the terms of the GNU General Public License as
>> * published by the Free Software Foundation, version 2 of the
>> @@ -839,3 +841,167 @@ static int tis_init(ISADevice *dev)
>> err_exit:
>> return -1;
>> }
>> +
>> +/* persistent state handling */
>> +
>> +static void tis_pre_save(void *opaque)
>> +{
>> + TPMState *s = opaque;
>> + uint8_t locty = s->active_locty;
>> +
>> + qemu_mutex_lock(&s->state_lock);
>> +
>> + /* wait for outstanding requests to complete */
>> + if (IS_VALID_LOCTY(locty)&& s->loc[locty].state == STATE_EXECUTION) {
>> + if (!s->be_driver->ops->job_for_main_thread) {
>> + qemu_cond_wait(&s->from_tpm_cond,&s->state_lock);
>> + } else {
>> + while (s->loc[locty].state == STATE_EXECUTION) {
>> + qemu_mutex_unlock(&s->state_lock);
>> +
>> + s->be_driver->ops->job_for_main_thread(NULL);
>> + usleep(10000);
>> +
>> + qemu_mutex_lock(&s->state_lock);
>> + }
>> + }
>> + }
>> +
>> +#ifdef DEBUG_TIS_SR
>> + fprintf(stderr,
>> + "tpm_tis: suspend: locty 0 : r_offset = %d, w_offset = %d\n",
>> + s->loc[0].r_offset, s->loc[0].w_offset);
>> + if (s->loc[0].r_offset) {
>> + tis_dump_state(opaque, 0);
>> + }
>> +#endif
>> +
>> + qemu_mutex_unlock(&s->state_lock);
>> +
>> + /* copy current active read or write buffer into the buffer
>> + written to disk */
>> + if (IS_VALID_LOCTY(locty)) {
>> + switch (s->loc[locty].state) {
>> + case STATE_RECEPTION:
>> + memcpy(s->buf,
>> + s->loc[locty].w_buffer.buffer,
>> + MIN(sizeof(s->buf),
>> + s->loc[locty].w_buffer.size));
>> + s->offset = s->loc[locty].w_offset;
>> + break;
>> + case STATE_COMPLETION:
>> + memcpy(s->buf,
>> + s->loc[locty].r_buffer.buffer,
>> + MIN(sizeof(s->buf),
>> + s->loc[locty].r_buffer.size));
>> + s->offset = s->loc[locty].r_offset;
>> + break;
>> + default:
>> + /* leak nothing */
>> + memset(s->buf, 0x0, sizeof(s->buf));
>> + break;
>> + }
>> + }
>> +
>> + s->be_driver->ops->save_volatile_data();
>> +}
>> +
>> +
>> +static int tis_post_load(void *opaque,
>> + int version_id __attribute__((unused)))
>> +{
>> + TPMState *s = opaque;
>> +
>> + uint8_t locty = s->active_locty;
>> +
>> + if (IS_VALID_LOCTY(locty)) {
>> + switch (s->loc[locty].state) {
>> + case STATE_RECEPTION:
>> + memcpy(s->loc[locty].w_buffer.buffer,
>> + s->buf,
>> + MIN(sizeof(s->buf),
>> + s->loc[locty].w_buffer.size));
>> + s->loc[locty].w_offset = s->offset;
>> + break;
>> + case STATE_COMPLETION:
>> + memcpy(s->loc[locty].r_buffer.buffer,
>> + s->buf,
>> + MIN(sizeof(s->buf),
>> + s->loc[locty].r_buffer.size));
>> + s->loc[locty].r_offset = s->offset;
>> + break;
>> + default:
>> + break;
>> + }
>> + }
> Should this do something with interrupts as well?
Even if the last action the TIS emulator was doing before the VM
suspended completely was to reveive the last outstanding response then
the tis_raise_irq() function was called in tis_tpm_receive_cb() and
along with that qemu_irq_raise(s->irq) was executed. Presumably it's not
necessary to raise this same IRQ again immediately after resuming but
this IRQ was restored as part of restoring the interrupt device model's
state and the OS (still) sees the IRQ as pending.
>> +
>> +#ifdef DEBUG_TIS_SR
>> + fprintf(stderr,
>> + "tpm_tis: resume : locty 0 : r_offset = %d, w_offset = %d\n",
>> + s->loc[0].r_offset, s->loc[0].w_offset);
>> +#endif
>> +
>> + return s->be_driver->ops->load_volatile_data(s);
>> +}
>> +
>> +
>> +static const VMStateDescription vmstate_locty = {
>> + .name = "loc",
>> + .version_id = 1,
>> + .minimum_version_id = 0,
>> + .minimum_version_id_old = 0,
>> + .fields = (VMStateField[]) {
>> + VMSTATE_UINT32(state, TPMLocality),
>> + VMSTATE_UINT32(inte, TPMLocality),
>> + VMSTATE_UINT32(ints, TPMLocality),
>> + VMSTATE_UINT8(access, TPMLocality),
>> + VMSTATE_UINT8(sts, TPMLocality),
>> + VMSTATE_END_OF_LIST(),
>> + }
>> +};
>> +
>> +
>> +static const VMStateDescription vmstate_tis = {
>> + .name = "tpm",
>> + .version_id = 1,
>> + .minimum_version_id = 0,
>> + .minimum_version_id_old = 0,
>> + .pre_save = tis_pre_save,
>> + .post_load = tis_post_load,
>> + .fields = (VMStateField[]) {
>> + VMSTATE_UINT32(irq_num, TPMState),
>> + VMSTATE_UINT32(offset, TPMState),
>> + VMSTATE_BUFFER(buf, TPMState),
>> + VMSTATE_UINT8(active_locty, TPMState),
>> + VMSTATE_UINT8(aborting_locty, TPMState),
>> + VMSTATE_UINT8(next_locty, TPMState),
> Is irq_num guest modifiable?
It's hard-wired to IRQ 5.
> If yes post load should do something with it?
> If not, why are we migrating it?
True. I'll remove it from the migrated state.
>> +
>> + VMSTATE_STRUCT_ARRAY(loc, TPMState, NUM_LOCALITIES, 1,
>> + vmstate_locty, TPMLocality),
>> +
>> + VMSTATE_END_OF_LIST()
>> + }
>> +};
>> +
>> +
>> +static ISADeviceInfo tis_device_info = {
>> + .init = tis_init,
>> + .qdev.name = "tpm-tis",
>> + .qdev.size = sizeof(TPMState),
>> + .qdev.vmsd =&vmstate_tis,
>> + .qdev.reset = tis_reset,
>> + .qdev.props = (Property[]) {
>> + DEFINE_PROP_UINT32("irq", TPMState,
>> + irq_num, TPM_TIS_IRQ),
>> + DEFINE_PROP_STRING("tpmdev", TPMState, backend),
>> + DEFINE_PROP_END_OF_LIST(),
>> + },
>> +};
>> +
>> +
>> +static void tis_register_device(void)
>> +{
>> + isa_qdev_register(&tis_device_info);
>> +}
>> +
>> +device_init(tis_register_device)
>>
> So this is a qdev device. Why do we need a new flag to set it up then?
>
>
Which flag are you referring to?
Stefan
next prev parent reply other threads:[~2011-09-02 1:12 UTC|newest]
Thread overview: 75+ messages / expand[flat|nested] mbox.gz Atom feed top
2011-08-31 14:35 [Qemu-devel] [PATCH V8 00/14] Qemu Trusted Platform Module (TPM) integration Stefan Berger
2011-08-31 14:35 ` [Qemu-devel] [PATCH V8 01/14] Support for TPM command line options Stefan Berger
2011-09-01 17:14 ` Michael S. Tsirkin
2011-09-02 1:01 ` Stefan Berger
2011-09-04 16:29 ` Michael S. Tsirkin
2011-09-04 16:50 ` Michael S. Tsirkin
2011-09-01 18:14 ` Michael S. Tsirkin
2011-09-02 1:02 ` Stefan Berger
2011-08-31 14:35 ` [Qemu-devel] [PATCH V8 02/14] Add TPM (frontend) hardware interface (TPM TIS) to Qemu Stefan Berger
2011-09-09 19:28 ` Paul Moore
2011-08-31 14:35 ` [Qemu-devel] [PATCH V8 03/14] Add persistent state handling to TPM TIS frontend driver Stefan Berger
2011-09-01 17:20 ` Michael S. Tsirkin
2011-09-02 1:12 ` Stefan Berger [this message]
2011-09-09 21:13 ` Paul Moore
2011-09-11 16:45 ` Stefan Berger
2011-09-12 21:16 ` Paul Moore
2011-09-12 23:37 ` Stefan Berger
2011-09-13 12:13 ` Paul Moore
2011-08-31 14:35 ` [Qemu-devel] [PATCH V8 04/14] Add tpm_tis driver to build process Stefan Berger
2011-09-01 17:23 ` Michael S. Tsirkin
2011-09-02 1:16 ` Stefan Berger
2011-08-31 14:35 ` [Qemu-devel] [PATCH V8 05/14] Add a debug register Stefan Berger
2011-08-31 14:35 ` [Qemu-devel] [PATCH V8 06/14] Add a TPM backend skeleton implementation Stefan Berger
2011-08-31 14:35 ` [Qemu-devel] [PATCH V8 07/14] Implementation of the libtpms-based backend Stefan Berger
2011-09-01 17:27 ` Michael S. Tsirkin
2011-09-02 1:24 ` Stefan Berger
2011-09-04 16:27 ` Michael S. Tsirkin
2011-08-31 14:35 ` [Qemu-devel] [PATCH V8 08/14] Introduce file lock for the block layer Stefan Berger
2011-09-01 17:32 ` Michael S. Tsirkin
2011-09-02 1:53 ` Stefan Berger
2011-09-04 19:32 ` Michael S. Tsirkin
2011-09-06 23:55 ` Stefan Berger
2011-09-07 11:18 ` Michael S. Tsirkin
2011-09-07 13:06 ` Stefan Berger
2011-09-07 13:16 ` Michael S. Tsirkin
2011-09-07 13:56 ` Stefan Berger
2011-09-07 14:10 ` Michael S. Tsirkin
2011-09-07 14:25 ` Stefan Berger
2011-09-07 14:35 ` Michael S. Tsirkin
2011-09-07 15:06 ` Stefan Berger
2011-09-07 15:16 ` Michael S. Tsirkin
2011-09-07 16:08 ` Stefan Berger
2011-09-07 18:49 ` Michael S. Tsirkin
2011-09-08 0:31 ` Stefan Berger
2011-09-08 10:36 ` Michael S. Tsirkin
2011-08-31 14:36 ` [Qemu-devel] [PATCH V8 09/14] Add block storage support for libtpms based TPM backend Stefan Berger
2011-08-31 14:36 ` [Qemu-devel] [PATCH V8 10/14] Encrypt state blobs using AES CBC encryption Stefan Berger
2011-09-01 19:26 ` Michael S. Tsirkin
2011-09-02 2:23 ` Stefan Berger
2011-09-04 16:58 ` Michael S. Tsirkin
2011-09-07 0:32 ` Stefan Berger
2011-09-07 11:59 ` Michael S. Tsirkin
2011-09-07 18:55 ` Michael S. Tsirkin
2011-09-08 0:16 ` Stefan Berger
2011-09-08 10:32 ` Michael S. Tsirkin
2011-09-08 12:11 ` Stefan Berger
2011-09-08 13:16 ` Michael S. Tsirkin
2011-09-08 15:27 ` Stefan Berger
2011-08-31 14:36 ` [Qemu-devel] [PATCH V8 11/14] Experimental support for block migrating TPMs state Stefan Berger
2011-08-31 14:36 ` [Qemu-devel] [PATCH V8 12/14] Support for taking measurements when kernel etc. are passed to Qemu Stefan Berger
2011-08-31 14:36 ` [Qemu-devel] [PATCH V8 13/14] Add a TPM backend null driver implementation Stefan Berger
2011-09-01 17:40 ` Michael S. Tsirkin
2011-09-02 2:41 ` Stefan Berger
2011-09-04 16:42 ` Michael S. Tsirkin
2011-08-31 14:36 ` [Qemu-devel] [PATCH V8 14/14] Allow to provide inital TPM state Stefan Berger
2011-09-01 18:10 ` Michael S. Tsirkin
2011-09-01 19:01 ` Michael S. Tsirkin
2011-09-02 3:00 ` Stefan Berger
2011-09-04 16:38 ` Michael S. Tsirkin
2011-09-07 2:45 ` Stefan Berger
2011-09-07 11:23 ` Michael S. Tsirkin
2011-09-07 13:51 ` Stefan Berger
2011-09-07 13:57 ` Michael S. Tsirkin
2011-09-01 18:12 ` [Qemu-devel] [PATCH V8 00/14] Qemu Trusted Platform Module (TPM) integration Michael S. Tsirkin
2011-09-02 3:02 ` 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=4E602D6C.80801@linux.vnet.ibm.com \
--to=stefanb@linux.vnet.ibm.com \
--cc=alevy@redhat.com \
--cc=anbang.ruan@cs.ox.ac.uk \
--cc=andreas.niederl@iaik.tugraz.at \
--cc=chrisw@redhat.com \
--cc=mst@redhat.com \
--cc=qemu-devel@nongnu.org \
--cc=rrelyea@redhat.com \
--cc=serge@hallyn.com \
/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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).