Skip to content

Commit

Permalink
Introduce condition in TPM backend for notification
Browse files Browse the repository at this point in the history
TPM backends will suspend independently of the frontends. Also
here we need to be able to wait for the TPM command to have been
completely processed.

Signed-off-by: Stefan Berger <stefanb@linux.vnet.ibm.com>
  • Loading branch information
stefanberger committed Dec 31, 2016
1 parent 9d8c9c3 commit b9ea09d
Showing 1 changed file with 20 additions and 0 deletions.
20 changes: 20 additions & 0 deletions hw/tpm/tpm_passthrough.c
Expand Up @@ -75,6 +75,10 @@ struct TPMPassthruState {
TPMVersion tpm_version;
ptm_cap cuse_cap; /* capabilities of the CUSE TPM */
uint8_t cur_locty_number; /* last set locality */

QemuMutex state_lock;
QemuCond cmd_complete; /* singnaled once tpm_busy is false */
bool tpm_busy;
};

typedef struct TPMPassthruState TPMPassthruState;
Expand Down Expand Up @@ -272,6 +276,11 @@ static void tpm_passthrough_worker_thread(gpointer data,
thr_parms->recv_data_callback(thr_parms->tpm_state,
thr_parms->tpm_state->locty_number,
selftest_done);
/* result delivered */
qemu_mutex_lock(&tpm_pt->state_lock);
tpm_pt->tpm_busy = false;
qemu_cond_signal(&tpm_pt->cmd_complete);
qemu_mutex_unlock(&tpm_pt->state_lock);
break;
case TPM_BACKEND_CMD_INIT:
case TPM_BACKEND_CMD_END:
Expand Down Expand Up @@ -399,6 +408,7 @@ static void tpm_passthrough_reset(TPMBackend *tb)
tpm_backend_thread_end(&tpm_pt->tbt);

tpm_pt->had_startup_error = false;
tpm_pt->tpm_busy = false;
}

static int tpm_passthrough_init(TPMBackend *tb, TPMState *s,
Expand Down Expand Up @@ -476,6 +486,11 @@ static void tpm_passthrough_deliver_request(TPMBackend *tb)
{
TPMPassthruState *tpm_pt = TPM_PASSTHROUGH(tb);

/* TPM considered busy once TPM Request scheduled for processing */
qemu_mutex_lock(&tpm_pt->state_lock);
tpm_pt->tpm_busy = true;
qemu_mutex_unlock(&tpm_pt->state_lock);

tpm_backend_thread_deliver_request(&tpm_pt->tbt);
}

Expand Down Expand Up @@ -744,6 +759,11 @@ static const TPMDriverOps tpm_passthrough_driver = {

static void tpm_passthrough_inst_init(Object *obj)
{
TPMBackend *tb = TPM_BACKEND(obj);
TPMPassthruState *tpm_pt = TPM_PASSTHROUGH(tb);

qemu_mutex_init(&tpm_pt->state_lock);
qemu_cond_init(&tpm_pt->cmd_complete);
}

static void tpm_passthrough_inst_finalize(Object *obj)
Expand Down

0 comments on commit b9ea09d

Please sign in to comment.