On Fri, Aug 27, 2010 at 06:32:06PM +0900, jiang.adam@xxxxxxxxx wrote: > diff --git a/arch/mips/Kconfig.debug b/arch/mips/Kconfig.debug > index 43dc279..f437cd1 100644 > --- a/arch/mips/Kconfig.debug > +++ b/arch/mips/Kconfig.debug > @@ -67,6 +67,15 @@ config CMDLINE_OVERRIDE > > Normally, you will choose 'N' here. > > +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(2GB on MIPS). The debugging option I better upgrade my meory then. 2GB is a LOTS :) > + provides another way to check stack overflow happened on kernel mode > + stack usually caused by nested interruption. > + > config DEBUG_STACK_USAGE > bool "Enable stack utilization instrumentation" > depends on DEBUG_KERNEL > diff --git a/arch/mips/kernel/irq.c b/arch/mips/kernel/irq.c > index c6345f5..d0b924d 100644 > --- a/arch/mips/kernel/irq.c > +++ b/arch/mips/kernel/irq.c > @@ -151,6 +151,26 @@ void __init init_IRQ(void) > #endif > } > > +#ifdef DEBUG_STACKOVERFLOW > +static inline void check_stack_overflow(void) > +{ > + long sp; Addresses in Linux should always be unsigned long. > + > + __asm__ __volatile__("move %0, $sp" : "=r" (sp)); > + sp = sp & (THREAD_SIZE-1); For THREAD_SIZE - 1 there is the symbol THREAD_MASK. > + /* check for stack overflow: is there less than 2KB free? */ > + if (unlikely(sp < (sizeof(struct thread_info) + 2048))) { Looks good otherwise, will queue. Ralf