Mailing List Archive

Mirror changes to x86 un/mask_evtchn
# HG changeset patch
# User djm@kirby.fc.hp.com
# Node ID 5eb7ca1878bdf872d9d2d5c18fd42d7d3f9bedc3
# Parent 25d0ba51338eb8dd6446cc2083ee34d89a6f6fcf
Mirror changes to x86 un/mask_evtchn

diff -r 25d0ba51338e -r 5eb7ca1878bd linux-2.6-xen-sparse/arch/ia64/xen/drivers/evtchn_ia64.c
--- a/linux-2.6-xen-sparse/arch/ia64/xen/drivers/evtchn_ia64.c Wed Dec 14 12:52:02 2005
+++ b/linux-2.6-xen-sparse/arch/ia64/xen/drivers/evtchn_ia64.c Wed Dec 14 19:02:37 2005
@@ -44,6 +44,47 @@
* arrays. The lock does not need to be acquired to read the mapping tables.
*/
static spinlock_t irq_mapping_update_lock;
+
+void mask_evtchn(int port)
+{
+ shared_info_t *s = HYPERVISOR_shared_info;
+ synch_set_bit(port, &s->evtchn_mask[0]);
+}
+EXPORT_SYMBOL(mask_evtchn);
+
+void unmask_evtchn(int port)
+{
+ shared_info_t *s = HYPERVISOR_shared_info;
+ unsigned int cpu = smp_processor_id();
+ vcpu_info_t *vcpu_info = &s->vcpu_info[cpu];
+
+#if 0 // FIXME: diverged from x86 evtchn.c
+ /* Slow path (hypercall) if this is a non-local port. */
+ if (unlikely(cpu != cpu_from_evtchn(port))) {
+ evtchn_op_t op = { .cmd = EVTCHNOP_unmask,
+ .u.unmask.port = port };
+ (void)HYPERVISOR_event_channel_op(&op);
+ return;
+ }
+#endif
+
+ synch_clear_bit(port, &s->evtchn_mask[0]);
+
+ /*
+ * The following is basically the equivalent of 'hw_resend_irq'. Just
+ * like a real IO-APIC we 'lose the interrupt edge' if the channel is
+ * masked.
+ */
+ if (synch_test_bit(port, &s->evtchn_pending[0]) &&
+ !synch_test_and_set_bit(port / BITS_PER_LONG,
+ &vcpu_info->evtchn_pending_sel)) {
+ vcpu_info->evtchn_upcall_pending = 1;
+ if (!vcpu_info->evtchn_upcall_mask)
+ force_evtchn_callback();
+ }
+}
+EXPORT_SYMBOL(unmask_evtchn);
+

#define unbound_irq(e) (VALID_EVTCHN(e) && (!evtchns[(e)].opened))
int bind_virq_to_irqhandler(

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