/* do_IRQ handles all normal device IRQ's (the special SMP cross-CPU interrupts have their own specific handlers).  */
unsigned int __irq_entry do_IRQ(struct pt_regs *regs)
/* do_IRQ handles all normal device IRQ's (the special SMP cross-CPU interrupts have their own specific handlers).  */
unsigned int __irq_entry do_IRQ(struct pt_regs *regs)
{
	struct pt_regs *old_regs = set_irq_regs(regs);
	unsigned vector = ~regs->orig_ax;
	unsigned irq;
	exit_idle();
	irq_enter();
	irq = __get_cpu_var(vector_irq)[vector];
	if (!handle_irq(irq, regs)) {
		ack_APIC_irq();
		if (printk_ratelimit())
			pr_emerg("%s: %d.%d No irq handler for vector (irq %d)\n",
				__func__, smp_processor_id(), vector, irq);
	}
	irq_exit();
	set_irq_regs(old_regs);
	return 1;
}