Index: linux-irq-work/arch/powerpc/kernel/irq.c =================================================================== --- linux-irq-work.orig/arch/powerpc/kernel/irq.c 2006-07-01 15:25:11.000000000 +1000 +++ linux-irq-work/arch/powerpc/kernel/irq.c 2006-07-01 15:25:14.000000000 +1000 @@ -219,15 +219,19 @@ curtp = current_thread_info(); irqtp = hardirq_ctx[smp_processor_id()]; if (curtp != irqtp) { + struct irq_desc *desc = irq_desc + irq; + void *handler = desc->handle_irq; + if (handler == NULL) + handler = &__do_IRQ; irqtp->task = curtp->task; irqtp->flags = 0; - call___do_IRQ(irq, regs, irqtp); + call_handle_irq(irq, desc, regs, irqtp, handler); irqtp->task = NULL; if (irqtp->flags) set_bits(irqtp->flags, &curtp->flags); } else #endif - __do_IRQ(irq, regs); + generic_handle_irq(irq, regs); } else if (irq != -2) /* That's not SMP safe ... but who cares ? */ ppc_spurious_interrupts++; Index: linux-irq-work/arch/powerpc/kernel/misc_64.S =================================================================== --- linux-irq-work.orig/arch/powerpc/kernel/misc_64.S 2006-07-01 15:25:11.000000000 +1000 +++ linux-irq-work/arch/powerpc/kernel/misc_64.S 2006-07-01 15:25:14.000000000 +1000 @@ -51,12 +51,14 @@ mtlr r0 blr -_GLOBAL(call___do_IRQ) +_GLOBAL(call_handle_irq) + ld r8,0(r7) mflr r0 std r0,16(r1) - stdu r1,THREAD_SIZE-112(r5) - mr r1,r5 - bl .__do_IRQ + mtctr r8 + stdu r1,THREAD_SIZE-112(r6) + mr r1,r6 + bctrl ld r1,0(r1) ld r0,16(r1) mtlr r0 Index: linux-irq-work/include/asm-powerpc/irq.h =================================================================== --- linux-irq-work.orig/include/asm-powerpc/irq.h 2006-07-01 15:25:11.000000000 +1000 +++ linux-irq-work/include/asm-powerpc/irq.h 2006-07-01 15:25:14.000000000 +1000 @@ -579,8 +579,8 @@ extern void irq_ctx_init(void); extern void call_do_softirq(struct thread_info *tp); -extern int call___do_IRQ(int irq, struct pt_regs *regs, - struct thread_info *tp); +extern int call_handle_irq(int irq, void *p1, void *p2, + struct thread_info *tp, void *func); #else #define irq_ctx_init()