Skip to content

Commit

Permalink
tpm: extend TPM TIS with state migration support
Browse files Browse the repository at this point in the history
Extend the TPM TIS interface with state migration support.

We need to synchronize with the backend thread to make sure that a command
being processed by the external TPM emulator has completed and its
response been received.

Signed-off-by: Stefan Berger <[email protected]>
Reviewed-by: Dr. David Alan Gilbert <[email protected]>
Reviewed-by: Marc-André Lureau <[email protected]>
  • Loading branch information
stefanberger committed May 24, 2018
1 parent 38ab74e commit 9ec08c4
Show file tree
Hide file tree
Showing 2 changed files with 51 additions and 2 deletions.
52 changes: 50 additions & 2 deletions hw/tpm/tpm_tis.c
Original file line number Diff line number Diff line change
Expand Up @@ -894,9 +894,57 @@ static void tpm_tis_reset(DeviceState *dev)
tpm_backend_startup_tpm(s->be_driver, s->be_buffer_size);
}

/* persistent state handling */

static int tpm_tis_pre_save(void *opaque)
{
TPMState *s = opaque;
uint8_t locty = s->active_locty;

trace_tpm_tis_pre_save(locty, s->rw_offset);

if (DEBUG_TIS) {
tpm_tis_dump_state(opaque, 0);
}

/*
* Synchronize with backend completion.
*/
tpm_backend_finish_sync(s->be_driver);

return 0;
}

static const VMStateDescription vmstate_locty = {
.name = "tpm-tis/locty",
.version_id = 0,
.fields = (VMStateField[]) {
VMSTATE_UINT32(state, TPMLocality),
VMSTATE_UINT32(inte, TPMLocality),
VMSTATE_UINT32(ints, TPMLocality),
VMSTATE_UINT8(access, TPMLocality),
VMSTATE_UINT32(sts, TPMLocality),
VMSTATE_UINT32(iface_id, TPMLocality),
VMSTATE_END_OF_LIST(),
}
};

static const VMStateDescription vmstate_tpm_tis = {
.name = "tpm",
.unmigratable = 1,
.name = "tpm-tis",
.version_id = 0,
.pre_save = tpm_tis_pre_save,
.fields = (VMStateField[]) {
VMSTATE_BUFFER(buffer, TPMState),
VMSTATE_UINT16(rw_offset, TPMState),
VMSTATE_UINT8(active_locty, TPMState),
VMSTATE_UINT8(aborting_locty, TPMState),
VMSTATE_UINT8(next_locty, TPMState),

VMSTATE_STRUCT_ARRAY(loc, TPMState, TPM_TIS_NUM_LOCALITIES, 0,
vmstate_locty, TPMLocality),

VMSTATE_END_OF_LIST()
}
};

static Property tpm_tis_properties[] = {
Expand Down
1 change: 1 addition & 0 deletions hw/tpm/trace-events
Original file line number Diff line number Diff line change
Expand Up @@ -50,3 +50,4 @@ tpm_tis_mmio_write_locty_seized(uint8_t locty, uint8_t active) "Locality %d seiz
tpm_tis_mmio_write_init_abort(void) "Initiating abort"
tpm_tis_mmio_write_lowering_irq(void) "Lowering IRQ"
tpm_tis_mmio_write_data2send(uint32_t value, unsigned size) "Data to send to TPM: 0x%08x (size=%d)"
tpm_tis_pre_save(uint8_t locty, uint32_t rw_offset) "locty: %d, rw_offset = %u"

0 comments on commit 9ec08c4

Please sign in to comment.