diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2010-10-29 14:13:10 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2010-10-29 14:13:10 -0400 |
commit | b77d643ced576bdd1e918aebda869de74696cde9 (patch) | |
tree | bb5d708f4bbb48461923a28e63a8cf8bdd477dd7 /arch/mips/kernel/irq.c | |
parent | b4020c1b198c0f0c0b0ff0cfdd824a26b93edd6f (diff) | |
parent | 64575f918f3279d8487cf670dbefa956ce16a526 (diff) |
Merge branch 'upstream' of git://git.linux-mips.org/pub/scm/upstream-linus
* 'upstream' of git://git.linux-mips.org/pub/scm/upstream-linus: (46 commits)
ftrace/MIPS: Enable C Version of recordmcount
ftrace/MIPS: Add module support for C version of recordmcount
ftrace/MIPS: Add MIPS64 support for C version of recordmcount
MIPS: Make TASK_SIZE reflect proper size for both 32 and 64 bit processes.
MIPS: Allow UserLocal on MIPS_R1 processors
MIPS: Honor L2 bypass bit
MIPS: Add BMIPS CP0 register definitions
MIPS: Add BMIPS processor types to Kconfig
MIPS: Decouple BMIPS CPU support from bcm47xx/bcm63xx SoC code
MIPS: Add support for hardware performance events (mipsxx)
MIPS: Perf-events: Add callchain support
MIPS: add support for hardware performance events (skeleton)
MIPS: add support for software performance events
MIPS: define local_xchg from xchg_local to atomic_long_xchg
MIPS: AR7: Add support for Titan (TNETV10xx) SoC variant
MIPS: AR7: Initialize GPIO earlier
MIPS: Add platform device and Kconfig for Octeon USB EHCI / OHCI
USB: Add EHCI and OHCH glue for OCTEON II SOCs.
MIPS: Octeon: Add register definitions for EHCI / OHCI USB glue logic.
MIPS: Octeon: Apply CN63XXP1 errata workarounds.
...
Diffstat (limited to 'arch/mips/kernel/irq.c')
-rw-r--r-- | arch/mips/kernel/irq.c | 24 |
1 files changed, 24 insertions, 0 deletions
diff --git a/arch/mips/kernel/irq.c b/arch/mips/kernel/irq.c index c6345f579a8a..4f93db58a79e 100644 --- a/arch/mips/kernel/irq.c +++ b/arch/mips/kernel/irq.c | |||
@@ -151,6 +151,29 @@ void __init init_IRQ(void) | |||
151 | #endif | 151 | #endif |
152 | } | 152 | } |
153 | 153 | ||
154 | #ifdef DEBUG_STACKOVERFLOW | ||
155 | static inline void check_stack_overflow(void) | ||
156 | { | ||
157 | unsigned long sp; | ||
158 | |||
159 | __asm__ __volatile__("move %0, $sp" : "=r" (sp)); | ||
160 | sp &= THREAD_MASK; | ||
161 | |||
162 | /* | ||
163 | * Check for stack overflow: is there less than STACK_WARN free? | ||
164 | * STACK_WARN is defined as 1/8 of THREAD_SIZE by default. | ||
165 | */ | ||
166 | if (unlikely(sp < (sizeof(struct thread_info) + STACK_WARN))) { | ||
167 | printk("do_IRQ: stack overflow: %ld\n", | ||
168 | sp - sizeof(struct thread_info)); | ||
169 | dump_stack(); | ||
170 | } | ||
171 | } | ||
172 | #else | ||
173 | static inline void check_stack_overflow(void) {} | ||
174 | #endif | ||
175 | |||
176 | |||
154 | /* | 177 | /* |
155 | * do_IRQ handles all normal device IRQ's (the special | 178 | * do_IRQ handles all normal device IRQ's (the special |
156 | * SMP cross-CPU interrupts have their own specific | 179 | * SMP cross-CPU interrupts have their own specific |
@@ -159,6 +182,7 @@ void __init init_IRQ(void) | |||
159 | void __irq_entry do_IRQ(unsigned int irq) | 182 | void __irq_entry do_IRQ(unsigned int irq) |
160 | { | 183 | { |
161 | irq_enter(); | 184 | irq_enter(); |
185 | check_stack_overflow(); | ||
162 | __DO_IRQ_SMTC_HOOK(irq); | 186 | __DO_IRQ_SMTC_HOOK(irq); |
163 | generic_handle_irq(irq); | 187 | generic_handle_irq(irq); |
164 | irq_exit(); | 188 | irq_exit(); |