Commit a45d575f authored by Robin Getz's avatar Robin Getz Committed by Bryan Wu
Browse files

Blackfin arch: Add basic irq stack checking for Blackfin

parent f768a0eb
Loading
Loading
Loading
Loading
+16 −0
Original line number Diff line number Diff line
@@ -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

+8 −0
Original line number Diff line number Diff line
@@ -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
+1 −0
Original line number Diff line number Diff line
@@ -44,6 +44,7 @@
 */
#define THREAD_SIZE_ORDER	1
#define THREAD_SIZE		8192	/* 2 pages */
#define STACK_WARN		(THREAD_SIZE/8)

#ifndef __ASSEMBLY__

+15 −1
Original line number Diff line number Diff line
@@ -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