Blackfin arch: Add basic irq stack checking for Blackfin
Signed-off-by: Robin Getz <rgetz@blackfin.uclinux.org> Signed-off-by: Bryan Wu <cooloney@kernel.org>
This commit is contained in:
parent
f768a0eb90
commit
a45d575f53
|
@ -2,6 +2,22 @@ menu "Kernel hacking"
|
|||
|
||||
source "lib/Kconfig.debug"
|
||||
|
||||
config DEBUG_STACKOVERFLOW
|
||||
bool "Check for stack overflows"
|
||||
depends on DEBUG_KERNEL
|
||||
help
|
||||
This option will cause messages to be printed if free stack space
|
||||
drops below a certain limit.
|
||||
|
||||
config DEBUG_STACK_USAGE
|
||||
bool "Enable stack utilization instrumentation"
|
||||
depends on DEBUG_KERNEL
|
||||
help
|
||||
Enables the display of the minimum amount of free stack which each
|
||||
task has ever had available in the sysrq-T output.
|
||||
|
||||
This option will slow down process creation somewhat.
|
||||
|
||||
config HAVE_ARCH_KGDB
|
||||
def_bool y
|
||||
|
||||
|
|
|
@ -24,6 +24,14 @@ static inline void wrusp(unsigned long usp)
|
|||
__asm__ __volatile__("usp = %0;\n\t"::"da"(usp));
|
||||
}
|
||||
|
||||
static inline unsigned long __get_SP(void)
|
||||
{
|
||||
unsigned long sp;
|
||||
|
||||
__asm__ __volatile__("%0 = sp;\n\t" : "=da"(sp));
|
||||
return sp;
|
||||
}
|
||||
|
||||
/*
|
||||
* User space process size: 1st byte beyond user address space.
|
||||
* Fairly meaningless on nommu. Parts of user programs can be scattered
|
||||
|
|
|
@ -44,6 +44,7 @@
|
|||
*/
|
||||
#define THREAD_SIZE_ORDER 1
|
||||
#define THREAD_SIZE 8192 /* 2 pages */
|
||||
#define STACK_WARN (THREAD_SIZE/8)
|
||||
|
||||
#ifndef __ASSEMBLY__
|
||||
|
||||
|
|
|
@ -120,7 +120,21 @@ asmlinkage void asm_do_IRQ(unsigned int irq, struct pt_regs *regs)
|
|||
desc = &bad_irq_desc;
|
||||
|
||||
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
|
||||
generic_handle_irq(irq);
|
||||
|
||||
/* If we're the only interrupt running (ignoring IRQ15 which is for
|
||||
|
|
Loading…
Reference in New Issue