diff options
Diffstat (limited to 'arch/x86/include/asm/bug.h')
| -rw-r--r-- | arch/x86/include/asm/bug.h | 98 | 
1 files changed, 42 insertions, 56 deletions
diff --git a/arch/x86/include/asm/bug.h b/arch/x86/include/asm/bug.h index 5090035e6d16..6804d6642767 100644 --- a/arch/x86/include/asm/bug.h +++ b/arch/x86/include/asm/bug.h @@ -4,8 +4,6 @@  #include <linux/stringify.h> -#ifndef __ASSEMBLY__ -  /*   * Despite that some emulators terminate on UD2, we use it for WARN().   * @@ -22,15 +20,53 @@  #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("ASM_BUG ins=\"" ins "\" file=%c0 line=%c1 "	\ -		     "flags=%c2 size=%c3"				\ -		     : : "i" (__FILE__), "i" (__LINE__),                \ -			 "i" (flags),                                   \ +	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),					\  			 "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 {								\ @@ -46,54 +82,4 @@ 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 */  |