do_entInt(unsigned long type, unsigned long vector,
          unsigned long la_ptr, struct pt_regs *regs)
 {
+       struct pt_regs *old_regs;
        switch (type) {
        case 0:
 #ifdef CONFIG_SMP
                alpha_mv.machine_check(vector, la_ptr, regs);
                return;
        case 3:
-               alpha_mv.device_interrupt(vector, regs);
+               old_regs = set_irq_regs(regs);
+               alpha_mv.device_interrupt(vector);
+               set_irq_regs(old_regs);
                return;
        case 4:
                perf_irq(la_ptr, regs);
 
 
 #if defined(IACK_SC)
 void
-isa_device_interrupt(unsigned long vector, struct pt_regs *regs)
+isa_device_interrupt(unsigned long vector)
 {
        /*
         * Generate a PCI interrupt acknowledge cycle.  The PIC will
         */
        int j = *(vuip) IACK_SC;
        j &= 0xff;
-       handle_irq(j, regs);
+       handle_irq(j, get_irq_regs());
 }
 #endif
 
 
 
 #define RTC_IRQ    8
 
-extern void isa_device_interrupt(unsigned long, struct pt_regs *);
+extern void isa_device_interrupt(unsigned long);
 extern void isa_no_iack_sc_device_interrupt(unsigned long, struct pt_regs *);
-extern void srm_device_interrupt(unsigned long, struct pt_regs *);
-extern void pyxis_device_interrupt(unsigned long, struct pt_regs *);
+extern void srm_device_interrupt(unsigned long);
+extern void pyxis_device_interrupt(unsigned long);
 
 extern struct irqaction timer_irqaction;
 extern struct irqaction isa_cascade_irqaction;
 
 };
 
 void 
-pyxis_device_interrupt(unsigned long vector, struct pt_regs *regs)
+pyxis_device_interrupt(unsigned long vector)
 {
        unsigned long pld;
        unsigned int i;
                i = ffz(~pld);
                pld &= pld - 1; /* clear least bit set */
                if (i == 7)
-                       isa_device_interrupt(vector, regs);
+                       isa_device_interrupt(vector);
                else
-                       handle_irq(16+i, regs);
+                       handle_irq(16+i, get_irq_regs());
        }
 }
 
 
 }
 
 void 
-srm_device_interrupt(unsigned long vector, struct pt_regs * regs)
+srm_device_interrupt(unsigned long vector)
 {
        int irq = (vector - 0x800) >> 4;
-       handle_irq(irq, regs);
+       handle_irq(irq, get_irq_regs());
 }
 
 };
 
 static void
-alcor_device_interrupt(unsigned long vector, struct pt_regs *regs)
+alcor_device_interrupt(unsigned long vector)
 {
        unsigned long pld;
        unsigned int i;
                i = ffz(~pld);
                pld &= pld - 1; /* clear least bit set */
                if (i == 31) {
-                       isa_device_interrupt(vector, regs);
+                       isa_device_interrupt(vector);
                } else {
-                       handle_irq(16 + i, regs);
+                       handle_irq(16 + i, get_irq_regs());
                }
        }
 }
 
 };
 
 static void 
-cabriolet_device_interrupt(unsigned long v, struct pt_regs *r)
+cabriolet_device_interrupt(unsigned long v)
 {
        unsigned long pld;
        unsigned int i;
                i = ffz(~pld);
                pld &= pld - 1; /* clear least bit set */
                if (i == 4) {
-                       isa_device_interrupt(v, r);
+                       isa_device_interrupt(v);
                } else {
-                       handle_irq(16 + i, r);
+                       handle_irq(16 + i, get_irq_regs());
                }
        }
 }
 
 static void __init
