[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH 04/12] mini-os/tpmback: Replace UUID field with opaque pointer
Instead of only recording the UUID field, which may not be of interest to all tpmback implementations, provide a user-settable opaque pointer associated with the tpmback instance. Signed-off-by: Daniel De Graaf <dgdegra@xxxxxxxxxxxxx> --- extras/mini-os/include/tpmback.h | 9 +++++++-- extras/mini-os/tpmback.c | 31 ++++++++++++++++++++++++++++--- stubdom/vtpmmgr/init.c | 8 +++++++- stubdom/vtpmmgr/vtpmmgr.c | 2 +- 4 files changed, 43 insertions(+), 7 deletions(-) diff --git a/extras/mini-os/include/tpmback.h b/extras/mini-os/include/tpmback.h index 3c11c34..a6cbbf1 100644 --- a/extras/mini-os/include/tpmback.h +++ b/extras/mini-os/include/tpmback.h @@ -45,10 +45,10 @@ struct tpmcmd { domid_t domid; /* Domid of the frontend */ uint8_t locality; /* Locality requested by the frontend */ unsigned int handle; /* Handle of the frontend */ - unsigned char uuid[16]; /* uuid of the tpm interface */ + void *opaque; /* Opaque pointer taken from the tpmback instance */ - unsigned int req_len; /* Size of the command in buf - set by tpmback driver */ uint8_t* req; /* tpm command bits, allocated by driver, DON'T FREE IT */ + unsigned int req_len; /* Size of the command in buf - set by tpmback driver */ unsigned int resp_len; /* Size of the outgoing command, you set this before passing the cmd object to tpmback_resp */ uint8_t* resp; /* Buffer for response - YOU MUST ALLOCATE IT, YOU MUST ALSO FREE IT */ @@ -94,4 +94,9 @@ int tpmback_num_frontends(void); * The return value is internally allocated, so don't free it */ unsigned char* tpmback_get_uuid(domid_t domid, unsigned int handle); +/* Get and set the opaque pointer for a tpmback instance */ +void* tpmback_get_opaque(domid_t domid, unsigned int handle); +/* Returns zero if successful, nonzero on failure (no such frontend) */ +int tpmback_set_opaque(domid_t domid, unsigned int handle, void* opaque); + #endif diff --git a/extras/mini-os/tpmback.c b/extras/mini-os/tpmback.c index ee2af7a..a3ee1d0 100644 --- a/extras/mini-os/tpmback.c +++ b/extras/mini-os/tpmback.c @@ -92,6 +92,7 @@ struct tpmif { enum { DISCONNECTED, DISCONNECTING, CONNECTED } status; unsigned char uuid[16]; + void* opaque; /* state flags */ int flags; @@ -391,6 +392,7 @@ inline tpmif_t* __init_tpmif(domid_t domid, unsigned int handle) tpmif->status = DISCONNECTED; tpmif->page = NULL; tpmif->flags = 0; + tpmif->opaque = NULL; memset(tpmif->uuid, 0, sizeof(tpmif->uuid)); return tpmif; } @@ -793,6 +795,29 @@ static void generate_backend_events(const char* path) return; } +void* tpmback_get_opaque(domid_t domid, unsigned int handle) +{ + tpmif_t* tpmif; + if((tpmif = get_tpmif(domid, handle)) == NULL) { + TPMBACK_DEBUG("get_opaque() failed, %u/%u is an invalid frontend\n", (unsigned int) domid, handle); + return NULL; + } + + return tpmif->opaque; +} + +int tpmback_set_opaque(domid_t domid, unsigned int handle, void *opaque) +{ + tpmif_t* tpmif; + if((tpmif = get_tpmif(domid, handle)) == NULL) { + TPMBACK_DEBUG("set_opaque() failed, %u/%u is an invalid frontend\n", (unsigned int) domid, handle); + return -1; + } + + tpmif->opaque = opaque; + return 0; +} + unsigned char* tpmback_get_uuid(domid_t domid, unsigned int handle) { tpmif_t* tpmif; @@ -889,12 +914,12 @@ void shutdown_tpmback(void) schedule(); } -inline void init_tpmcmd(tpmcmd_t* tpmcmd, domid_t domid, unsigned int handle, unsigned char uuid[16]) +static void init_tpmcmd(tpmcmd_t* tpmcmd, domid_t domid, unsigned int handle, void *opaque) { tpmcmd->domid = domid; tpmcmd->locality = -1; tpmcmd->handle = handle; - memcpy(tpmcmd->uuid, uuid, sizeof(tpmcmd->uuid)); + tpmcmd->opaque = opaque; tpmcmd->req = NULL; tpmcmd->req_len = 0; tpmcmd->resp = NULL; @@ -916,7 +941,7 @@ tpmcmd_t* get_request(tpmif_t* tpmif) { if((cmd = malloc(sizeof(*cmd))) == NULL) { goto error; } - init_tpmcmd(cmd, tpmif->domid, tpmif->handle, tpmif->uuid); + init_tpmcmd(cmd, tpmif->domid, tpmif->handle, tpmif->opaque); shr = tpmif->page; cmd->req_len = shr->length; diff --git a/stubdom/vtpmmgr/init.c b/stubdom/vtpmmgr/init.c index 00dd9f3..33ac152 100644 --- a/stubdom/vtpmmgr/init.c +++ b/stubdom/vtpmmgr/init.c @@ -436,6 +436,12 @@ egress: return status; } +/* Set up the opaque field to contain a pointer to the UUID */ +static void set_opaque_to_uuid(domid_t domid, unsigned int handle) +{ + tpmback_set_opaque(domid, handle, tpmback_get_uuid(domid, handle)); +} + TPM_RESULT vtpmmgr_init(int argc, char** argv) { TPM_RESULT status = TPM_SUCCESS; @@ -462,7 +468,7 @@ TPM_RESULT vtpmmgr_init(int argc, char** argv) { } //Setup tpmback device - init_tpmback(NULL, NULL); + init_tpmback(set_opaque_to_uuid, NULL); //Setup tpm access switch(opts.tpmdriver) { diff --git a/stubdom/vtpmmgr/vtpmmgr.c b/stubdom/vtpmmgr/vtpmmgr.c index 563f4e8..270ca8a 100644 --- a/stubdom/vtpmmgr/vtpmmgr.c +++ b/stubdom/vtpmmgr/vtpmmgr.c @@ -61,7 +61,7 @@ void main_loop(void) { tpmcmd->resp = respbuf; /* Process the command */ - vtpmmgr_handle_cmd(tpmcmd->uuid, tpmcmd); + vtpmmgr_handle_cmd(tpmcmd->opaque, tpmcmd); /* Send response */ tpmback_resp(tpmcmd); -- 1.8.1.4 _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |