|
@@ -25,6 +25,8 @@
|
|
#include <linux/atomic.h>
|
|
#include <linux/atomic.h>
|
|
#include <linux/uaccess.h>
|
|
#include <linux/uaccess.h>
|
|
|
|
|
|
|
|
+void *irq_stack[NR_CPUS];
|
|
|
|
+
|
|
/*
|
|
/*
|
|
* 'what should we do if we get a hw irq event on an illegal vector'.
|
|
* 'what should we do if we get a hw irq event on an illegal vector'.
|
|
* each architecture has to answer this themselves.
|
|
* each architecture has to answer this themselves.
|
|
@@ -58,6 +60,15 @@ void __init init_IRQ(void)
|
|
clear_c0_status(ST0_IM);
|
|
clear_c0_status(ST0_IM);
|
|
|
|
|
|
arch_init_irq();
|
|
arch_init_irq();
|
|
|
|
+
|
|
|
|
+ for_each_possible_cpu(i) {
|
|
|
|
+ int irq_pages = IRQ_STACK_SIZE / PAGE_SIZE;
|
|
|
|
+ void *s = (void *)__get_free_pages(GFP_KERNEL, irq_pages);
|
|
|
|
+
|
|
|
|
+ irq_stack[i] = s;
|
|
|
|
+ pr_debug("CPU%d IRQ stack at 0x%p - 0x%p\n", i,
|
|
|
|
+ irq_stack[i], irq_stack[i] + IRQ_STACK_SIZE);
|
|
|
|
+ }
|
|
}
|
|
}
|
|
|
|
|
|
#ifdef CONFIG_DEBUG_STACKOVERFLOW
|
|
#ifdef CONFIG_DEBUG_STACKOVERFLOW
|