Skip to content

Commit

Permalink
tpm-backend: Made few interface methods optional
Browse files Browse the repository at this point in the history
This allows backend implementations left optional interface methods.
For mandatory methods assertion checks added.

Took the opportunity to remove unused methods:
 - tpm_backend_get_desc()
 - TPMDriverOps->handle_startup_error

Signed-off-by: Amarnath Valluri <[email protected]>
Reviewed-by: Marc-André Lureau <[email protected]>
Reviewed-by: Stefan Berger<[email protected]>
Signed-off-by: Stefan Berger <[email protected]>
  • Loading branch information
avalluri authored and stefanberger committed Oct 13, 2017
1 parent f35fe5c commit 93330cf
Show file tree
Hide file tree
Showing 4 changed files with 28 additions and 62 deletions.
39 changes: 24 additions & 15 deletions backends/tpm.c
Original file line number Diff line number Diff line change
Expand Up @@ -44,26 +44,21 @@ enum TpmType tpm_backend_get_type(TPMBackend *s)
return k->ops->type;
}

const char *tpm_backend_get_desc(TPMBackend *s)
{
TPMBackendClass *k = TPM_BACKEND_GET_CLASS(s);

return k->ops->desc();
}

int tpm_backend_init(TPMBackend *s, TPMState *state,
TPMRecvDataCB *datacb)
{
TPMBackendClass *k = TPM_BACKEND_GET_CLASS(s);

s->tpm_state = state;
s->recv_data_callback = datacb;
s->had_startup_error = false;

return k->ops->init(s);
return k->ops->init ? k->ops->init(s) : 0;
}

int tpm_backend_startup_tpm(TPMBackend *s)
{
int res = 0;
TPMBackendClass *k = TPM_BACKEND_GET_CLASS(s);

/* terminate a running TPM */
Expand All @@ -73,20 +68,24 @@ int tpm_backend_startup_tpm(TPMBackend *s)
NULL);
g_thread_pool_push(s->thread_pool, (gpointer)TPM_BACKEND_CMD_INIT, NULL);

return k->ops->startup_tpm(s);
res = k->ops->startup_tpm ? k->ops->startup_tpm(s) : 0;

s->had_startup_error = (res != 0);

return res;
}

bool tpm_backend_had_startup_error(TPMBackend *s)
{
TPMBackendClass *k = TPM_BACKEND_GET_CLASS(s);

return k->ops->had_startup_error(s);
return s->had_startup_error;
}

size_t tpm_backend_realloc_buffer(TPMBackend *s, TPMSizedBuffer *sb)
{
TPMBackendClass *k = TPM_BACKEND_GET_CLASS(s);

assert(k->ops->realloc_buffer);

return k->ops->realloc_buffer(sb);
}

Expand All @@ -100,36 +99,46 @@ void tpm_backend_reset(TPMBackend *s)
{
TPMBackendClass *k = TPM_BACKEND_GET_CLASS(s);

k->ops->reset(s);
if (k->ops->reset) {
k->ops->reset(s);
}

tpm_backend_thread_end(s);

s->had_startup_error = false;
}

void tpm_backend_cancel_cmd(TPMBackend *s)
{
TPMBackendClass *k = TPM_BACKEND_GET_CLASS(s);

assert(k->ops->cancel_cmd);

k->ops->cancel_cmd(s);
}

bool tpm_backend_get_tpm_established_flag(TPMBackend *s)
{
TPMBackendClass *k = TPM_BACKEND_GET_CLASS(s);

return k->ops->get_tpm_established_flag(s);
return k->ops->get_tpm_established_flag ?
k->ops->get_tpm_established_flag(s) : false;
}

int tpm_backend_reset_tpm_established_flag(TPMBackend *s, uint8_t locty)
{
TPMBackendClass *k = TPM_BACKEND_GET_CLASS(s);

return k->ops->reset_tpm_established_flag(s, locty);
return k->ops->reset_tpm_established_flag ?
k->ops->reset_tpm_established_flag(s, locty) : 0;
}

TPMVersion tpm_backend_get_tpm_version(TPMBackend *s)
{
TPMBackendClass *k = TPM_BACKEND_GET_CLASS(s);

assert(k->ops->get_tpm_version);

return k->ops->get_tpm_version(s);
}

Expand Down
36 changes: 1 addition & 35 deletions hw/tpm/tpm_passthrough.c
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,6 @@ struct TPMPassthruState {
bool tpm_executing;
bool tpm_op_canceled;
int cancel_fd;
bool had_startup_error;

TPMVersion tpm_version;
};
Expand Down Expand Up @@ -227,29 +226,11 @@ static void tpm_passthrough_handle_request(TPMBackend *tb, TPMBackendCmd cmd)
}
}

