1#ifndef _ASM_POWERPC_BUG_H
2#define _ASM_POWERPC_BUG_H
3#ifdef __KERNEL__
4
5#include <asm/asm-compat.h>
6/*
7 * Define an illegal instr to trap on the bug.
8 * We don't use 0 because that marks the end of a function
9 * in the ELF ABI.  That's "Boo Boo" in case you wonder...
10 */
11#define BUG_OPCODE .long 0x00b00b00  /* For asm */
12#define BUG_ILLEGAL_INSTR "0x00b00b00" /* For BUG macro */
13
14#ifdef CONFIG_BUG
15
16#ifdef __ASSEMBLY__
17#ifdef CONFIG_DEBUG_BUGVERBOSE
18.macro EMIT_BUG_ENTRY addr,file,line,flags
19	 .section __bug_table,"a"
205001:	 PPC_LONG \addr, 5002f
21	 .short \line, \flags
22	 .org 5001b+BUG_ENTRY_SIZE
23	 .previous
24	 .section .rodata,"a"
255002:	 .asciz "\file"
26	 .previous
27.endm
28#else
29 .macro EMIT_BUG_ENTRY addr,file,line,flags
30	 .section __bug_table,"a"
315001:	 PPC_LONG \addr
32	 .short \flags
33	 .org 5001b+BUG_ENTRY_SIZE
34	 .previous
35.endm
36#endif /* verbose */
37
38#else /* !__ASSEMBLY__ */
39/* _EMIT_BUG_ENTRY expects args %0,%1,%2,%3 to be FILE, LINE, flags and
40   sizeof(struct bug_entry), respectively */
41#ifdef CONFIG_DEBUG_BUGVERBOSE
42#define _EMIT_BUG_ENTRY				\
43	".section __bug_table,\"a\"\n"		\
44	"2:\t" PPC_LONG "1b, %0\n"		\
45	"\t.short %1, %2\n"			\
46	".org 2b+%3\n"				\
47	".previous\n"
48#else
49#define _EMIT_BUG_ENTRY				\
50	".section __bug_table,\"a\"\n"		\
51	"2:\t" PPC_LONG "1b\n"			\
52	"\t.short %2\n"				\
53	".org 2b+%3\n"				\
54	".previous\n"
55#endif
56
57/*
58 * BUG_ON() and WARN_ON() do their best to cooperate with compile-time
59 * optimisations. However depending on the complexity of the condition
60 * some compiler versions may not produce optimal results.
61 */
62
63#define BUG() do {						\
64	__asm__ __volatile__(					\
65		"1:	twi 31,0,0\n"				\
66		_EMIT_BUG_ENTRY					\
67		: : "i" (__FILE__), "i" (__LINE__),		\
68		    "i" (0), "i"  (sizeof(struct bug_entry)));	\
69	for(;;) ;						\
70} while (0)
71
72#define BUG_ON(x) do {						\
73	if (__builtin_constant_p(x)) {				\
74		if (x)						\
75			BUG();					\
76	} else {						\
77		__asm__ __volatile__(				\
78		"1:	"PPC_TLNEI"	%4,0\n"			\
79		_EMIT_BUG_ENTRY					\
80		: : "i" (__FILE__), "i" (__LINE__), "i" (0),	\
81		  "i" (sizeof(struct bug_entry)),		\
82		  "r" ((long)(x)));				\
83	}							\
84} while (0)
85
86#define __WARN() do {						\
87	__asm__ __volatile__(					\
88		"1:	twi 31,0,0\n"				\
89		_EMIT_BUG_ENTRY					\
90		: : "i" (__FILE__), "i" (__LINE__),		\
91		  "i" (BUGFLAG_WARNING),			\
92		  "i" (sizeof(struct bug_entry)));		\
93} while (0)
94
95#define WARN_ON(x) ({						\
96	typeof(x) __ret_warn_on = (x);				\
97	if (__builtin_constant_p(__ret_warn_on)) {		\
98		if (__ret_warn_on)				\
99			__WARN();				\
100	} else {						\
101		__asm__ __volatile__(				\
102		"1:	"PPC_TLNEI"	%4,0\n"			\
103		_EMIT_BUG_ENTRY					\
104		: : "i" (__FILE__), "i" (__LINE__),		\
105		  "i" (BUGFLAG_WARNING),			\
106		  "i" (sizeof(struct bug_entry)),		\
107		  "r" (__ret_warn_on));				\
108	}							\
109	unlikely(__ret_warn_on);				\
110})
111
112#define HAVE_ARCH_BUG
113#define HAVE_ARCH_BUG_ON
114#define HAVE_ARCH_WARN_ON
115#endif /* __ASSEMBLY __ */
116#endif /* CONFIG_BUG */
117
118#include <asm-generic/bug.h>
119
120#endif /* __KERNEL__ */
121#endif /* _ASM_POWERPC_BUG_H */
122