X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=arch%2Fi386%2Fkernel%2Firq.c;h=7226f9659b9a4532573e89681893de2ee3699260;hb=97bf2856c6014879bd04983a3e9dfcdac1e7fe85;hp=5fe547cd8f9fe48ab7d2e3dae930283b6baff70b;hpb=67da514125f23d27bd45d41e330ef14b6206fe69;p=linux-2.6.git diff --git a/arch/i386/kernel/irq.c b/arch/i386/kernel/irq.c index 5fe547cd8..7226f9659 100644 --- a/arch/i386/kernel/irq.c +++ b/arch/i386/kernel/irq.c @@ -53,8 +53,10 @@ static union irq_ctx *softirq_ctx[NR_CPUS] __read_mostly; */ fastcall unsigned int do_IRQ(struct pt_regs *regs) { + struct pt_regs *old_regs; /* high bit used in ret_from_ code */ int irq = ~regs->orig_eax; + struct irq_desc *desc = irq_desc + irq; #ifdef CONFIG_4KSTACKS union irq_ctx *curctx, *irqctx; u32 *isp; @@ -66,6 +68,7 @@ fastcall unsigned int do_IRQ(struct pt_regs *regs) BUG(); } + old_regs = set_irq_regs(regs); irq_enter(); #ifdef CONFIG_DEBUG_STACKOVERFLOW /* Debugging check for stack overflow: is there less than 1KB free? */ @@ -110,19 +113,20 @@ fastcall unsigned int do_IRQ(struct pt_regs *regs) (curctx->tinfo.preempt_count & SOFTIRQ_MASK); asm volatile( - " xchgl %%ebx,%%esp \n" - " call __do_IRQ \n" + " xchgl %%ebx,%%esp \n" + " call *%%edi \n" " movl %%ebx,%%esp \n" : "=a" (arg1), "=d" (arg2), "=b" (ebx) - : "0" (irq), "1" (regs), "2" (isp) - : "memory", "cc", "ecx" + : "0" (irq), "1" (desc), "2" (isp), + "D" (desc->handle_irq) + : "memory", "cc" ); } else #endif - __do_IRQ(irq, regs); + desc->handle_irq(irq, desc); irq_exit(); - + set_irq_regs(old_regs); return 1; } @@ -253,7 +257,8 @@ int show_interrupts(struct seq_file *p, void *v) for_each_online_cpu(j) seq_printf(p, "%10u ", kstat_cpu(j).irqs[i]); #endif - seq_printf(p, " %14s", irq_desc[i].chip->typename); + seq_printf(p, " %8s", irq_desc[i].chip->name); + seq_printf(p, "-%-8s", irq_desc[i].name); seq_printf(p, " %s", action->name); for (action=action->next; action; action = action->next) @@ -283,7 +288,9 @@ skip: } #ifdef CONFIG_HOTPLUG_CPU +#ifndef CONFIG_XEN #include +#endif void fixup_irqs(cpumask_t map) { @@ -297,7 +304,9 @@ void fixup_irqs(cpumask_t map) cpus_and(mask, irq_desc[irq].affinity, map); if (any_online_cpu(mask) == NR_CPUS) { +#ifndef CONFIG_XEN printk("Breaking affinity for irq %i\n", irq); +#endif mask = map; } if (irq_desc[irq].chip->set_affinity)