-common_init_irq(void (*srm_dev_int)(unsigned long v, struct pt_regs *r))
+common_init_irq(void (*srm_dev_int)(unsigned long v))
 {
        init_i8259a_irqs();
 
    too invasive though.  */
 
 static void
-pc164_srm_device_interrupt(unsigned long v, struct pt_regs *r)
+pc164_srm_device_interrupt(unsigned long v)
 {
        __min_ipl = getipl();
-       srm_device_interrupt(v, r);
+       srm_device_interrupt(v);
        __min_ipl = 0;
 }
 
 static void
-pc164_device_interrupt(unsigned long v, struct pt_regs *r)
+pc164_device_interrupt(unsigned long v)
 {
        __min_ipl = getipl();
-       cabriolet_device_interrupt(v, r);
+       cabriolet_device_interrupt(v);
        __min_ipl = 0;
 }
 
 
 };
 
 static void
-dp264_device_interrupt(unsigned long vector, struct pt_regs * regs)
+dp264_device_interrupt(unsigned long vector)
 {
 #if 1
        printk("dp264_device_interrupt: NOT IMPLEMENTED YET!! \n");
                i = ffz(~pld);
                pld &= pld - 1; /* clear least bit set */
                if (i == 55)
-                       isa_device_interrupt(vector, regs);
+                       isa_device_interrupt(vector);
                else
-                       handle_irq(16 + i, 16 + i, regs);
+                       handle_irq(16 + i, get_irq_regs());
 #if 0
                TSUNAMI_cchip->dir0.csr = 1UL << i; mb();
                tmp = TSUNAMI_cchip->dir0.csr;
 }
 
 static void 
-dp264_srm_device_interrupt(unsigned long vector, struct pt_regs * regs)
+dp264_srm_device_interrupt(unsigned long vector)
 {
        int irq;
 
        if (irq >= 32)
                irq -= 16;
 
-       handle_irq(irq, regs);
+       handle_irq(irq, get_irq_regs());
 }
 
 static void 
-clipper_srm_device_interrupt(unsigned long vector, struct pt_regs * regs)
+clipper_srm_device_interrupt(unsigned long vector)
 {
        int irq;
 
         *
         * Eg IRQ 24 is DRIR bit 8, etc, etc
         */
-       handle_irq(irq, regs);
+       handle_irq(irq, get_irq_regs());
 }
 
 static void __init
 
 };
 
 static void 
-eb64p_device_interrupt(unsigned long vector, struct pt_regs *regs)
+eb64p_device_interrupt(unsigned long vector)
 {
        unsigned long pld;
        unsigned int i;
                pld &= pld - 1; /* clear least bit set */
 
                if (i == 5) {
-                       isa_device_interrupt(vector, regs);
+                       isa_device_interrupt(vector);
                } else {
-                       handle_irq(16 + i, regs);
+                       handle_irq(16 + i, get_irq_regs());
                }
        }
 }
 
 };
 
 static void
-eiger_device_interrupt(unsigned long vector, struct pt_regs * regs)
+eiger_device_interrupt(unsigned long vector)
 {
        unsigned intstatus;
 
                 * despatch an interrupt if it's set.
                 */
 
-               if (intstatus & 8) handle_irq(16+3, regs);
-               if (intstatus & 4) handle_irq(16+2, regs);
-               if (intstatus & 2) handle_irq(16+1, regs);
-               if (intstatus & 1) handle_irq(16+0, regs);
+               if (intstatus & 8) handle_irq(16+3, get_irq_regs());
+               if (intstatus & 4) handle_irq(16+2, get_irq_regs());
+               if (intstatus & 2) handle_irq(16+1, get_irq_regs());
+               if (intstatus & 1) handle_irq(16+0, get_irq_regs());
        } else {
-               isa_device_interrupt(vector, regs);
+               isa_device_interrupt(vector);
        }
 }
 
 static void
-eiger_srm_device_interrupt(unsigned long vector, struct pt_regs * regs)
+eiger_srm_device_interrupt(unsigned long vector)
 {
        int irq = (vector - 0x800) >> 4;
-       handle_irq(irq, regs);
+       handle_irq(irq, get_irq_regs());
 }
 
 static void __init
 
 };
 
 static void 
