[POWERPC] Generic BUG for powerpc
[GitHub/mt8127/android_kernel_alcatel_ttab.git] / include / asm-powerpc / bug.h
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 #ifndef __ASSEMBLY__
15
16 #ifdef CONFIG_BUG
17
18 /* _EMIT_BUG_ENTRY expects args %0,%1,%2,%3 to be FILE, LINE, flags and
19 sizeof(struct bug_entry), respectively */
20 #ifdef CONFIG_DEBUG_BUGVERBOSE
21 #define _EMIT_BUG_ENTRY \
22 ".section __bug_table,\"a\"\n" \
23 "2:\t" PPC_LONG "1b, %0\n" \
24 "\t.short %1, %2\n" \
25 ".org 2b+%3\n" \
26 ".previous\n"
27 #else
28 #define _EMIT_BUG_ENTRY \
29 ".section __bug_table,\"a\"\n" \
30 "2:\t" PPC_LONG "1b\n" \
31 "\t.short %2\n" \
32 ".org 2b+%3\n" \
33 ".previous\n"
34 #endif
35
36 /*
37 * BUG_ON() and WARN_ON() do their best to cooperate with compile-time
38 * optimisations. However depending on the complexity of the condition
39 * some compiler versions may not produce optimal results.
40 */
41
42 #define BUG() do { \
43 __asm__ __volatile__( \
44 "1: twi 31,0,0\n" \
45 _EMIT_BUG_ENTRY \
46 : : "i" (__FILE__), "i" (__LINE__), \
47 "i" (0), "i" (sizeof(struct bug_entry))); \
48 for(;;) ; \
49 } while (0)
50
51 #define BUG_ON(x) do { \
52 if (__builtin_constant_p(x)) { \
53 if (x) \
54 BUG(); \
55 } else { \
56 __asm__ __volatile__( \
57 "1: "PPC_TLNEI" %4,0\n" \
58 _EMIT_BUG_ENTRY \
59 : : "i" (__FILE__), "i" (__LINE__), "i" (0), \
60 "i" (sizeof(struct bug_entry)), \
61 "r" ((long)(x))); \
62 } \
63 } while (0)
64
65 #define __WARN() do { \
66 __asm__ __volatile__( \
67 "1: twi 31,0,0\n" \
68 _EMIT_BUG_ENTRY \
69 : : "i" (__FILE__), "i" (__LINE__), \
70 "i" (BUGFLAG_WARNING), \
71 "i" (sizeof(struct bug_entry))); \
72 } while (0)
73
74 #define WARN_ON(x) ({ \
75 typeof(x) __ret_warn_on = (x); \
76 if (__builtin_constant_p(__ret_warn_on)) { \
77 if (__ret_warn_on) \
78 __WARN(); \
79 } else { \
80 __asm__ __volatile__( \
81 "1: "PPC_TLNEI" %4,0\n" \
82 _EMIT_BUG_ENTRY \
83 : : "i" (__FILE__), "i" (__LINE__), \
84 "i" (BUGFLAG_WARNING), \
85 "i" (sizeof(struct bug_entry)), \
86 "r" (__ret_warn_on)); \
87 } \
88 unlikely(__ret_warn_on); \
89 })
90
91 #define HAVE_ARCH_BUG
92 #define HAVE_ARCH_BUG_ON
93 #define HAVE_ARCH_WARN_ON
94 #endif /* CONFIG_BUG */
95 #endif /* __ASSEMBLY __ */
96
97 #include <asm-generic/bug.h>
98
99 #endif /* __KERNEL__ */
100 #endif /* _ASM_POWERPC_BUG_H */