2005-04-17 02:20:36 +04:00
# ifndef __ASM_SH_BUG_H
# define __ASM_SH_BUG_H
2007-05-08 07:14:54 +04:00
# define TRAPA_BUG_OPCODE 0xc33e /* trapa #0x3e */
2007-11-08 12:58:00 +03:00
# ifdef CONFIG_GENERIC_BUG
2007-03-08 13:41:21 +03:00
# define HAVE_ARCH_BUG
# define HAVE_ARCH_WARN_ON
2006-12-08 11:41:43 +03:00
2007-03-08 13:41:21 +03:00
/**
* _EMIT_BUG_ENTRY
* % 1 - __FILE__
* % 2 - __LINE__
* % 3 - trap type
* % 4 - sizeof ( struct bug_entry )
*
* The trapa opcode itself sits in % 0.
* The % O notation is used to avoid # generation .
*
* The offending file and line are encoded in the __bug_table section .
*/
2006-12-08 11:41:43 +03:00
# ifdef CONFIG_DEBUG_BUGVERBOSE
2007-03-08 13:41:21 +03:00
# define _EMIT_BUG_ENTRY \
" \t .pushsection __bug_table, \" a \" \n " \
" 2: \t .long 1b, %O1 \n " \
" \t .short %O2, %O3 \n " \
" \t .org 2b+%O4 \n " \
" \t .popsection \n "
# else
# define _EMIT_BUG_ENTRY \
" \t .pushsection __bug_table, \" a \" \n " \
" 2: \t .long 1b \n " \
" \t .short %O3 \n " \
" \t .org 2b+%O4 \n " \
" \t .popsection \n "
# endif
2006-12-08 11:41:43 +03:00
# define BUG() \
do { \
__asm__ __volatile__ ( \
2007-03-08 13:41:21 +03:00
" 1: \t .short %O0 \n " \
_EMIT_BUG_ENTRY \
: \
: " n " ( TRAPA_BUG_OPCODE ) , \
" i " ( __FILE__ ) , \
" i " ( __LINE__ ) , " i " ( 0 ) , \
" i " ( sizeof ( struct bug_entry ) ) ) ; \
2006-12-08 11:41:43 +03:00
} while ( 0 )
2007-03-08 13:41:21 +03:00
# define __WARN() \
do { \
__asm__ __volatile__ ( \
" 1: \t .short %O0 \n " \
_EMIT_BUG_ENTRY \
: \
: " n " ( TRAPA_BUG_OPCODE ) , \
" i " ( __FILE__ ) , \
" i " ( __LINE__ ) , \
" i " ( BUGFLAG_WARNING ) , \
" i " ( sizeof ( struct bug_entry ) ) ) ; \
2005-04-17 02:20:36 +04:00
} while ( 0 )
2007-03-08 13:41:21 +03:00
# define WARN_ON(x) ({ \
2007-08-02 02:18:38 +04:00
int __ret_warn_on = ! ! ( x ) ; \
2007-03-08 13:41:21 +03:00
if ( __builtin_constant_p ( __ret_warn_on ) ) { \
if ( __ret_warn_on ) \
__WARN ( ) ; \
} else { \
if ( unlikely ( __ret_warn_on ) ) \
__WARN ( ) ; \
} \
unlikely ( __ret_warn_on ) ; \
} )
2006-12-08 11:41:43 +03:00
2007-11-08 12:58:00 +03:00
# endif /* CONFIG_GENERIC_BUG */
2005-05-01 19:59:01 +04:00
2005-04-17 02:20:36 +04:00
# include <asm-generic/bug.h>
2006-12-08 11:41:43 +03:00
# endif /* __ASM_SH_BUG_H */