xref: /openbmc/linux/arch/parisc/include/asm/bug.h (revision 05920797)
1deae26bfSKyle McMartin #ifndef _PARISC_BUG_H
2deae26bfSKyle McMartin #define _PARISC_BUG_H
3deae26bfSKyle McMartin 
4deae26bfSKyle McMartin /*
5deae26bfSKyle McMartin  * Tell the user there is some problem.
6deae26bfSKyle McMartin  * The offending file and line are encoded in the __bug_table section.
7deae26bfSKyle McMartin  */
8deae26bfSKyle McMartin 
9deae26bfSKyle McMartin #ifdef CONFIG_BUG
10deae26bfSKyle McMartin #define HAVE_ARCH_BUG
11deae26bfSKyle McMartin #define HAVE_ARCH_WARN_ON
12deae26bfSKyle McMartin 
13deae26bfSKyle McMartin /* the break instruction is used as BUG() marker.  */
14deae26bfSKyle McMartin #define	PARISC_BUG_BREAK_ASM	"break 0x1f, 0x1fff"
15deae26bfSKyle McMartin #define	PARISC_BUG_BREAK_INSN	0x03ffe01f  /* PARISC_BUG_BREAK_ASM */
16deae26bfSKyle McMartin 
17deae26bfSKyle McMartin #if defined(CONFIG_64BIT)
18deae26bfSKyle McMartin #define ASM_WORD_INSN		".dword\t"
19deae26bfSKyle McMartin #else
20deae26bfSKyle McMartin #define ASM_WORD_INSN		".word\t"
21deae26bfSKyle McMartin #endif
22deae26bfSKyle McMartin 
23deae26bfSKyle McMartin #ifdef CONFIG_DEBUG_BUGVERBOSE
24deae26bfSKyle McMartin #define BUG()								\
25deae26bfSKyle McMartin 	do {								\
26deae26bfSKyle McMartin 		asm volatile("\n"					\
27deae26bfSKyle McMartin 			     "1:\t" PARISC_BUG_BREAK_ASM "\n"		\
28deae26bfSKyle McMartin 			     "\t.pushsection __bug_table,\"a\"\n"	\
29deae26bfSKyle McMartin 			     "2:\t" ASM_WORD_INSN "1b, %c0\n"		\
30deae26bfSKyle McMartin 			     "\t.short %c1, %c2\n"			\
31deae26bfSKyle McMartin 			     "\t.org 2b+%c3\n"				\
32deae26bfSKyle McMartin 			     "\t.popsection"				\
33deae26bfSKyle McMartin 			     : : "i" (__FILE__), "i" (__LINE__),	\
34deae26bfSKyle McMartin 			     "i" (0), "i" (sizeof(struct bug_entry)) ); \
3505920797SDavid Daney 		unreachable();						\
36deae26bfSKyle McMartin 	} while(0)
37deae26bfSKyle McMartin 
38deae26bfSKyle McMartin #else
39deae26bfSKyle McMartin #define BUG()								\
40deae26bfSKyle McMartin 	do {								\
41deae26bfSKyle McMartin 		asm volatile(PARISC_BUG_BREAK_ASM : : );		\
4205920797SDavid Daney 		unreachable();						\
43deae26bfSKyle McMartin 	} while(0)
44deae26bfSKyle McMartin #endif
45deae26bfSKyle McMartin 
46deae26bfSKyle McMartin #ifdef CONFIG_DEBUG_BUGVERBOSE
47deae26bfSKyle McMartin #define __WARN()							\
48deae26bfSKyle McMartin 	do {								\
49deae26bfSKyle McMartin 		asm volatile("\n"					\
50deae26bfSKyle McMartin 			     "1:\t" PARISC_BUG_BREAK_ASM "\n"		\
51deae26bfSKyle McMartin 			     "\t.pushsection __bug_table,\"a\"\n"	\
52deae26bfSKyle McMartin 			     "2:\t" ASM_WORD_INSN "1b, %c0\n"		\
53deae26bfSKyle McMartin 			     "\t.short %c1, %c2\n"			\
54deae26bfSKyle McMartin 			     "\t.org 2b+%c3\n"				\
55deae26bfSKyle McMartin 			     "\t.popsection"				\
56deae26bfSKyle McMartin 			     : : "i" (__FILE__), "i" (__LINE__),	\
57deae26bfSKyle McMartin 			     "i" (BUGFLAG_WARNING),			\
58deae26bfSKyle McMartin 			     "i" (sizeof(struct bug_entry)) );		\
59deae26bfSKyle McMartin 	} while(0)
60deae26bfSKyle McMartin #else
61deae26bfSKyle McMartin #define __WARN()							\
62deae26bfSKyle McMartin 	do {								\
63deae26bfSKyle McMartin 		asm volatile("\n"					\
64deae26bfSKyle McMartin 			     "1:\t" PARISC_BUG_BREAK_ASM "\n"		\
65deae26bfSKyle McMartin 			     "\t.pushsection __bug_table,\"a\"\n"	\
66deae26bfSKyle McMartin 			     "2:\t" ASM_WORD_INSN "1b\n"		\
67deae26bfSKyle McMartin 			     "\t.short %c0\n"				\
68deae26bfSKyle McMartin 			     "\t.org 2b+%c1\n"				\
69deae26bfSKyle McMartin 			     "\t.popsection"				\
70deae26bfSKyle McMartin 			     : : "i" (BUGFLAG_WARNING),			\
71deae26bfSKyle McMartin 			     "i" (sizeof(struct bug_entry)) );		\
72deae26bfSKyle McMartin 	} while(0)
73deae26bfSKyle McMartin #endif
74deae26bfSKyle McMartin 
75deae26bfSKyle McMartin 
76deae26bfSKyle McMartin #define WARN_ON(x) ({						\
77deae26bfSKyle McMartin 	int __ret_warn_on = !!(x);				\
78deae26bfSKyle McMartin 	if (__builtin_constant_p(__ret_warn_on)) {		\
79deae26bfSKyle McMartin 		if (__ret_warn_on)				\
80deae26bfSKyle McMartin 			__WARN();				\
81deae26bfSKyle McMartin 	} else {						\
82deae26bfSKyle McMartin 		if (unlikely(__ret_warn_on))			\
83deae26bfSKyle McMartin 			__WARN();				\
84deae26bfSKyle McMartin 	}							\
85deae26bfSKyle McMartin 	unlikely(__ret_warn_on);				\
86deae26bfSKyle McMartin })
87deae26bfSKyle McMartin 
88deae26bfSKyle McMartin #endif
89deae26bfSKyle McMartin 
90deae26bfSKyle McMartin #include <asm-generic/bug.h>
91deae26bfSKyle McMartin #endif
92deae26bfSKyle McMartin 
93