|
@@ -32,6 +32,7 @@ unsigned long irq_err_count;
|
|
|
|
|
|
/* irq stack only needs to be 16 byte aligned - not IRQ_STACK_SIZE aligned. */
|
|
|
DEFINE_PER_CPU(unsigned long [IRQ_STACK_SIZE/sizeof(long)], irq_stack) __aligned(16);
|
|
|
+DEFINE_PER_CPU(unsigned long *, irq_stack_ptr);
|
|
|
|
|
|
int arch_show_interrupts(struct seq_file *p, int prec)
|
|
|
{
|
|
@@ -50,8 +51,17 @@ void __init set_handle_irq(void (*handle_irq)(struct pt_regs *))
|
|
|
handle_arch_irq = handle_irq;
|
|
|
}
|
|
|
|
|
|
+static void init_irq_stacks(void)
|
|
|
+{
|
|
|
+ int cpu;
|
|
|
+
|
|
|
+ for_each_possible_cpu(cpu)
|
|
|
+ per_cpu(irq_stack_ptr, cpu) = per_cpu(irq_stack, cpu);
|
|
|
+}
|
|
|
+
|
|
|
void __init init_IRQ(void)
|
|
|
{
|
|
|
+ init_irq_stacks();
|
|
|
irqchip_init();
|
|
|
if (!handle_arch_irq)
|
|
|
panic("No interrupt controller found.");
|