aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorkaf24@firebug.cl.cam.ac.uk <kaf24@firebug.cl.cam.ac.uk>2005-10-07 23:22:35 +0100
committerkaf24@firebug.cl.cam.ac.uk <kaf24@firebug.cl.cam.ac.uk>2005-10-07 23:22:35 +0100
commit7951aaa23a4308e7c3b549c03d7546a3b3c06a9a (patch)
treece7adbe8118bbf707387ed55abfa3770f18c36d9
parent635fd50b51f2860400e934fbfa65e71481b8e3d6 (diff)
downloadxen-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.c2
-rw-r--r--linux-2.6-xen-sparse/drivers/xen/tpmback/tpmback.c92
-rw-r--r--tools/python/xen/xend/server/tpmif.py6
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')