diff options
author | kaf24@firebug.cl.cam.ac.uk <kaf24@firebug.cl.cam.ac.uk> | 2005-10-07 23:22:35 +0100 |
---|---|---|
committer | kaf24@firebug.cl.cam.ac.uk <kaf24@firebug.cl.cam.ac.uk> | 2005-10-07 23:22:35 +0100 |
commit | 7951aaa23a4308e7c3b549c03d7546a3b3c06a9a (patch) | |
tree | ce7adbe8118bbf707387ed55abfa3770f18c36d9 | |
parent | 635fd50b51f2860400e934fbfa65e71481b8e3d6 (diff) | |
download | xen-7951aaa23a4308e7c3b549c03d7546a3b3c06a9a.tar.gz xen-7951aaa23a4308e7c3b549c03d7546a3b3c06a9a.tar.bz2 xen-7951aaa23a4308e7c3b549c03d7546a3b3c06a9a.zip |
Some cleanup in TPM-related files and implementation of functionality that
got lost when switching to xenbus.
Signed-off-by: Stefan Berger <stefanb@us.ibm.com>
-rw-r--r-- | linux-2.6-xen-sparse/drivers/xen/tpmback/interface.c | 2 | ||||
-rw-r--r-- | linux-2.6-xen-sparse/drivers/xen/tpmback/tpmback.c | 92 | ||||
-rw-r--r-- | tools/python/xen/xend/server/tpmif.py | 6 |
3 files changed, 61 insertions, 39 deletions
diff --git a/linux-2.6-xen-sparse/drivers/xen/tpmback/interface.c b/linux-2.6-xen-sparse/drivers/xen/tpmback/interface.c index 2f426e08b8..98db181306 100644 --- a/linux-2.6-xen-sparse/drivers/xen/tpmback/interface.c +++ b/linux-2.6-xen-sparse/drivers/xen/tpmback/interface.c @@ -67,7 +67,7 @@ tpmif_find(domid_t domid, long int instance) tpmif_get(tpmif); return tpmif; } else { - return NULL; + return ERR_PTR(-EEXIST); } } } diff --git a/linux-2.6-xen-sparse/drivers/xen/tpmback/tpmback.c b/linux-2.6-xen-sparse/drivers/xen/tpmback/tpmback.c index 0fe22a43f2..f5c0ccb10a 100644 --- a/linux-2.6-xen-sparse/drivers/xen/tpmback/tpmback.c +++ b/linux-2.6-xen-sparse/drivers/xen/tpmback/tpmback.c @@ -22,6 +22,7 @@ #include <asm-xen/xen-public/grant_table.h> +/* local data structures */ struct data_exchange { struct list_head pending_pak; struct list_head current_pak; @@ -45,7 +46,7 @@ struct packet { enum { PACKET_FLAG_DISCARD_RESPONSE = 1, - PACKET_FLAG_SEND_CONTROLMESSAGE = 2, + PACKET_FLAG_CHECK_RESPONSESTATUS = 2, }; static struct data_exchange dataex; @@ -66,10 +67,27 @@ static int packet_read_shmem(struct packet *pak, #define MAX_PENDING_REQS TPMIF_TX_RING_SIZE -static multicall_entry_t tx_mcl[MAX_PENDING_REQS]; - #define MIN(x,y) (x) < (y) ? (x) : (y) + +/*************************************************************** + Buffer copying +***************************************************************/ +static inline int +copy_from_buffer(void *to, + const void *from, + unsigned long size, + int userbuffer) +{ + if (userbuffer) { + if (copy_from_user(to, from, size)) + return -EFAULT; + } else { + memcpy(to, from, size); + } + return 0; +} + /*************************************************************** Packet-related functions ***************************************************************/ @@ -188,15 +206,25 @@ packet_write(struct packet *pak, DPRINTK("Supposed to send %d bytes to front-end!\n", size); - if (0 != (pak->flags & PACKET_FLAG_SEND_CONTROLMESSAGE)) { + if (0 != (pak->flags & PACKET_FLAG_CHECK_RESPONSESTATUS)) { #ifdef CONFIG_XEN_TPMDEV_CLOSE_IF_VTPM_FAILS u32 res; - memcpy(&res, &data[2+4], sizeof(res)); + if (copy_from_buffer(&res, + &data[2+4], + sizeof(res), + userbuffer)) { + return -EFAULT; + } + if (res != 0) { /* - * Will close down this device and have the + * Close down this device. Should have the * FE notified about closure. */ + if (!pak->tpmif) { + return -EFAULT; + } + pak->tpmif->status = DISCONNECTING; } #endif } @@ -226,16 +254,15 @@ _packet_write(struct packet *pak, int rc = 0; unsigned int i = 0; unsigned int offset = 0; - multicall_entry_t *mcl; - if (tpmif == NULL) + if (tpmif == NULL) { return -EFAULT; + } - if (tpmif->status != CONNECTED) { + if (tpmif->status == DISCONNECTED) { return size; } - mcl = tx_mcl; while (offset < size && i < TPMIF_TX_RING_SIZE) { unsigned int tocopy; struct gnttab_map_grant_ref map_op; @@ -272,22 +299,15 @@ _packet_write(struct packet *pak, PAGE_SHIFT] = FOREIGN_FRAME(map_op.dev_bus_addr >> PAGE_SHIFT); - tocopy = size - offset; - if (tocopy > PAGE_SIZE) { - tocopy = PAGE_SIZE; - } - if (userbuffer) { - if (copy_from_user((void *)(MMAP_VADDR(tpmif,i) | - (tx->addr & ~PAGE_MASK)), - (void __user *)&data[offset], - tocopy)) { - tpmif_put(tpmif); - return -EFAULT; - } - } else { - memcpy((void *)(MMAP_VADDR(tpmif,i) | - (tx->addr & ~PAGE_MASK)), - &data[offset], tocopy); + tocopy = MIN(size - offset, PAGE_SIZE); + + if (copy_from_buffer((void *)(MMAP_VADDR(tpmif,i)| + (tx->addr & ~PAGE_MASK)), + &data[offset], + tocopy, + userbuffer)) { + tpmif_put(tpmif); + return -EFAULT; } tx->size = tocopy; @@ -306,8 +326,8 @@ _packet_write(struct packet *pak, } rc = offset; - DPRINTK("Notifying frontend via event channel %d\n", - tpmif->evtchn); + DPRINTK("Notifying frontend via irq %d\n", + tpmif->irq); notify_remote_via_irq(tpmif->irq); return rc; @@ -705,9 +725,13 @@ static u8 destroy_cmd[] = { int tpmif_vtpm_open(tpmif_t *tpmif, domid_t domid, u32 instance) { int rc = 0; - struct packet *pak = packet_alloc(tpmif, sizeof(create_cmd), create_cmd[0], - PACKET_FLAG_DISCARD_RESPONSE| - PACKET_FLAG_SEND_CONTROLMESSAGE); + struct packet *pak; + + pak = packet_alloc(tpmif, + sizeof(create_cmd), + create_cmd[0], + PACKET_FLAG_DISCARD_RESPONSE| + PACKET_FLAG_CHECK_RESPONSESTATUS); if (pak) { u8 buf[sizeof(create_cmd)]; u32 domid_no = htonl((u32)domid); @@ -742,8 +766,7 @@ int tpmif_vtpm_close(u32 instid) pak = packet_alloc(NULL, sizeof(create_cmd), create_cmd[0], - PACKET_FLAG_DISCARD_RESPONSE| - PACKET_FLAG_SEND_CONTROLMESSAGE); + PACKET_FLAG_DISCARD_RESPONSE); if (pak) { u8 buf[sizeof(destroy_cmd)]; u32 instid_no = htonl(instid); @@ -896,7 +919,8 @@ static int vtpm_receive(tpmif_t *tpmif, u32 size) */ if (size < 10 || be32_to_cpu(*native_size) != size || - 0 == dataex.has_opener) { + 0 == dataex.has_opener || + tpmif->status != CONNECTED) { rc = -EINVAL; goto failexit; } else { diff --git a/tools/python/xen/xend/server/tpmif.py b/tools/python/xen/xend/server/tpmif.py index b5269a2cb0..d46bb698be 100644 --- a/tools/python/xen/xend/server/tpmif.py +++ b/tools/python/xen/xend/server/tpmif.py @@ -37,7 +37,7 @@ class TPMifController(DevController): def getDeviceDetails(self, config): """@see DevController.getDeviceDetails""" - + devid = int(sxp.child_value(config, 'instance', '0')) log.info("The domain has a TPM with instance %d." % devid) @@ -48,9 +48,7 @@ class TPMifController(DevController): def configuration(self, devid): - log.info("The configuration method is called.") - - result = DevContoller.configuration(self, devid) + result = DevController.configuration(self, devid) (instance) = self.readBackend(devif, 'instance') |