-jensen_device_interrupt(unsigned long vector, struct pt_regs * regs)
+jensen_device_interrupt(unsigned long vector)
 {
        int irq;
 
           if (cc - last_msg > ((JENSEN_CYCLES_PER_SEC) * 3) ||
              irq != last_irq) {
                 printk(KERN_CRIT " irq %d count %d cc %u @ %lx\n",
-                       irq, count, cc-last_cc, regs->pc);
+                       irq, count, cc-last_cc, get_irq_regs()->pc);
                 count = 0;
                 last_msg = cc;
                 last_irq = irq;
         }
 #endif
 
-       handle_irq(irq, regs);
+       handle_irq(irq, get_irq_regs());
 }
 
 static void __init
 
  * Interrupt handling.
  */
 static void 
-io7_device_interrupt(unsigned long vector, struct pt_regs * regs)
+io7_device_interrupt(unsigned long vector)
 {
        unsigned int pid;
        unsigned int irq;
        irq &= MARVEL_IRQ_VEC_IRQ_MASK;         /* not too many bits */
        irq |= pid << MARVEL_IRQ_VEC_PE_SHIFT;  /* merge the pid     */
 
-       handle_irq(irq, regs);
+       handle_irq(irq, get_irq_regs());
 }
 
 static volatile unsigned long *
 
 
 
 static void 
-miata_srm_device_interrupt(unsigned long vector, struct pt_regs * regs)
+miata_srm_device_interrupt(unsigned long vector)
 {
        int irq;
 
        if (irq >= 16)
                irq = irq + 8;
 
-       handle_irq(irq, regs);
+       handle_irq(irq, get_irq_regs());
 }
 
 static void __init
 
 };
 
 static void 
-mikasa_device_interrupt(unsigned long vector, struct pt_regs *regs)
+mikasa_device_interrupt(unsigned long vector)
 {
        unsigned long pld;
        unsigned int i;
                i = ffz(~pld);
                pld &= pld - 1; /* clear least bit set */
                if (i < 16) {
-                       isa_device_interrupt(vector, regs);
+                       isa_device_interrupt(vector);
                } else {
-                       handle_irq(i, regs);
+                       handle_irq(i, get_irq_regs());
                }
        }
 }
 
 };
 
 static void 
-noritake_device_interrupt(unsigned long vector, struct pt_regs *regs)
+noritake_device_interrupt(unsigned long vector)
 {
        unsigned long pld;
        unsigned int i;
                i = ffz(~pld);
                pld &= pld - 1; /* clear least bit set */
                if (i < 16) {
-                       isa_device_interrupt(vector, regs);
+                       isa_device_interrupt(vector);
                } else {
-                       handle_irq(i, regs);
+                       handle_irq(i, get_irq_regs());
                }
        }
 }
 
 static void 
-noritake_srm_device_interrupt(unsigned long vector, struct pt_regs * regs)
+noritake_srm_device_interrupt(unsigned long vector)
 {
        int irq;
 
        if (irq >= 16)
                irq = irq + 1;
 
-       handle_irq(irq, regs);
+       handle_irq(irq, get_irq_regs());
 }
 
 static void __init
 
 };
 
 static void 
-rawhide_srm_device_interrupt(unsigned long vector, struct pt_regs * regs)
+rawhide_srm_device_interrupt(unsigned long vector)
 {
        int irq;
 
        /* Adjust by which hose it is from.  */
        irq -= ((irq + 16) >> 2) & 0x38;
 
-       handle_irq(irq, regs);
+       handle_irq(irq, get_irq_regs());
 }
 
 static void __init
 
 };
 
 static void 
-rx164_device_interrupt(unsigned long vector, struct pt_regs *regs)
+rx164_device_interrupt(unsigned long vector)
 {
        unsigned long pld;
        volatile unsigned int *dirr;
                i = ffz(~pld);
                pld &= pld - 1; /* clear least bit set */
                if (i == 20) {
-                       isa_no_iack_sc_device_interrupt(vector, regs);
+                       isa_no_iack_sc_device_interrupt(vector, get_irq_regs());
                } else {
-                       handle_irq(16+i, regs);
+                       handle_irq(16+i, get_irq_regs());
                }
        }
 }
 
 };
 
 static void 
