# HG changeset patch
# User kaf24@xxxxxxxxxxxxxxxxxxxx
# Node ID bf07490fab19178cf1822ea540aa2684f207de96
# Parent 18f765da27259e2adfc89e157685360909a36265
Some cleanup in TPM-related files and implementation of functionality that
got lost when switching to xenbus.
Signed-off-by: Stefan Berger <stefanb@xxxxxxxxxx>
diff -r 18f765da2725 -r bf07490fab19
linux-2.6-xen-sparse/drivers/xen/tpmback/interface.c
--- a/linux-2.6-xen-sparse/drivers/xen/tpmback/interface.c Fri Oct 7
22:21:23 2005
+++ b/linux-2.6-xen-sparse/drivers/xen/tpmback/interface.c Fri Oct 7
22:22:35 2005
@@ -67,7 +67,7 @@
tpmif_get(tpmif);
return tpmif;
} else {
- return NULL;
+ return ERR_PTR(-EEXIST);
}
}
}
diff -r 18f765da2725 -r bf07490fab19
linux-2.6-xen-sparse/drivers/xen/tpmback/tpmback.c
--- a/linux-2.6-xen-sparse/drivers/xen/tpmback/tpmback.c Fri Oct 7
22:21:23 2005
+++ b/linux-2.6-xen-sparse/drivers/xen/tpmback/tpmback.c Fri Oct 7
22:22:35 2005
@@ -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 @@
enum {
PACKET_FLAG_DISCARD_RESPONSE = 1,
- PACKET_FLAG_SEND_CONTROLMESSAGE = 2,
+ PACKET_FLAG_CHECK_RESPONSESTATUS = 2,
};
static struct data_exchange dataex;
@@ -66,9 +67,26 @@
#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 @@
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 @@
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 @@
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 @@
}
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 @@
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 @@
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 @@
*/
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 -r 18f765da2725 -r bf07490fab19 tools/python/xen/xend/server/tpmif.py
--- a/tools/python/xen/xend/server/tpmif.py Fri Oct 7 22:21:23 2005
+++ b/tools/python/xen/xend/server/tpmif.py Fri Oct 7 22:22:35 2005
@@ -37,7 +37,7 @@
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 @@
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')
_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog
|