Full support for Ginger Console
[linux-ginger.git] / arch / sh / include / asm / bug.h
blobd02c01b3e6b9fd899e2d09a5518f12beefa44c76
1 #ifndef __ASM_SH_BUG_H
2 #define __ASM_SH_BUG_H
4 #define TRAPA_BUG_OPCODE 0xc33e /* trapa #0x3e */
5 #define BUGFLAG_UNWINDER (1 << 1)
7 #ifdef CONFIG_GENERIC_BUG
8 #define HAVE_ARCH_BUG
9 #define HAVE_ARCH_WARN_ON
11 /**
12 * _EMIT_BUG_ENTRY
13 * %1 - __FILE__
14 * %2 - __LINE__
15 * %3 - trap type
16 * %4 - sizeof(struct bug_entry)
18 * The trapa opcode itself sits in %0.
19 * The %O notation is used to avoid # generation.
21 * The offending file and line are encoded in the __bug_table section.
23 #ifdef CONFIG_DEBUG_BUGVERBOSE
24 #define _EMIT_BUG_ENTRY \
25 "\t.pushsection __bug_table,\"a\"\n" \
26 "2:\t.long 1b, %O1\n" \
27 "\t.short %O2, %O3\n" \
28 "\t.org 2b+%O4\n" \
29 "\t.popsection\n"
30 #else
31 #define _EMIT_BUG_ENTRY \
32 "\t.pushsection __bug_table,\"a\"\n" \
33 "2:\t.long 1b\n" \
34 "\t.short %O3\n" \
35 "\t.org 2b+%O4\n" \
36 "\t.popsection\n"
37 #endif
39 #define BUG() \
40 do { \
41 __asm__ __volatile__ ( \
42 "1:\t.short %O0\n" \
43 _EMIT_BUG_ENTRY \
44 : \
45 : "n" (TRAPA_BUG_OPCODE), \
46 "i" (__FILE__), \
47 "i" (__LINE__), "i" (0), \
48 "i" (sizeof(struct bug_entry))); \
49 } while (0)
51 #define __WARN() \
52 do { \
53 __asm__ __volatile__ ( \
54 "1:\t.short %O0\n" \
55 _EMIT_BUG_ENTRY \
56 : \
57 : "n" (TRAPA_BUG_OPCODE), \
58 "i" (__FILE__), \
59 "i" (__LINE__), \
60 "i" (BUGFLAG_WARNING), \
61 "i" (sizeof(struct bug_entry))); \
62 } while (0)
64 #define WARN_ON(x) ({ \
65 int __ret_warn_on = !!(x); \
66 if (__builtin_constant_p(__ret_warn_on)) { \
67 if (__ret_warn_on) \
68 __WARN(); \
69 } else { \
70 if (unlikely(__ret_warn_on)) \
71 __WARN(); \
72 } \
73 unlikely(__ret_warn_on); \
76 #define UNWINDER_BUG() \
77 do { \
78 __asm__ __volatile__ ( \
79 "1:\t.short %O0\n" \
80 _EMIT_BUG_ENTRY \
81 : \
82 : "n" (TRAPA_BUG_OPCODE), \
83 "i" (__FILE__), \
84 "i" (__LINE__), \
85 "i" (BUGFLAG_UNWINDER), \
86 "i" (sizeof(struct bug_entry))); \
87 } while (0)
89 #define UNWINDER_BUG_ON(x) ({ \
90 int __ret_unwinder_on = !!(x); \
91 if (__builtin_constant_p(__ret_unwinder_on)) { \
92 if (__ret_unwinder_on) \
93 UNWINDER_BUG(); \
94 } else { \
95 if (unlikely(__ret_unwinder_on)) \
96 UNWINDER_BUG(); \
97 } \
98 unlikely(__ret_unwinder_on); \
101 #else
103 #define UNWINDER_BUG BUG
104 #define UNWINDER_BUG_ON BUG_ON
106 #endif /* CONFIG_GENERIC_BUG */
108 #include <asm-generic/bug.h>
110 #endif /* __ASM_SH_BUG_H */