-sable_lynx_srm_device_interrupt(unsigned long vector, struct pt_regs * regs)
+sable_lynx_srm_device_interrupt(unsigned long vector)
 {
        /* Note that the vector reported by the SRM PALcode corresponds
           to the interrupt mask bits, but we have to manage via the
        printk("%s: vector 0x%lx bit 0x%x irq 0x%x\n",
               __FUNCTION__, vector, bit, irq);
 #endif
-       handle_irq(irq, regs);
+       handle_irq(irq, get_irq_regs());
 }
 
 static void __init
 
 };
 
 static void
-takara_device_interrupt(unsigned long vector, struct pt_regs *regs)
+takara_device_interrupt(unsigned long vector)
 {
        unsigned intstatus;
 
                 * despatch an interrupt if it's set.
                 */
 
-               if (intstatus & 8) handle_irq(16+3, regs);
-               if (intstatus & 4) handle_irq(16+2, regs);
-               if (intstatus & 2) handle_irq(16+1, regs);
-               if (intstatus & 1) handle_irq(16+0, regs);
+               if (intstatus & 8) handle_irq(16+3, get_irq_regs());
+               if (intstatus & 4) handle_irq(16+2, get_irq_regs());
+               if (intstatus & 2) handle_irq(16+1, get_irq_regs());
+               if (intstatus & 1) handle_irq(16+0, get_irq_regs());
        } else {
-               isa_device_interrupt (vector, regs);
+               isa_device_interrupt (vector);
        }
 }
 
 static void 
-takara_srm_device_interrupt(unsigned long vector, struct pt_regs * regs)
+takara_srm_device_interrupt(unsigned long vector)
 {
        int irq = (vector - 0x800) >> 4;
-       handle_irq(irq, regs);
+       handle_irq(irq, get_irq_regs());
 }
 
 static void __init
 
 }
 
 static void
-titan_device_interrupt(unsigned long vector, struct pt_regs * regs)
+titan_device_interrupt(unsigned long vector)
 {
        printk("titan_device_interrupt: NOT IMPLEMENTED YET!! \n");
 }
 
 static void 
-titan_srm_device_interrupt(unsigned long vector, struct pt_regs * regs)
+titan_srm_device_interrupt(unsigned long vector)
 {
        int irq;
 
        irq = (vector - 0x800) >> 4;
-       handle_irq(irq, regs);
+       handle_irq(irq, get_irq_regs());
 }
 
 
 void
 titan_dispatch_irqs(u64 mask, struct pt_regs *regs)
 {
+       struct pt_regs *old_regs;
        unsigned long vector;
 
        /*
         */
        mask &= titan_cpu_irq_affinity[smp_processor_id()];
 
+       old_regs = set_irq_regs(regs);
        /*
         * Dispatch all requested interrupts 
         */
                vector = 0x900 + (vector << 4); /* convert to SRM vector */
                
                /* dispatch it */
-               alpha_mv.device_interrupt(vector, regs);
+               alpha_mv.device_interrupt(vector);
        }
+       set_irq_regs(old_regs);
 }
   
 \f
 
 }
 
 static void 
-wildfire_device_interrupt(unsigned long vector, struct pt_regs * regs)
+wildfire_device_interrupt(unsigned long vector)
 {
        int irq;
 
         * bits 5-0:    irq in PCA
         */
 
-       handle_irq(irq, regs);
+       handle_irq(irq, get_irq_regs());
        return;
 }
 
 
 
        void (*update_irq_hw)(unsigned long, unsigned long, int);
        void (*ack_irq)(unsigned long);
-       void (*device_interrupt)(unsigned long vector, struct pt_regs *regs);
+       void (*device_interrupt)(unsigned long vector);
        void (*machine_check)(u64 vector, u64 la, struct pt_regs *regs);
 
        void (*smp_callin)(void);