merge linus into test branch
[pandora-kernel.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 */