summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMike Frysinger <vapier@gentoo.org>2009-06-15 06:18:38 -0400
committerMike Frysinger <vapier@gentoo.org>2009-06-22 21:15:43 -0400
commit6f10fdabdce356aac3c948e659f39b6f1e2f7382 (patch)
treeab34b944e187609a2712883bfec6a9d5a5690762
parent46f288a0f983401ebadb918751d342cbf819cde5 (diff)
downloadop-kernel-dev-6f10fdabdce356aac3c948e659f39b6f1e2f7382.zip
op-kernel-dev-6f10fdabdce356aac3c948e659f39b6f1e2f7382.tar.gz
Blackfin: simplify irq stack overflow checking
Take a page from x86 and abstract the stack checking out of the asm_do_IRQ() function so that the result is easier to digest. Signed-off-by: Mike Frysinger <vapier@gentoo.org>
-rw-r--r--arch/blackfin/kernel/irqchip.c32
1 files changed, 17 insertions, 15 deletions
diff --git a/arch/blackfin/kernel/irqchip.c b/arch/blackfin/kernel/irqchip.c
index 8abb642..7378440 100644
--- a/arch/blackfin/kernel/irqchip.c
+++ b/arch/blackfin/kernel/irqchip.c
@@ -88,6 +88,22 @@ int show_interrupts(struct seq_file *p, void *v)
}
#endif
+#ifdef CONFIG_DEBUG_STACKOVERFLOW
+static void check_stack_overflow(int irq)
+{
+ /* Debugging check for stack overflow: is there less than STACK_WARN free? */
+ long sp = __get_SP() & (THREAD_SIZE - 1);
+
+ if (unlikely(sp < (sizeof(struct thread_info) + STACK_WARN))) {
+ dump_stack();
+ pr_emerg("irq%i: possible stack overflow only %ld bytes free\n",
+ irq, sp - sizeof(struct thread_info));
+ }
+}
+#else
+static inline void check_stack_overflow(int irq) { }
+#endif
+
/*
* do_IRQ handles all hardware IRQs. Decoded IRQs should not
* come via this function. Instead, they should provide their
@@ -105,21 +121,7 @@ asmlinkage void asm_do_IRQ(unsigned int irq, struct pt_regs *regs)
irq_enter();
-#ifdef CONFIG_DEBUG_STACKOVERFLOW
- /* Debugging check for stack overflow: is there less than STACK_WARN free? */
- {
- long sp;
-
- sp = __get_SP() & (THREAD_SIZE-1);
-
- if (unlikely(sp < (sizeof(struct thread_info) + STACK_WARN))) {
- dump_stack();
- printk(KERN_EMERG "%s: possible stack overflow while handling irq %i "
- " only %ld bytes free\n",
- __func__, irq, sp - sizeof(struct thread_info));
- }
- }
-#endif
+ check_stack_overflow(irq);
/*
* Some hardware gives randomly wrong interrupts. Rather
OpenPOWER on IntegriCloud