diff options
Diffstat (limited to 'arch/blackfin/include/asm/bug.h')
| -rw-r--r-- | arch/blackfin/include/asm/bug.h | 57 | 
1 files changed, 51 insertions, 6 deletions
diff --git a/arch/blackfin/include/asm/bug.h b/arch/blackfin/include/asm/bug.h index 6d3e11b1fc5..655e49540e4 100644 --- a/arch/blackfin/include/asm/bug.h +++ b/arch/blackfin/include/asm/bug.h @@ -2,13 +2,58 @@  #define _BLACKFIN_BUG_H  #ifdef CONFIG_BUG -#define HAVE_ARCH_BUG -#define BUG() do { \ -	dump_bfin_trace_buffer(); \ -	printk(KERN_EMERG "BUG: failure at %s:%d/%s()!\n", __FILE__, __LINE__, __func__); \ -	panic("BUG!"); \ -} while (0) +#define BFIN_BUG_OPCODE	0xefcd + +#ifdef CONFIG_DEBUG_BUGVERBOSE + +#define _BUG_OR_WARN(flags)						\ +	asm volatile(							\ +		"1:	.hword	%0\n"					\ +		"	.section __bug_table,\"a\",@progbits\n"		\ +		"2:	.long	1b\n"					\ +		"	.long	%1\n"					\ +		"	.short	%2\n"					\ +		"	.short	%3\n"					\ +		"	.org	2b + %4\n"				\ +		"	.previous"					\ +		:							\ +		: "i"(BFIN_BUG_OPCODE), "i"(__FILE__),			\ +		  "i"(__LINE__), "i"(flags),				\ +		  "i"(sizeof(struct bug_entry))) + +#else + +#define _BUG_OR_WARN(flags)						\ +	asm volatile(							\ +		"1:	.hword	%0\n"					\ +		"	.section __bug_table,\"a\",@progbits\n"		\ +		"2:	.long	1b\n"					\ +		"	.short	%1\n"					\ +		"	.org	2b + %2\n"				\ +		"	.previous"					\ +		:							\ +		: "i"(BFIN_BUG_OPCODE), "i"(flags),			\ +		  "i"(sizeof(struct bug_entry))) + +#endif /* CONFIG_DEBUG_BUGVERBOSE */ + +#define BUG()								\ +	do {								\ +		_BUG_OR_WARN(0);					\ +		for (;;);						\ +	} while (0) + +#define WARN_ON(condition)							\ +	({								\ +		int __ret_warn_on = !!(condition);			\ +		if (unlikely(__ret_warn_on))				\ +			_BUG_OR_WARN(BUGFLAG_WARNING);			\ +		unlikely(__ret_warn_on);				\ +	}) + +#define HAVE_ARCH_BUG +#define HAVE_ARCH_WARN_ON  #endif  |