aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--extras/mini-os/include/tpmback.h9
-rw-r--r--extras/mini-os/tpmback.c31
-rw-r--r--stubdom/vtpmmgr/init.c8
-rw-r--r--stubdom/vtpmmgr/vtpmmgr.c2
4 files changed, 43 insertions, 7 deletions
diff --git a/extras/mini-os/include/tpmback.h b/extras/mini-os/include/tpmback.h
index 3c11c347a3..a6cbbf1791 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 cff3861ad2..21dd20606f 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;
}
@@ -794,6 +796,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;
@@ -890,12 +915,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;
@@ -917,7 +942,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 00dd9f3516..33ac1525fc 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 563f4e8c58..270ca8a93c 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);