Merge branch 'for-linus' of git://git390.osdl.marist.edu/pub/scm/linux-2.6
[linux-2.6] / arch / sh / include / asm / bug.h
1 #ifndef __ASM_SH_BUG_H
2 #define __ASM_SH_BUG_H
3
4 #define TRAPA_BUG_OPCODE        0xc33e  /* trapa #0x3e */
5
6 #ifdef CONFIG_GENERIC_BUG
7 #define HAVE_ARCH_BUG
8 #define HAVE_ARCH_WARN_ON
9
10 /**
11  * _EMIT_BUG_ENTRY
12  * %1 - __FILE__
13  * %2 - __LINE__
14  * %3 - trap type
15  * %4 - sizeof(struct bug_entry)
16  *
17  * The trapa opcode itself sits in %0.
18  * The %O notation is used to avoid # generation.
19  *
20  * The offending file and line are encoded in the __bug_table section.
21  */
22 #ifdef CONFIG_DEBUG_BUGVERBOSE
23 #define _EMIT_BUG_ENTRY                         \
24         "\t.pushsection __bug_table,\"a\"\n"    \
25         "2:\t.long 1b, %O1\n"                   \
26         "\t.short %O2, %O3\n"                   \
27         "\t.org 2b+%O4\n"                       \
28         "\t.popsection\n"
29 #else
30 #define _EMIT_BUG_ENTRY                         \
31         "\t.pushsection __bug_table,\"a\"\n"    \
32         "2:\t.long 1b\n"                        \
33         "\t.short %O3\n"                        \
34         "\t.org 2b+%O4\n"                       \
35         "\t.popsection\n"
36 #endif
37
38 #define BUG()                                           \
39 do {                                                    \
40         __asm__ __volatile__ (                          \
41                 "1:\t.short %O0\n"                      \
42                 _EMIT_BUG_ENTRY                         \
43                  :                                      \
44                  : "n" (TRAPA_BUG_OPCODE),              \
45                    "i" (__FILE__),                      \
46                    "i" (__LINE__), "i" (0),             \
47                    "i" (sizeof(struct bug_entry)));     \
48 } while (0)
49
50 #define __WARN()                                        \
51 do {                                                    \
52         __asm__ __volatile__ (                          \
53                 "1:\t.short %O0\n"                      \
54                  _EMIT_BUG_ENTRY                        \
55                  :                                      \
56                  : "n" (TRAPA_BUG_OPCODE),              \
57                    "i" (__FILE__),                      \
58                    "i" (__LINE__),                      \
59                    "i" (BUGFLAG_WARNING),               \
60                    "i" (sizeof(struct bug_entry)));     \
61 } while (0)
62
63 #define WARN_ON(x) ({                                           \
64         int __ret_warn_on = !!(x);                              \
65         if (__builtin_constant_p(__ret_warn_on)) {              \
66                 if (__ret_warn_on)                              \
67                         __WARN();                               \
68         } else {                                                \
69                 if (unlikely(__ret_warn_on))                    \
70                         __WARN();                               \
71         }                                                       \
72         unlikely(__ret_warn_on);                                \
73 })
74
75 #endif /* CONFIG_GENERIC_BUG */
76
77 #include <asm-generic/bug.h>
78
79 #endif /* __ASM_SH_BUG_H */