/*
* per-CPU IRQ handling stacks
*/
-#ifdef CONFIG_4KSTACKS
union irq_ctx *hardirq_ctx[NR_CPUS];
union irq_ctx *softirq_ctx[NR_CPUS];
-#endif
/*
* Special irq handlers.
int status = 1; /* Force the "do bottom halves" bit */
int retval = 0;
- if (!(action->flags & SA_INTERRUPT))
- local_irq_enable();
-
do {
status |= action->flags;
retval |= action->handler(irq, action->dev_id, regs);
printk(KERN_ERR "irq event %d: bogus return value %x\n",
irq, action_ret);
} else {
- printk(KERN_ERR "irq %d: nobody cared!\n", irq);
+ printk(KERN_ERR "irq %d: nobody cared! (screaming interrupt?)\n", irq);
+ printk(KERN_ERR "irq %d: Please try booting with acpi=off and report a bug\n", irq);
}
dump_stack();
printk(KERN_ERR "handlers:\n");
* useful for irq hardware that does not mask cleanly in an
* SMP environment.
*/
-#ifdef CONFIG_4KSTACKS
for (;;) {
irqreturn_t action_ret;
/* build the stack frame on the IRQ stack */
isp = (u32*) ((char*)irqctx + sizeof(*irqctx));
irqctx->tinfo.task = curctx->tinfo.task;
+ irqctx->tinfo.real_stack = curctx->tinfo.real_stack;
+ irqctx->tinfo.virtual_stack = curctx->tinfo.virtual_stack;
irqctx->tinfo.previous_esp = current_stack_pointer();
*--isp = (u32) action;
desc->status &= ~IRQ_PENDING;
}
-#else
-
- for (;;) {
- irqreturn_t action_ret;
-
- spin_unlock(&desc->lock);
-
- action_ret = handle_IRQ_event(irq, ®s, action);
-
- spin_lock(&desc->lock);
- if (!noirqdebug)
- note_interrupt(irq, desc, action_ret);
- if (likely(!(desc->status & IRQ_PENDING)))
- break;
- desc->status &= ~IRQ_PENDING;
- }
-#endif
desc->status &= ~IRQ_INPROGRESS;
out:
}
-#ifdef CONFIG_4KSTACKS
/*
* These should really be __section__(".bss.page_aligned") as well, but
* gcc's 3.0 and earlier don't handle that correctly.
curctx = current_thread_info();
irqctx = softirq_ctx[smp_processor_id()];
irqctx->tinfo.task = curctx->task;
+ irqctx->tinfo.real_stack = curctx->real_stack;
+ irqctx->tinfo.virtual_stack = curctx->virtual_stack;
irqctx->tinfo.previous_esp = current_stack_pointer();
/* build the stack frame on the softirq stack */
}
EXPORT_SYMBOL(do_softirq);
-#endif