[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-changelog] Ensure that all fields of evtchn_op_t are initialised when
# HG changeset patch # User kaf24@xxxxxxxxxxxxxxxxxxxx # Node ID ba0bbf9d29fffbef248beff9336be79f8f0ce45b # Parent c344d6944d2fb499b26da2a4dfc7bb48e8cc0b61 Ensure that all fields of evtchn_op_t are initialised when making an event_channel_op hypercall. Stefan Berger gets the credit for diagnosing nasty domU driver problems that were a result of garbage fields. Signed-off-by: Stefan Berger <stefanb@xxxxxxxxxx> Signed-off-by: Keir Fraser <keir@xxxxxxxxxxxxx> diff -r c344d6944d2f -r ba0bbf9d29ff linux-2.6-xen-sparse/arch/xen/kernel/evtchn.c --- a/linux-2.6-xen-sparse/arch/xen/kernel/evtchn.c Wed Oct 5 23:16:29 2005 +++ b/linux-2.6-xen-sparse/arch/xen/kernel/evtchn.c Thu Oct 6 09:42:32 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 c344d6944d2f -r ba0bbf9d29ff linux-2.6-xen-sparse/drivers/xen/blkback/interface.c --- a/linux-2.6-xen-sparse/drivers/xen/blkback/interface.c Wed Oct 5 23:16:29 2005 +++ b/linux-2.6-xen-sparse/drivers/xen/blkback/interface.c Thu Oct 6 09:42:32 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 c344d6944d2f -r ba0bbf9d29ff linux-2.6-xen-sparse/drivers/xen/blkfront/blkfront.c --- a/linux-2.6-xen-sparse/drivers/xen/blkfront/blkfront.c Wed Oct 5 23:16:29 2005 +++ b/linux-2.6-xen-sparse/drivers/xen/blkfront/blkfront.c Thu Oct 6 09:42:32 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; 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,9 +511,6 @@ } info->ring_ref = err; - op.cmd = EVTCHNOP_alloc_unbound; - op.u.alloc_unbound.dom = DOMID_SELF; - op.u.alloc_unbound.remote_dom = info->backend_id; err = HYPERVISOR_event_channel_op(&op); if (err) { gnttab_end_foreign_access(info->ring_ref, 0); diff -r c344d6944d2f -r ba0bbf9d29ff linux-2.6-xen-sparse/drivers/xen/blktap/interface.c --- a/linux-2.6-xen-sparse/drivers/xen/blktap/interface.c Wed Oct 5 23:16:29 2005 +++ b/linux-2.6-xen-sparse/drivers/xen/blktap/interface.c Thu Oct 6 09:42:32 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 c344d6944d2f -r ba0bbf9d29ff linux-2.6-xen-sparse/drivers/xen/netback/interface.c --- a/linux-2.6-xen-sparse/drivers/xen/netback/interface.c Wed Oct 5 23:16:29 2005 +++ b/linux-2.6-xen-sparse/drivers/xen/netback/interface.c Thu Oct 6 09:42:32 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 c344d6944d2f -r ba0bbf9d29ff linux-2.6-xen-sparse/drivers/xen/netfront/netfront.c --- a/linux-2.6-xen-sparse/drivers/xen/netfront/netfront.c Wed Oct 5 23:16:29 2005 +++ b/linux-2.6-xen-sparse/drivers/xen/netfront/netfront.c Thu Oct 6 09:42:32 2005 @@ -972,8 +972,11 @@ static int setup_device(struct xenbus_device *dev, struct netfront_info *info) { - evtchn_op_t op; 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,9 +1013,6 @@ } info->rx_ring_ref = err; - op.cmd = EVTCHNOP_alloc_unbound; - op.u.alloc_unbound.dom = DOMID_SELF; - op.u.alloc_unbound.remote_dom = info->backend_id; err = HYPERVISOR_event_channel_op(&op); if (err) { xenbus_dev_error(dev, err, "allocating event channel"); diff -r c344d6944d2f -r ba0bbf9d29ff linux-2.6-xen-sparse/drivers/xen/tpmback/interface.c --- a/linux-2.6-xen-sparse/drivers/xen/tpmback/interface.c Wed Oct 5 23:16:29 2005 +++ b/linux-2.6-xen-sparse/drivers/xen/tpmback/interface.c Thu Oct 6 09:42:32 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 c344d6944d2f -r ba0bbf9d29ff linux-2.6-xen-sparse/drivers/xen/tpmfront/tpmfront.c --- a/linux-2.6-xen-sparse/drivers/xen/tpmfront/tpmfront.c Wed Oct 5 23:16:29 2005 +++ b/linux-2.6-xen-sparse/drivers/xen/tpmfront/tpmfront.c Thu Oct 6 09:42:32 2005 @@ -244,8 +244,11 @@ { tpmif_tx_interface_t *sring; struct tpm_private *tp = &my_private; - evtchn_op_t op; 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) { @@ -268,9 +271,6 @@ } info->ring_ref = err; - op.cmd = EVTCHNOP_alloc_unbound; - op.u.alloc_unbound.dom = DOMID_SELF; - op.u.alloc_unbound.remote_dom = backend_id; err = HYPERVISOR_event_channel_op(&op); if (err) { gnttab_end_foreign_access(info->ring_ref, 0); diff -r c344d6944d2f -r ba0bbf9d29ff linux-2.6-xen-sparse/include/asm-xen/evtchn.h --- a/linux-2.6-xen-sparse/include/asm-xen/evtchn.h Wed Oct 5 23:16:29 2005 +++ b/linux-2.6-xen-sparse/include/asm-xen/evtchn.h Thu Oct 6 09:42:32 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 c344d6944d2f -r ba0bbf9d29ff tools/libxc/xc_evtchn.c --- a/tools/libxc/xc_evtchn.c Wed Oct 5 23:16:29 2005 +++ b/tools/libxc/xc_evtchn.c Thu Oct 6 09:42:32 2005 @@ -37,13 +37,12 @@ u32 dom, int *port) { - evtchn_op_t op; int rc; - - op.cmd = EVTCHNOP_alloc_unbound; - op.u.alloc_unbound.remote_dom = (domid_t)remote_dom; - 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 ) { @@ -61,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 ) { @@ -87,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 ) { @@ -108,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); } @@ -119,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); } @@ -131,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)); _______________________________________________ Xen-changelog mailing list Xen-changelog@xxxxxxxxxxxxxxxxxxx http://lists.xensource.com/xen-changelog
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |