/* do_IRQ handles all hardware IRQ's. Decoded IRQs should not come via this function. Instead, they should provide their own 'handler'  */
asmlinkage void __exception asm_do_IRQ(unsigned int irq, struct pt_regs *regs)
/* do_IRQ handles all hardware IRQ's. Decoded IRQs should not come via this function. Instead, they should provide their own 'handler'  */
asmlinkage void __exception asm_do_IRQ(unsigned int irq, struct pt_regs *regs)
{
	struct pt_regs *old_regs = set_irq_regs(regs);
	irq_enter();
	if (unlikely(irq >= NR_IRQS)) {
		if (printk_ratelimit())
			printk(KERN_WARNING "Bad IRQ%u\n", irq);
		ack_bad_irq(irq);
	} else {
		generic_handle_irq(irq);
	}
	irq_finish(irq);
	irq_exit();
	set_irq_regs(old_regs);
}