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"
|
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
|
config HAVE_ARCH_KGDB
|
||||||
def_bool y
|
def_bool y
|
||||||
|
|
||||||
|
|
|
@ -24,6 +24,14 @@ static inline void wrusp(unsigned long usp)
|
||||||
__asm__ __volatile__("usp = %0;\n\t"::"da"(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.
|
* User space process size: 1st byte beyond user address space.
|
||||||
* Fairly meaningless on nommu. Parts of user programs can be scattered
|
* Fairly meaningless on nommu. Parts of user programs can be scattered
|
||||||
|
|
|
@ -44,6 +44,7 @@
|
||||||
*/
|
*/
|
||||||
#define THREAD_SIZE_ORDER 1
|
#define THREAD_SIZE_ORDER 1
|
||||||
#define THREAD_SIZE 8192 /* 2 pages */
|
#define THREAD_SIZE 8192 /* 2 pages */
|
||||||
|
#define STACK_WARN (THREAD_SIZE/8)
|
||||||
|
|
||||||
#ifndef __ASSEMBLY__
|
#ifndef __ASSEMBLY__
|
||||||
|
|
||||||
|
|
|
@ -120,7 +120,21 @@ asmlinkage void asm_do_IRQ(unsigned int irq, struct pt_regs *regs)
|
||||||
desc = &bad_irq_desc;
|
desc = &bad_irq_desc;
|
||||||
|
|
||||||
irq_enter();
|
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);
|
generic_handle_irq(irq);
|
||||||
|
|
||||||
/* If we're the only interrupt running (ignoring IRQ15 which is for
|
/* If we're the only interrupt running (ignoring IRQ15 which is for
|
||||||
|
|
Loading…
Reference in New Issue