[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Xen-changelog] Merged.



# HG changeset patch
# User emellor@ewan
# Node ID bd37123974b293eafe307a36f1a9669c8ec2221b
# Parent  4ab4f023a6ce08999a4d64937b3206fef163c62c
# Parent  ba0bbf9d29fffbef248beff9336be79f8f0ce45b
Merged.

diff -r 4ab4f023a6ce -r bd37123974b2 
linux-2.6-xen-sparse/arch/xen/kernel/evtchn.c
--- a/linux-2.6-xen-sparse/arch/xen/kernel/evtchn.c     Thu Oct  6 10:11:16 2005
+++ b/linux-2.6-xen-sparse/arch/xen/kernel/evtchn.c     Thu Oct  6 10:12:55 2005
@@ -180,14 +180,13 @@
 
 int bind_virq_to_irq(int virq)
 {
-       evtchn_op_t op;
+       evtchn_op_t op = { .cmd = EVTCHNOP_bind_virq };
        int evtchn, irq;
        int cpu = smp_processor_id();
 
        spin_lock(&irq_mapping_update_lock);
 
        if ((irq = per_cpu(virq_to_irq, cpu)[virq]) == -1) {
-               op.cmd              = EVTCHNOP_bind_virq;
                op.u.bind_virq.virq = virq;
                op.u.bind_virq.vcpu = cpu;
                BUG_ON(HYPERVISOR_event_channel_op(&op) != 0);
@@ -212,7 +211,7 @@
 
 void unbind_virq_from_irq(int virq)
 {
-       evtchn_op_t op;
+       evtchn_op_t op = { .cmd = EVTCHNOP_close };
        int cpu    = smp_processor_id();
        int irq    = per_cpu(virq_to_irq, cpu)[virq];
        int evtchn = irq_to_evtchn[irq];
@@ -220,7 +219,6 @@
        spin_lock(&irq_mapping_update_lock);
 
        if (--irq_bindcount[irq] == 0) {
-               op.cmd          = EVTCHNOP_close;
                op.u.close.dom  = DOMID_SELF;
                op.u.close.port = evtchn;
                BUG_ON(HYPERVISOR_event_channel_op(&op) != 0);
@@ -245,14 +243,13 @@
 
 int bind_ipi_to_irq(int ipi)
 {
-       evtchn_op_t op;
+       evtchn_op_t op = { .cmd = EVTCHNOP_bind_ipi };
        int evtchn, irq;
        int cpu = smp_processor_id();
 
        spin_lock(&irq_mapping_update_lock);
 
        if ((evtchn = per_cpu(ipi_to_evtchn, cpu)[ipi]) == -1) {
-               op.cmd = EVTCHNOP_bind_ipi;
                op.u.bind_ipi.vcpu = cpu;
                BUG_ON(HYPERVISOR_event_channel_op(&op) != 0);
                evtchn = op.u.bind_ipi.port;
@@ -278,7 +275,7 @@
 
 void unbind_ipi_from_irq(int ipi)
 {
-       evtchn_op_t op;
+       evtchn_op_t op = { .cmd = EVTCHNOP_close };
        int cpu    = smp_processor_id();
        int evtchn = per_cpu(ipi_to_evtchn, cpu)[ipi];
        int irq    = evtchn_to_irq[evtchn];
@@ -286,7 +283,6 @@
        spin_lock(&irq_mapping_update_lock);
 
        if (--irq_bindcount[irq] == 0) {
-               op.cmd          = EVTCHNOP_close;
                op.u.close.dom  = DOMID_SELF;
                op.u.close.port = evtchn;
                BUG_ON(HYPERVISOR_event_channel_op(&op) != 0);
@@ -324,13 +320,12 @@
 
 void unbind_evtchn_from_irq(unsigned int irq)
 {
-       evtchn_op_t op;
+       evtchn_op_t op = { .cmd = EVTCHNOP_close };
        int evtchn = irq_to_evtchn[irq];
 
        spin_lock(&irq_mapping_update_lock);
 
        if ((--irq_bindcount[irq] == 0) && (evtchn != -1)) {
-               op.cmd          = EVTCHNOP_close;
                op.u.close.dom  = DOMID_SELF;
                op.u.close.port = evtchn;
                BUG_ON(HYPERVISOR_event_channel_op(&op) != 0);
@@ -378,7 +373,7 @@
 /* Rebind an evtchn so that it gets delivered to a specific cpu */
 static void rebind_irq_to_cpu(unsigned irq, unsigned tcpu)
 {
-       evtchn_op_t op;
+       evtchn_op_t op = { .cmd = EVTCHNOP_bind_vcpu };
        int evtchn;
 
        spin_lock(&irq_mapping_update_lock);
@@ -389,7 +384,6 @@
        }
 
        /* Send future instances of this interrupt to other vcpu. */
-       op.cmd = EVTCHNOP_bind_vcpu;
        op.u.bind_vcpu.port = evtchn;
        op.u.bind_vcpu.vcpu = tcpu;
 
@@ -518,10 +512,9 @@
 
 static unsigned int startup_pirq(unsigned int irq)
 {
-       evtchn_op_t op;
+       evtchn_op_t op = { .cmd = EVTCHNOP_bind_pirq };
        int evtchn;
 
-       op.cmd               = EVTCHNOP_bind_pirq;
        op.u.bind_pirq.pirq  = irq;
        /* NB. We are happy to share unless we are probing. */
        op.u.bind_pirq.flags = probing_irq(irq) ? 0 : BIND_PIRQ__WILL_SHARE;
@@ -547,7 +540,7 @@
 
 static void shutdown_pirq(unsigned int irq)
 {
-       evtchn_op_t op;
+       evtchn_op_t op = { .cmd = EVTCHNOP_close };
        int evtchn = irq_to_evtchn[irq];
 
        if (!VALID_EVTCHN(evtchn))
@@ -555,7 +548,6 @@
 
        mask_evtchn(evtchn);
 
-       op.cmd          = EVTCHNOP_close;
        op.u.close.dom  = DOMID_SELF;
        op.u.close.port = evtchn;
        BUG_ON(HYPERVISOR_event_channel_op(&op) != 0);
@@ -666,6 +658,7 @@
                        continue;
 
                /* Get a new binding from Xen. */
+               memset(&op, 0, sizeof(op));
                op.cmd              = EVTCHNOP_bind_virq;
                op.u.bind_virq.virq = virq;
                op.u.bind_virq.vcpu = 0;
@@ -689,6 +682,7 @@
                evtchn_to_irq[evtchn] = -1;
 
                /* Get a new binding from Xen. */
+               memset(&op, 0, sizeof(op));
                op.cmd = EVTCHNOP_bind_ipi;
                op.u.bind_ipi.vcpu = 0;
                BUG_ON(HYPERVISOR_event_channel_op(&op) != 0);
diff -r 4ab4f023a6ce -r bd37123974b2 
linux-2.6-xen-sparse/drivers/xen/blkback/interface.c
--- a/linux-2.6-xen-sparse/drivers/xen/blkback/interface.c      Thu Oct  6 
10:11:16 2005
+++ b/linux-2.6-xen-sparse/drivers/xen/blkback/interface.c      Thu Oct  6 
10:12:55 2005
@@ -68,8 +68,13 @@
 int blkif_map(blkif_t *blkif, unsigned long shared_page, unsigned int evtchn)
 {
        blkif_sring_t *sring;
-       evtchn_op_t op = { .cmd = EVTCHNOP_bind_interdomain };
        int err;
+       evtchn_op_t op = {
+               .cmd = EVTCHNOP_bind_interdomain,
+               .u.bind_interdomain.dom1 = DOMID_SELF,
+               .u.bind_interdomain.dom2 = blkif->domid,
+               .u.bind_interdomain.port1 = 0,
+               .u.bind_interdomain.port2 = evtchn };
 
        if ( (blkif->blk_ring_area = alloc_vm_area(PAGE_SIZE)) == NULL )
                return -ENOMEM;
@@ -80,10 +85,6 @@
                return err;
        }
 
-       op.u.bind_interdomain.dom1 = DOMID_SELF;
-       op.u.bind_interdomain.dom2 = blkif->domid;
-       op.u.bind_interdomain.port1 = 0;
-       op.u.bind_interdomain.port2 = evtchn;
        err = HYPERVISOR_event_channel_op(&op);
        if (err) {
                unmap_frontend_page(blkif);
diff -r 4ab4f023a6ce -r bd37123974b2 
linux-2.6-xen-sparse/drivers/xen/blkfront/blkfront.c
--- a/linux-2.6-xen-sparse/drivers/xen/blkfront/blkfront.c      Thu Oct  6 
10:11:16 2005
+++ b/linux-2.6-xen-sparse/drivers/xen/blkfront/blkfront.c      Thu Oct  6 
10:12:55 2005
@@ -485,8 +485,11 @@
 static int setup_blkring(struct xenbus_device *dev, struct blkfront_info *info)
 {
        blkif_sring_t *sring;
-       evtchn_op_t op = { .cmd = EVTCHNOP_alloc_unbound };
        int err;
+       evtchn_op_t op = {
+               .cmd = EVTCHNOP_alloc_unbound,
+               .u.alloc_unbound.dom = DOMID_SELF,
+               .u.alloc_unbound.remote_dom = info->backend_id };
 
        info->ring_ref = GRANT_INVALID_REF;
 
@@ -508,7 +511,6 @@
        }
        info->ring_ref = err;
 
-       op.u.alloc_unbound.dom = info->backend_id;
        err = HYPERVISOR_event_channel_op(&op);
        if (err) {
                gnttab_end_foreign_access(info->ring_ref, 0);
@@ -518,7 +520,9 @@
                xenbus_dev_error(dev, err, "allocating event channel");
                return err;
        }
+
        blkif_connect(info, op.u.alloc_unbound.port);
+
        return 0;
 }
 
diff -r 4ab4f023a6ce -r bd37123974b2 
linux-2.6-xen-sparse/drivers/xen/blktap/interface.c
--- a/linux-2.6-xen-sparse/drivers/xen/blktap/interface.c       Thu Oct  6 
10:11:16 2005
+++ b/linux-2.6-xen-sparse/drivers/xen/blktap/interface.c       Thu Oct  6 
10:12:55 2005
@@ -68,8 +68,13 @@
 int blkif_map(blkif_t *blkif, unsigned long shared_page, unsigned int evtchn)
 {
        blkif_sring_t *sring;
-       evtchn_op_t op = { .cmd = EVTCHNOP_bind_interdomain };
        int err;
+       evtchn_op_t op = {
+               .cmd = EVTCHNOP_bind_interdomain,
+               .u.bind_interdomain.dom1 = DOMID_SELF,
+               .u.bind_interdomain.dom2 = blkif->domid,
+               .u.bind_interdomain.port1 = 0,
+               .u.bind_interdomain.port2 = evtchn };
 
        if ((blkif->blk_ring_area = alloc_vm_area(PAGE_SIZE)) == NULL)
                return -ENOMEM;
@@ -80,10 +85,6 @@
                return err;
        }
 
-       op.u.bind_interdomain.dom1 = DOMID_SELF;
-       op.u.bind_interdomain.dom2 = blkif->domid;
-       op.u.bind_interdomain.port1 = 0;
-       op.u.bind_interdomain.port2 = evtchn;
        err = HYPERVISOR_event_channel_op(&op);
        if (err) {
                unmap_frontend_page(blkif);
diff -r 4ab4f023a6ce -r bd37123974b2 
linux-2.6-xen-sparse/drivers/xen/netback/interface.c
--- a/linux-2.6-xen-sparse/drivers/xen/netback/interface.c      Thu Oct  6 
10:11:16 2005
+++ b/linux-2.6-xen-sparse/drivers/xen/netback/interface.c      Thu Oct  6 
10:12:55 2005
@@ -177,8 +177,13 @@
 int netif_map(netif_t *netif, unsigned long tx_ring_ref,
              unsigned long rx_ring_ref, unsigned int evtchn)
 {
-       evtchn_op_t op = { .cmd = EVTCHNOP_bind_interdomain };
        int err;
+       evtchn_op_t op = {
+               .cmd = EVTCHNOP_bind_interdomain,
+               .u.bind_interdomain.dom1 = DOMID_SELF,
+               .u.bind_interdomain.dom2 = netif->domid,
+               .u.bind_interdomain.port1 = 0,
+               .u.bind_interdomain.port2 = evtchn };
 
        netif->comms_area = alloc_vm_area(2*PAGE_SIZE);
        if (netif->comms_area == NULL)
@@ -190,10 +195,6 @@
                return err;
        }
 
-       op.u.bind_interdomain.dom1 = DOMID_SELF;
-       op.u.bind_interdomain.dom2 = netif->domid;
-       op.u.bind_interdomain.port1 = 0;
-       op.u.bind_interdomain.port2 = evtchn;
        err = HYPERVISOR_event_channel_op(&op);
        if (err) {
                unmap_frontend_pages(netif);
diff -r 4ab4f023a6ce -r bd37123974b2 
linux-2.6-xen-sparse/drivers/xen/netfront/netfront.c
--- a/linux-2.6-xen-sparse/drivers/xen/netfront/netfront.c      Thu Oct  6 
10:11:16 2005
+++ b/linux-2.6-xen-sparse/drivers/xen/netfront/netfront.c      Thu Oct  6 
10:12:55 2005
@@ -972,8 +972,11 @@
 
 static int setup_device(struct xenbus_device *dev, struct netfront_info *info)
 {
-       evtchn_op_t op = { .cmd = EVTCHNOP_alloc_unbound };
        int err;
+       evtchn_op_t op = {
+               .cmd = EVTCHNOP_alloc_unbound,
+               .u.alloc_unbound.dom = DOMID_SELF,
+               .u.alloc_unbound.remote_dom = info->backend_id };
 
        info->tx_ring_ref = GRANT_INVALID_REF;
        info->rx_ring_ref = GRANT_INVALID_REF;
@@ -1010,13 +1013,14 @@
        }
        info->rx_ring_ref = err;
 
-       op.u.alloc_unbound.dom = info->backend_id;
        err = HYPERVISOR_event_channel_op(&op);
        if (err) {
                xenbus_dev_error(dev, err, "allocating event channel");
                goto out;
        }
+
        connect_device(info, op.u.alloc_unbound.port);
+
        return 0;
 
  out:
diff -r 4ab4f023a6ce -r bd37123974b2 
linux-2.6-xen-sparse/drivers/xen/tpmback/interface.c
--- a/linux-2.6-xen-sparse/drivers/xen/tpmback/interface.c      Thu Oct  6 
10:11:16 2005
+++ b/linux-2.6-xen-sparse/drivers/xen/tpmback/interface.c      Thu Oct  6 
10:12:55 2005
@@ -117,8 +117,13 @@
 int
 tpmif_map(tpmif_t *tpmif, unsigned long shared_page, unsigned int evtchn)
 {
-       evtchn_op_t op = {.cmd = EVTCHNOP_bind_interdomain };
        int err;
+       evtchn_op_t op = {
+               .cmd = EVTCHNOP_bind_interdomain,
+               .u.bind_interdomain.dom1 = DOMID_SELF,
+               .u.bind_interdomain.dom2 = tpmif->domid,
+               .u.bind_interdomain.port1 = 0,
+               .u.bind_interdomain.port2 = evtchn };
 
        if ((tpmif->tx_area = alloc_vm_area(PAGE_SIZE)) == NULL)
                return -ENOMEM;
@@ -129,10 +134,6 @@
                return err;
        }
 
-       op.u.bind_interdomain.dom1 = DOMID_SELF;
-       op.u.bind_interdomain.dom2 = tpmif->domid;
-       op.u.bind_interdomain.port1 = 0;
-       op.u.bind_interdomain.port2 = evtchn;
        err = HYPERVISOR_event_channel_op(&op);
        if (err) {
                unmap_frontend_page(tpmif);
diff -r 4ab4f023a6ce -r bd37123974b2 
linux-2.6-xen-sparse/drivers/xen/tpmfront/tpmfront.c
--- a/linux-2.6-xen-sparse/drivers/xen/tpmfront/tpmfront.c      Thu Oct  6 
10:11:16 2005
+++ b/linux-2.6-xen-sparse/drivers/xen/tpmfront/tpmfront.c      Thu Oct  6 
10:12:55 2005
@@ -244,9 +244,11 @@
 {
        tpmif_tx_interface_t *sring;
        struct tpm_private *tp = &my_private;
-
-       evtchn_op_t op = { .cmd = EVTCHNOP_alloc_unbound };
        int err;
+       evtchn_op_t op = {
+               .cmd = EVTCHNOP_alloc_unbound,
+               .u.alloc_unbound.dom = DOMID_SELF,
+               .u.alloc_unbound.remote_dom = backend_id } ;
 
        sring = (void *)__get_free_page(GFP_KERNEL);
        if (!sring) {
@@ -269,7 +271,6 @@
        }
        info->ring_ref = err;
 
-       op.u.alloc_unbound.dom = backend_id;
        err = HYPERVISOR_event_channel_op(&op);
        if (err) {
                gnttab_end_foreign_access(info->ring_ref, 0);
@@ -278,7 +279,9 @@
                xenbus_dev_error(dev, err, "allocating event channel");
                return err;
        }
+
        tpmif_connect(op.u.alloc_unbound.port, backend_id);
+
        return 0;
 }
 
@@ -439,26 +442,32 @@
        return 0;
 }
 
-static int tpmfront_suspend(struct xenbus_device *dev)
+static int
+tpmfront_suspend(struct xenbus_device *dev)
 {
        struct tpmfront_info *info = dev->data;
        struct tpm_private *tp = &my_private;
-
-       /* lock so no app can send */
+       u32 ctr = 0;
+
+       /* lock, so no app can send */
        down(&suspend_lock);
 
-       while (atomic_read(&tp->tx_busy)) {
-               printk("---- TPMIF: Outstanding request.\n");
-#if 0
+       while (atomic_read(&tp->tx_busy) && ctr <= 25) {
+               if ((ctr % 10) == 0)
+                       printk("INFO: Waiting for outstanding request.\n");
                /*
-                * Would like to wait until the outstanding request
-                * has come back, but this does not work properly, yet.
+                * Wait for a request to be responded to.
                 */
-               interruptible_sleep_on_timeout(&tp->wait_q,
-                                              100);
-#else
-               break;
-#endif
+               interruptible_sleep_on_timeout(&tp->wait_q, 100);
+               ctr++;
+       }
+
+       if (atomic_read(&tp->tx_busy)) {
+               /*
+                * A temporary work-around.
+                */
+               printk("WARNING: Resetting busy flag.");
+               atomic_set(&tp->tx_busy, 0);
        }
 
        unregister_xenbus_watch(&info->watch);
@@ -466,44 +475,34 @@
        kfree(info->backend);
        info->backend = NULL;
 
-       destroy_tpmring(info, tp);
-
        return 0;
 }
 
-static int tpmif_recover(void)
-{
-       return 0;
-}
-
-static int tpmfront_resume(struct xenbus_device *dev)
+static int
+tpmfront_resume(struct xenbus_device *dev)
 {
        struct tpmfront_info *info = dev->data;
-       int err;
-
-       err = talk_to_backend(dev, info);
-       if (!err) {
-               tpmif_recover();
-       }
-
-       /* unlock so apps can resume */
+       int err = talk_to_backend(dev, info);
+
+       /* unlock, so apps can resume sending */
        up(&suspend_lock);
 
        return err;
 }
 
-static void tpmif_connect(u16 evtchn, domid_t domid)
+static void
+tpmif_connect(u16 evtchn, domid_t domid)
 {
        int err = 0;
        struct tpm_private *tp = &my_private;
 
        tp->evtchn = evtchn;
-       tp->backend_id  = domid;
-
-       err = bind_evtchn_to_irqhandler(
-               tp->evtchn,
-               tpmif_int, SA_SAMPLE_RANDOM, "tpmif", tp);
-       if ( err <= 0 ) {
+       tp->backend_id = domid;
+
+       err = bind_evtchn_to_irqhandler(tp->evtchn,
+                                       tpmif_int, SA_SAMPLE_RANDOM, "tpmif",
+                                       tp);
+       if (err <= 0) {
                WPRINTK("bind_evtchn_to_irqhandler failed (err=%d)\n", err);
                return;
        }
@@ -638,7 +637,7 @@
 
                if (NULL == txb) {
                        DPRINTK("txb (i=%d) is NULL. buffers initilized?\n", i);
-                       DPRINTK("Not transmittin anything!\n");
+                       DPRINTK("Not transmitting anything!\n");
                        spin_unlock_irq(&tp->tx_lock);
                        return -EFAULT;
                }
diff -r 4ab4f023a6ce -r bd37123974b2 
linux-2.6-xen-sparse/include/asm-xen/evtchn.h
--- a/linux-2.6-xen-sparse/include/asm-xen/evtchn.h     Thu Oct  6 10:11:16 2005
+++ b/linux-2.6-xen-sparse/include/asm-xen/evtchn.h     Thu Oct  6 10:12:55 2005
@@ -123,9 +123,9 @@
 
 static inline void notify_remote_via_evtchn(int port)
 {
-       evtchn_op_t op;
-       op.cmd = EVTCHNOP_send;
-       op.u.send.local_port = port;
+       evtchn_op_t op = {
+               .cmd = EVTCHNOP_send,
+               .u.send.local_port = port };
        (void)HYPERVISOR_event_channel_op(&op);
 }
 
diff -r 4ab4f023a6ce -r bd37123974b2 tools/examples/network-bridge
--- a/tools/examples/network-bridge     Thu Oct  6 10:11:16 2005
+++ b/tools/examples/network-bridge     Thu Oct  6 10:12:55 2005
@@ -38,22 +38,6 @@
 # Print routes.
 #
 #============================================================================
-
-# Exit if anything goes wrong.
-set -e 
-
-# First arg is the operation.
-OP=$1
-shift
-
-# Pull variables in args in to environment.
-for arg ; do export "${arg}" ; done
-
-bridge=${bridge:-xen-br0}
-netdev=${netdev:-eth0}
-antispoof=${antispoof:-no}
-
-echo "*network $OP bridge=$bridge netdev=$netdev antispoof=$antispoof" >&2
 
 # Gentoo doesn't have ifup/ifdown: define appropriate alternatives
 which ifup >& /dev/null
@@ -65,6 +49,22 @@
         /etc/init.d/net.$1 stop
     }
 fi
+
+# Exit if anything goes wrong.
+set -e 
+
+# First arg is the operation.
+OP=$1
+shift
+
+# Pull variables in args in to environment.
+for arg ; do export "${arg}" ; done
+
+bridge=${bridge:-xen-br0}
+netdev=${netdev:-eth0}
+antispoof=${antispoof:-no}
+
+echo "*network $OP bridge=$bridge netdev=$netdev antispoof=$antispoof" >&2
 
 # Usage: transfer_addrs src dst
 # Copy all IP addresses (including aliases) from device $src to device $dst.
diff -r 4ab4f023a6ce -r bd37123974b2 tools/libxc/xc_evtchn.c
--- a/tools/libxc/xc_evtchn.c   Thu Oct  6 10:11:16 2005
+++ b/tools/libxc/xc_evtchn.c   Thu Oct  6 10:12:55 2005
@@ -33,15 +33,16 @@
 
 
 int xc_evtchn_alloc_unbound(int xc_handle,
+                            u32 remote_dom,
                             u32 dom,
                             int *port)
 {
-    evtchn_op_t op;
     int         rc;
-
-    op.cmd = EVTCHNOP_alloc_unbound;
-    op.u.alloc_unbound.dom  = (domid_t)dom;
-    op.u.alloc_unbound.port = (port != NULL) ? *port : 0;
+    evtchn_op_t op = {
+        .cmd = EVTCHNOP_alloc_unbound,
+        .u.alloc_unbound.remote_dom = (domid_t)remote_dom,
+        .u.alloc_unbound.dom  = (domid_t)dom,
+        .u.alloc_unbound.port = (port != NULL) ? *port : 0 };
 
     if ( (rc = do_evtchn_op(xc_handle, &op)) == 0 )
     {
@@ -59,15 +60,13 @@
                                int *port1,
                                int *port2)
 {
-    evtchn_op_t op;
     int         rc;
-
-    op.cmd = EVTCHNOP_bind_interdomain;
-    op.u.bind_interdomain.dom1  = (domid_t)dom1;
-    op.u.bind_interdomain.dom2  = (domid_t)dom2;
-    op.u.bind_interdomain.port1 = (port1 != NULL) ? *port1 : 0;
-    op.u.bind_interdomain.port2 = (port2 != NULL) ? *port2 : 0;
-
+    evtchn_op_t op = {
+        .cmd = EVTCHNOP_bind_interdomain,
+        .u.bind_interdomain.dom1  = (domid_t)dom1,
+        .u.bind_interdomain.dom2  = (domid_t)dom2,
+        .u.bind_interdomain.port1 = (port1 != NULL) ? *port1 : 0,
+        .u.bind_interdomain.port2 = (port2 != NULL) ? *port2 : 0 };
 
     if ( (rc = do_evtchn_op(xc_handle, &op)) == 0 )
     {
@@ -85,12 +84,11 @@
                         int virq,
                         int *port)
 {
-    evtchn_op_t op;
     int         rc;
-
-    op.cmd = EVTCHNOP_bind_virq;
-    op.u.bind_virq.virq = (u32)virq;
-    op.u.bind_virq.vcpu = 0;
+    evtchn_op_t op = {
+        .cmd = EVTCHNOP_bind_virq,
+        .u.bind_virq.virq = (u32)virq,
+        .u.bind_virq.vcpu = 0 };
 
     if ( (rc = do_evtchn_op(xc_handle, &op)) == 0 )
     {
@@ -106,10 +104,10 @@
                     u32 dom,
                     int port)
 {
-    evtchn_op_t op;
-    op.cmd = EVTCHNOP_close;
-    op.u.close.dom  = (domid_t)dom;
-    op.u.close.port = port;
+    evtchn_op_t op = {
+        .cmd          = EVTCHNOP_close,
+        .u.close.dom  = (domid_t)dom,
+        .u.close.port = port };
     return do_evtchn_op(xc_handle, &op);
 }
 
@@ -117,9 +115,9 @@
 int xc_evtchn_send(int xc_handle,
                    int local_port)
 {
-    evtchn_op_t op;
-    op.cmd = EVTCHNOP_send;
-    op.u.send.local_port = local_port;
+    evtchn_op_t op = {
+        .cmd = EVTCHNOP_send,
+        .u.send.local_port = local_port };
     return do_evtchn_op(xc_handle, &op);
 }
 
@@ -129,13 +127,12 @@
                      int port,
                      xc_evtchn_status_t *status)
 {
-    evtchn_op_t op;
     int         rc;
+    evtchn_op_t op = {
+        .cmd           = EVTCHNOP_status,
+        .u.status.dom  = (domid_t)dom,
+        .u.status.port = port };
 
-    op.cmd = EVTCHNOP_status;
-    op.u.status.dom  = (domid_t)dom;
-    op.u.status.port = port;
-   
     if ( (rc = do_evtchn_op(xc_handle, &op)) == 0 )
         memcpy(status, &op.u.status, sizeof(*status));
     
diff -r 4ab4f023a6ce -r bd37123974b2 tools/libxc/xenctrl.h
--- a/tools/libxc/xenctrl.h     Thu Oct  6 10:11:16 2005
+++ b/tools/libxc/xenctrl.h     Thu Oct  6 10:12:55 2005
@@ -306,13 +306,15 @@
  * well-known port within a domain to receive events on.
  *
  * @parm xc_handle a handle to an open hypervisor interface
- * @parm dom the ID of the domain.  This maybe DOMID_SELF
+ * @parm remote_dom the ID of the domain who will later bind
+ * @parm dom the ID of the local domain (the 'allocatee')
  * @parm port a pointer to a port.  This is an in/out parameter.  If *port is
  *            0, then a new port will be assigned, if port is > 0 then that
  *            port is allocated if the port is unallocated.
  * @return 0 on success, -1 on failure
  */
 int xc_evtchn_alloc_unbound(int xc_handle,
+                            u32 remote_dom,
                             u32 dom,
                             int *port);
 
diff -r 4ab4f023a6ce -r bd37123974b2 tools/python/xen/lowlevel/xc/xc.c
--- a/tools/python/xen/lowlevel/xc/xc.c Thu Oct  6 10:11:16 2005
+++ b/tools/python/xen/lowlevel/xc/xc.c Thu Oct  6 10:12:55 2005
@@ -432,16 +432,16 @@
 {
     XcObject *xc = (XcObject *)self;
 
-    u32 dom;
+    u32 dom = DOMID_SELF, remote_dom;
     int port = 0;
 
-    static char *kwd_list[] = { "dom", "port", NULL };
-
-    if ( !PyArg_ParseTupleAndKeywords(args, kwds, "i|i", kwd_list,
-                                      &dom, &port) )
-        return NULL;
-
-    if ( xc_evtchn_alloc_unbound(xc->xc_handle, dom, &port) != 0 )
+    static char *kwd_list[] = { "remote_dom", "dom", "port", NULL };
+
+    if ( !PyArg_ParseTupleAndKeywords(args, kwds, "i|ii", kwd_list,
+                                      &remote_dom, &dom, &port) )
+        return NULL;
+
+    if ( xc_evtchn_alloc_unbound(xc->xc_handle, remote_dom, dom, &port) != 0 )
         return PyErr_SetFromErrno(xc_error);
 
     return PyInt_FromLong(port);
diff -r 4ab4f023a6ce -r bd37123974b2 tools/python/xen/xend/server/tpmif.py
--- a/tools/python/xen/xend/server/tpmif.py     Thu Oct  6 10:11:16 2005
+++ b/tools/python/xen/xend/server/tpmif.py     Thu Oct  6 10:12:55 2005
@@ -39,9 +39,24 @@
         """@see DevController.getDeviceDetails"""
         
         devid = int(sxp.child_value(config, 'instance', '0'))
-        log.debug("The domain has a TPM with instance %d." % devid)
+        log.info("The domain has a TPM with instance %d." % devid)
 
         back  = { 'instance' : "%i" % devid }
         front = { 'handle' : "%i" % devid }
 
         return (devid, back, front)
+
+    def configuration(self, devid):
+
+        log.info("The configuration method is called.")
+
+        result = DevContoller.configuration(self, devid)
+
+        (instance) = self.readBackend(devif,
+                                      'instance')
+
+        if instance:
+            result.append(['instance', instance])
+            log.info("configuration: instance=%d." % instance)
+
+        return result
diff -r 4ab4f023a6ce -r bd37123974b2 tools/python/xen/xm/main.py
--- a/tools/python/xen/xm/main.py       Thu Oct  6 10:11:16 2005
+++ b/tools/python/xen/xm/main.py       Thu Oct  6 10:12:55 2005
@@ -86,8 +86,8 @@
     shutdown [-w|-a] <DomId>  shutdown a domain
     sysrq   <DomId> <letter>  send a sysrq to a domain
     unpause <DomId>           unpause a paused domain
-    vcpu-enable <DomId> <VCPU>        disable VCPU in a domain
-    vcpu-disable <DomId> <VCPU>       enable VCPU in a domain
+    vcpu-enable <DomId> <VCPU>        enable VCPU in a domain
+    vcpu-disable <DomId> <VCPU>       disable VCPU in a domain
     vcpu-list <DomId>                 get the list of VCPUs for a domain
     vcpu-pin <DomId> <VCpu> <CPUS>    set which cpus a VCPU can use. 
 
diff -r 4ab4f023a6ce -r bd37123974b2 xen/arch/x86/x86_32/mm.c
--- a/xen/arch/x86/x86_32/mm.c  Thu Oct  6 10:11:16 2005
+++ b/xen/arch/x86/x86_32/mm.c  Thu Oct  6 10:12:55 2005
@@ -156,6 +156,7 @@
      */
     if ( (offsetof(struct pfn_info, u.inuse._domain) != 
           (offsetof(struct pfn_info, count_info) + sizeof(u32))) ||
+         ((offsetof(struct pfn_info, count_info) & 7) != 0) ||
          (sizeof(struct pfn_info) != 24) )
     {
         printk("Weird pfn_info layout (%ld,%ld,%d)\n",
diff -r 4ab4f023a6ce -r bd37123974b2 xen/arch/x86/x86_64/mm.c
--- a/xen/arch/x86/x86_64/mm.c  Thu Oct  6 10:11:16 2005
+++ b/xen/arch/x86/x86_64/mm.c  Thu Oct  6 10:12:55 2005
@@ -137,8 +137,10 @@
      * count_info and domain fields must be adjacent, as we perform atomic
      * 64-bit operations on them.
      */
-    if ( (offsetof(struct pfn_info, u.inuse._domain) != 
-          (offsetof(struct pfn_info, count_info) + sizeof(u32))) )
+    if ( ((offsetof(struct pfn_info, u.inuse._domain) != 
+           (offsetof(struct pfn_info, count_info) + sizeof(u32)))) ||
+         ((offsetof(struct pfn_info, count_info) & 7) != 0) ||
+         (sizeof(struct pfn_info) != 40) )
     {
         printk("Weird pfn_info layout (%ld,%ld,%ld)\n",
                offsetof(struct pfn_info, count_info),
diff -r 4ab4f023a6ce -r bd37123974b2 xen/common/event_channel.c
--- a/xen/common/event_channel.c        Thu Oct  6 10:11:16 2005
+++ b/xen/common/event_channel.c        Thu Oct  6 10:12:55 2005
@@ -63,9 +63,18 @@
 static long evtchn_alloc_unbound(evtchn_alloc_unbound_t *alloc)
 {
     struct evtchn *chn;
-    struct domain *d = current->domain;
+    struct domain *d;
     int            port = alloc->port;
+    domid_t        dom = alloc->dom;
     long           rc = 0;
+
+    if ( dom == DOMID_SELF )
+        dom = current->domain->domain_id;
+    else if ( !IS_PRIV(current->domain) )
+        return -EPERM;
+
+    if ( (d = find_domain_by_id(dom)) == NULL )
+        return -ESRCH;
 
     spin_lock(&d->evtchn_lock);
 
@@ -84,11 +93,11 @@
     {
     case ECS_FREE:
         chn->state = ECS_UNBOUND;
-        chn->u.unbound.remote_domid = alloc->dom;
+        chn->u.unbound.remote_domid = alloc->remote_dom;
         break;
 
     case ECS_UNBOUND:
-        if ( chn->u.unbound.remote_domid != alloc->dom )
+        if ( chn->u.unbound.remote_domid != alloc->remote_dom )
             ERROR_EXIT(-EINVAL);
         break;
 
@@ -99,7 +108,10 @@
  out:
     spin_unlock(&d->evtchn_lock);
 
+    put_domain(d);
+
     alloc->port = port;
+
     return rc;
 }
 
diff -r 4ab4f023a6ce -r bd37123974b2 xen/include/asm-x86/mm.h
--- a/xen/include/asm-x86/mm.h  Thu Oct  6 10:11:16 2005
+++ b/xen/include/asm-x86/mm.h  Thu Oct  6 10:12:55 2005
@@ -22,9 +22,6 @@
     /* Each frame can be threaded onto a doubly-linked list. */
     struct list_head list;
 
-    /* Timestamp from 'TLB clock', used to reduce need for safety flushes. */
-    u32 tlbflush_timestamp;
-
     /* Reference count and various PGC_xxx flags and fields. */
     u32 count_info;
 
@@ -37,17 +34,20 @@
             u32 _domain; /* pickled format */
             /* Type reference count and various PGT_xxx flags and fields. */
             unsigned long type_info;
-        } inuse;
+        } __attribute__ ((packed)) inuse;
 
         /* Page is on a free list: ((count_info & PGC_count_mask) == 0). */
         struct {
+            /* Order-size of the free chunk this page is the head of. */
+            u32 order;
             /* Mask of possibly-tainted TLBs. */
             cpumask_t cpumask;
-            /* Order-size of the free chunk this page is the head of. */
-            u8 order;
-        } free;
+        } __attribute__ ((packed)) free;
 
     } u;
+
+    /* Timestamp from 'TLB clock', used to reduce need for safety flushes. */
+    u32 tlbflush_timestamp;
 };
 
  /* The following page types are MUTUALLY EXCLUSIVE. */
diff -r 4ab4f023a6ce -r bd37123974b2 xen/include/public/event_channel.h
--- a/xen/include/public/event_channel.h        Thu Oct  6 10:11:16 2005
+++ b/xen/include/public/event_channel.h        Thu Oct  6 10:12:55 2005
@@ -10,14 +10,16 @@
 #define __XEN_PUBLIC_EVENT_CHANNEL_H__
 
 /*
- * EVTCHNOP_alloc_unbound: Prepare a local port for binding to <dom>.
- * <port> may be wildcarded by setting to zero, in which case a fresh port
- * will be allocated, and the field filled in on return.
+ * EVTCHNOP_alloc_unbound: Allocate a port in <dom> for later binding to
+ * <remote_dom>. <port> may be wildcarded by setting to zero, in which case a
+ * fresh port will be allocated, and the field filled in on return.
+ * NOTES:
+ *  1. If the caller is unprivileged then <dom> must be DOMID_SELF.
  */
 #define EVTCHNOP_alloc_unbound    6
 typedef struct evtchn_alloc_unbound {
     /* IN parameters */
-    domid_t dom;
+    domid_t dom, remote_dom;
     /* IN/OUT parameters */
     u32     port;
 } evtchn_alloc_unbound_t;

_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.