/*
* Start the TPM (thread). If it had been started before, then terminate
* and start it again.
*/
static int tpm_passthrough_startup_tpm(TPMBackend *tb)
{
return 0;
}

static void tpm_passthrough_reset(TPMBackend *tb)
{
TPMPassthruState *tpm_pt = TPM_PASSTHROUGH(tb);

DPRINTF("tpm_passthrough: CALL TO TPM_RESET!\n");

tpm_passthrough_cancel_cmd(tb);

tpm_pt->had_startup_error = false;
}

static int tpm_passthrough_init(TPMBackend *tb)
{
return 0;
}

static bool tpm_passthrough_get_tpm_established_flag(TPMBackend *tb)
Expand All @@ -264,13 +245,6 @@ static int tpm_passthrough_reset_tpm_established_flag(TPMBackend *tb,
return 0;
}

static bool tpm_passthrough_get_startup_error(TPMBackend *tb)
{
TPMPassthruState *tpm_pt = TPM_PASSTHROUGH(tb);

return tpm_pt->had_startup_error;
}

static size_t tpm_passthrough_realloc_buffer(TPMSizedBuffer *sb)
{
size_t wanted_size = 4096; /* Linux tpm.c buffer size */
Expand Down Expand Up @@ -309,11 +283,6 @@ static void tpm_passthrough_cancel_cmd(TPMBackend *tb)
}
}

static const char *tpm_passthrough_create_desc(void)
{
return "Passthrough TPM backend driver";
}

static TPMVersion tpm_passthrough_get_tpm_version(TPMBackend *tb)
{
TPMPassthruState *tpm_pt = TPM_PASSTHROUGH(tb);
Expand Down Expand Up @@ -453,13 +422,10 @@ static const QemuOptDesc tpm_passthrough_cmdline_opts[] = {
static const TPMDriverOps tpm_passthrough_driver = {
.type = TPM_TYPE_PASSTHROUGH,
.opts = tpm_passthrough_cmdline_opts,
.desc = tpm_passthrough_create_desc,
.desc = "Passthrough TPM backend driver",
.create = tpm_passthrough_create,
.init = tpm_passthrough_init,
.startup_tpm = tpm_passthrough_startup_tpm,
.realloc_buffer = tpm_passthrough_realloc_buffer,
.reset = tpm_passthrough_reset,
.had_startup_error = tpm_passthrough_get_startup_error,
.cancel_cmd = tpm_passthrough_cancel_cmd,
.get_tpm_established_flag = tpm_passthrough_get_tpm_established_flag,
.reset_tpm_established_flag = tpm_passthrough_reset_tpm_established_flag,
Expand Down
13 changes: 2 additions & 11 deletions include/sysemu/tpm_backend.h
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,7 @@ struct TPMBackend {
TPMState *tpm_state;
GThreadPool *thread_pool;
TPMRecvDataCB *recv_data_callback;
bool had_startup_error;

char *id;
enum TpmModel fe_model;
Expand Down Expand Up @@ -75,16 +76,14 @@ struct TPMDriverOps {
enum TpmType type;
const QemuOptDesc *opts;
/* get a descriptive text of the backend to display to the user */
const char *(*desc)(void);
const char *desc;

TPMBackend *(*create)(QemuOpts *opts, const char *id);

/* initialize the backend */
int (*init)(TPMBackend *t);
/* start up the TPM on the backend */
int (*startup_tpm)(TPMBackend *t);
/* returns true if nothing will ever answer TPM requests */
bool (*had_startup_error)(TPMBackend *t);

size_t (*realloc_buffer)(TPMSizedBuffer *sb);

Expand All @@ -108,14 +107,6 @@ struct TPMDriverOps {
*/
enum TpmType tpm_backend_get_type(TPMBackend *s);

/**
* tpm_backend_get_desc:
* @s: the backend
*
* Returns a human readable description of the backend.
*/
const char *tpm_backend_get_desc(TPMBackend *s);

/**
* tpm_backend_init:
* @s: the backend to initialized
Expand Down
2 changes: 1 addition & 1 deletion tpm.c
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,7 @@ static void tpm_display_backend_drivers(void)
continue;
}
fprintf(stderr, "%12s %s\n",
TpmType_str(i), be_drivers[i]->desc());
TpmType_str(i), be_drivers[i]->desc);
}
fprintf(stderr, "\n");
}
Expand Down

0 comments on commit 93330cf

Please sign in to comment.