return raw_irqs_disabled_flags(regs->flags);
 }
 
-static inline void xen_do_IRQ(int irq, struct pt_regs *regs)
-{
-       regs->orig_ax = ~irq;
-       do_IRQ(regs);
-}
-
 #endif /* _ASM_X86_XEN_EVENTS_H */
 
        (void)HYPERVISOR_xen_version(0, NULL);
 }
 
-static void __init __xen_init_IRQ(void)
-{
-       int i;
-
-       /* Create identity vector->irq map */
-       for(i = 0; i < NR_VECTORS; i++) {
-               int cpu;
-
-               for_each_possible_cpu(cpu)
-                       per_cpu(vector_irq, cpu)[i] = i;
-       }
-
-       xen_init_IRQ();
-}
-
 static unsigned long xen_save_fl(void)
 {
        struct vcpu_info *vcpu;
 }
 
 static const struct pv_irq_ops xen_irq_ops __initdata = {
-       .init_IRQ = __xen_init_IRQ,
+       .init_IRQ = xen_init_IRQ,
 
        .save_fl = PV_CALLEE_SAVE(xen_save_fl),
        .restore_fl = PV_CALLEE_SAVE(xen_restore_fl),
 
 
 #include <asm/ptrace.h>
 #include <asm/irq.h>
+#include <asm/idle.h>
 #include <asm/sync_bitops.h>
 #include <asm/xen/hypercall.h>
 #include <asm/xen/hypervisor.h>
 }
 
 
+static void xen_do_irq(unsigned irq, struct pt_regs *regs)
+{
+       struct pt_regs *old_regs = set_irq_regs(regs);
+
+       if (WARN_ON(irq == -1))
+               return;
+
+       exit_idle();
+       irq_enter();
+
+       //printk("cpu %d handling irq %d\n", smp_processor_id(), info->irq);
+       handle_irq(irq, regs);
+
+       irq_exit();
+
+       set_irq_regs(old_regs);
+}
+
 /*
  * Search the CPUs pending events bitmasks.  For each one found, map
  * the event number to an irq, and feed it into do_IRQ() for
                                int port = (word_idx * BITS_PER_LONG) + bit_idx;
                                int irq = evtchn_to_irq[port];
 
-                               if (irq != -1)
-                                       xen_do_IRQ(irq, regs);
+                               xen_do_irq(irq, regs);
                        }
                }