[S390] bug: implement arch specific __WARN macro
[safe/jmp/linux-2.6] / arch / s390 / include / asm / bug.h
1 #ifndef _ASM_S390_BUG_H
2 #define _ASM_S390_BUG_H
3
4 #include <linux/kernel.h>
5
6 #ifdef CONFIG_BUG
7
8 #ifdef CONFIG_64BIT
9 #define S390_LONG ".quad"
10 #else
11 #define S390_LONG ".long"
12 #endif
13
14 #ifdef CONFIG_DEBUG_BUGVERBOSE
15
16 #define __EMIT_BUG(x) do {                                      \
17         asm volatile(                                           \
18                 "0:     j       0b+2\n"                         \
19                 "1:\n"                                          \
20                 ".section .rodata.str,\"aMS\",@progbits,1\n"    \
21                 "2:     .asciz  \""__FILE__"\"\n"               \
22                 ".previous\n"                                   \
23                 ".section __bug_table,\"a\"\n"                  \
24                 "3:\t"  S390_LONG "\t1b,2b\n"                   \
25                 "       .short  %0,%1\n"                        \
26                 "       .org    3b+%2\n"                        \
27                 ".previous\n"                                   \
28                 : : "i" (__LINE__),                             \
29                     "i" (x),                                    \
30                     "i" (sizeof(struct bug_entry)));            \
31 } while (0)
32
33 #else /* CONFIG_DEBUG_BUGVERBOSE */
34
35 #define __EMIT_BUG(x) do {                              \
36         asm volatile(                                   \
37                 "0:     j       0b+2\n"                 \
38                 "1:\n"                                  \
39                 ".section __bug_table,\"a\"\n"          \
40                 "2:\t"  S390_LONG "\t1b\n"              \
41                 "       .short  %0\n"                   \
42                 "       .org    2b+%1\n"                \
43                 ".previous\n"                           \
44                 : : "i" (x),                            \
45                     "i" (sizeof(struct bug_entry)));    \
46 } while (0)
47
48 #endif /* CONFIG_DEBUG_BUGVERBOSE */
49
50 #define BUG() do {                                      \
51         __EMIT_BUG(0);                                  \
52         unreachable();                                  \
53 } while (0)
54
55 #define __WARN() do {                                   \
56         __EMIT_BUG(BUGFLAG_WARNING);                    \
57 } while (0)
58
59 #define WARN_ON(x) ({                                   \
60         int __ret_warn_on = !!(x);                      \
61         if (__builtin_constant_p(__ret_warn_on)) {      \
62                 if (__ret_warn_on)                      \
63                         __EMIT_BUG(BUGFLAG_WARNING);    \
64         } else {                                        \
65                 if (unlikely(__ret_warn_on))            \
66                         __EMIT_BUG(BUGFLAG_WARNING);    \
67         }                                               \
68         unlikely(__ret_warn_on);                        \
69 })
70
71 #define HAVE_ARCH_BUG
72 #define HAVE_ARCH_WARN_ON
73 #endif /* CONFIG_BUG */
74
75 #include <asm-generic/bug.h>
76
77 #endif /* _ASM_S390_BUG_H */