diff options
Diffstat (limited to 'arch/x86/include/asm/bug.h')
| -rw-r--r-- | arch/x86/include/asm/bug.h | 98 | 
1 files changed, 56 insertions, 42 deletions
| diff --git a/arch/x86/include/asm/bug.h b/arch/x86/include/asm/bug.h index 6804d6642767..5090035e6d16 100644 --- a/arch/x86/include/asm/bug.h +++ b/arch/x86/include/asm/bug.h @@ -4,6 +4,8 @@  #include <linux/stringify.h> +#ifndef __ASSEMBLY__ +  /*   * Despite that some emulators terminate on UD2, we use it for WARN().   * @@ -20,53 +22,15 @@  #define LEN_UD2		2 -#ifdef CONFIG_GENERIC_BUG - -#ifdef CONFIG_X86_32 -# define __BUG_REL(val)	".long " __stringify(val) -#else -# define __BUG_REL(val)	".long " __stringify(val) " - 2b" -#endif - -#ifdef CONFIG_DEBUG_BUGVERBOSE - -#define _BUG_FLAGS(ins, flags)						\ -do {									\ -	asm volatile("1:\t" ins "\n"					\ -		     ".pushsection __bug_table,\"aw\"\n"		\ -		     "2:\t" __BUG_REL(1b) "\t# bug_entry::bug_addr\n"	\ -		     "\t"  __BUG_REL(%c0) "\t# bug_entry::file\n"	\ -		     "\t.word %c1"        "\t# bug_entry::line\n"	\ -		     "\t.word %c2"        "\t# bug_entry::flags\n"	\ -		     "\t.org 2b+%c3\n"					\ -		     ".popsection"					\ -		     : : "i" (__FILE__), "i" (__LINE__),		\ -			 "i" (flags),					\ -			 "i" (sizeof(struct bug_entry)));		\ -} while (0) - -#else /* !CONFIG_DEBUG_BUGVERBOSE */ -  #define _BUG_FLAGS(ins, flags)						\  do {									\ -	asm volatile("1:\t" ins "\n"					\ -		     ".pushsection __bug_table,\"aw\"\n"		\ -		     "2:\t" __BUG_REL(1b) "\t# bug_entry::bug_addr\n"	\ -		     "\t.word %c0"        "\t# bug_entry::flags\n"	\ -		     "\t.org 2b+%c1\n"					\ -		     ".popsection"					\ -		     : : "i" (flags),					\ +	asm volatile("ASM_BUG ins=\"" ins "\" file=%c0 line=%c1 "	\ +		     "flags=%c2 size=%c3"				\ +		     : : "i" (__FILE__), "i" (__LINE__),                \ +			 "i" (flags),                                   \  			 "i" (sizeof(struct bug_entry)));		\  } while (0) -#endif /* CONFIG_DEBUG_BUGVERBOSE */ - -#else - -#define _BUG_FLAGS(ins, flags)  asm volatile(ins) - -#endif /* CONFIG_GENERIC_BUG */ -  #define HAVE_ARCH_BUG  #define BUG()							\  do {								\ @@ -82,4 +46,54 @@ do {								\  #include <asm-generic/bug.h> +#else /* __ASSEMBLY__ */ + +#ifdef CONFIG_GENERIC_BUG + +#ifdef CONFIG_X86_32 +.macro __BUG_REL val:req +	.long \val +.endm +#else +.macro __BUG_REL val:req +	.long \val - 2b +.endm +#endif + +#ifdef CONFIG_DEBUG_BUGVERBOSE + +.macro ASM_BUG ins:req file:req line:req flags:req size:req +1:	\ins +	.pushsection __bug_table,"aw" +2:	__BUG_REL val=1b	# bug_entry::bug_addr +	__BUG_REL val=\file	# bug_entry::file +	.word \line		# bug_entry::line +	.word \flags		# bug_entry::flags +	.org 2b+\size +	.popsection +.endm + +#else /* !CONFIG_DEBUG_BUGVERBOSE */ + +.macro ASM_BUG ins:req file:req line:req flags:req size:req +1:	\ins +	.pushsection __bug_table,"aw" +2:	__BUG_REL val=1b	# bug_entry::bug_addr +	.word \flags		# bug_entry::flags +	.org 2b+\size +	.popsection +.endm + +#endif /* CONFIG_DEBUG_BUGVERBOSE */ + +#else /* CONFIG_GENERIC_BUG */ + +.macro ASM_BUG ins:req file:req line:req flags:req size:req +	\ins +.endm + +#endif /* CONFIG_GENERIC_BUG */ + +#endif /* __ASSEMBLY__ */ +  #endif /* _ASM_X86_BUG_H */ |