Commit | Line | Data |
---|---|---|
1da177e4 LT |
1 | #ifndef __ASM_SH_BUG_H |
2 | #define __ASM_SH_BUG_H | |
3 | ||
e839ca52 DH |
4 | #include <linux/linkage.h> |
5 | ||
44530c69 | 6 | #define TRAPA_BUG_OPCODE 0xc33e /* trapa #0x3e */ |
e115f2c1 | 7 | #define BUGFLAG_UNWINDER (1 << 1) |
44530c69 | 8 | |
e1cd93ea | 9 | #ifdef CONFIG_GENERIC_BUG |
fa691511 PM |
10 | #define HAVE_ARCH_BUG |
11 | #define HAVE_ARCH_WARN_ON | |
dc34d312 | 12 | |
fa691511 PM |
13 | /** |
14 | * _EMIT_BUG_ENTRY | |
15 | * %1 - __FILE__ | |
16 | * %2 - __LINE__ | |
17 | * %3 - trap type | |
18 | * %4 - sizeof(struct bug_entry) | |
19 | * | |
20 | * The trapa opcode itself sits in %0. | |
21 | * The %O notation is used to avoid # generation. | |
22 | * | |
23 | * The offending file and line are encoded in the __bug_table section. | |
24 | */ | |
dc34d312 | 25 | #ifdef CONFIG_DEBUG_BUGVERBOSE |
fa691511 PM |
26 | #define _EMIT_BUG_ENTRY \ |
27 | "\t.pushsection __bug_table,\"a\"\n" \ | |
28 | "2:\t.long 1b, %O1\n" \ | |
29 | "\t.short %O2, %O3\n" \ | |
30 | "\t.org 2b+%O4\n" \ | |
31 | "\t.popsection\n" | |
32 | #else | |
33 | #define _EMIT_BUG_ENTRY \ | |
34 | "\t.pushsection __bug_table,\"a\"\n" \ | |
35 | "2:\t.long 1b\n" \ | |
36 | "\t.short %O3\n" \ | |
37 | "\t.org 2b+%O4\n" \ | |
38 | "\t.popsection\n" | |
39 | #endif | |
dc34d312 PM |
40 | |
41 | #define BUG() \ | |
42 | do { \ | |
43 | __asm__ __volatile__ ( \ | |
fa691511 PM |
44 | "1:\t.short %O0\n" \ |
45 | _EMIT_BUG_ENTRY \ | |
46 | : \ | |
47 | : "n" (TRAPA_BUG_OPCODE), \ | |
48 | "i" (__FILE__), \ | |
49 | "i" (__LINE__), "i" (0), \ | |
50 | "i" (sizeof(struct bug_entry))); \ | |
dc34d312 PM |
51 | } while (0) |
52 | ||
b2be0527 | 53 | #define __WARN_TAINT(taint) \ |
fa691511 PM |
54 | do { \ |
55 | __asm__ __volatile__ ( \ | |
56 | "1:\t.short %O0\n" \ | |
57 | _EMIT_BUG_ENTRY \ | |
58 | : \ | |
59 | : "n" (TRAPA_BUG_OPCODE), \ | |
60 | "i" (__FILE__), \ | |
61 | "i" (__LINE__), \ | |
b2be0527 | 62 | "i" (BUGFLAG_TAINT(taint)), \ |
fa691511 | 63 | "i" (sizeof(struct bug_entry))); \ |
1da177e4 LT |
64 | } while (0) |
65 | ||
fa691511 | 66 | #define WARN_ON(x) ({ \ |
fd0cbdd3 | 67 | int __ret_warn_on = !!(x); \ |
fa691511 PM |
68 | if (__builtin_constant_p(__ret_warn_on)) { \ |
69 | if (__ret_warn_on) \ | |
70 | __WARN(); \ | |
71 | } else { \ | |
72 | if (unlikely(__ret_warn_on)) \ | |
73 | __WARN(); \ | |
74 | } \ | |
75 | unlikely(__ret_warn_on); \ | |
76 | }) | |
dc34d312 | 77 | |
e115f2c1 | 78 | #define UNWINDER_BUG() \ |
b344e24a MF |
79 | do { \ |
80 | __asm__ __volatile__ ( \ | |
81 | "1:\t.short %O0\n" \ | |
e115f2c1 | 82 | _EMIT_BUG_ENTRY \ |
b344e24a | 83 | : \ |
e115f2c1 | 84 | : "n" (TRAPA_BUG_OPCODE), \ |
b344e24a | 85 | "i" (__FILE__), \ |
e115f2c1 PM |
86 | "i" (__LINE__), \ |
87 | "i" (BUGFLAG_UNWINDER), \ | |
b344e24a MF |
88 | "i" (sizeof(struct bug_entry))); \ |
89 | } while (0) | |
90 | ||
91 | #define UNWINDER_BUG_ON(x) ({ \ | |
92 | int __ret_unwinder_on = !!(x); \ | |
93 | if (__builtin_constant_p(__ret_unwinder_on)) { \ | |
94 | if (__ret_unwinder_on) \ | |
95 | UNWINDER_BUG(); \ | |
96 | } else { \ | |
97 | if (unlikely(__ret_unwinder_on)) \ | |
98 | UNWINDER_BUG(); \ | |
99 | } \ | |
100 | unlikely(__ret_unwinder_on); \ | |
101 | }) | |
102 | ||
74db2479 PM |
103 | #else |
104 | ||
105 | #define UNWINDER_BUG BUG | |
106 | #define UNWINDER_BUG_ON BUG_ON | |
107 | ||
e1cd93ea | 108 | #endif /* CONFIG_GENERIC_BUG */ |
c8538a7a | 109 | |
1da177e4 LT |
110 | #include <asm-generic/bug.h> |
111 | ||
e839ca52 | 112 | struct pt_regs; |
5f857bce PM |
113 | |
114 | /* arch/sh/kernel/traps.c */ | |
e839ca52 | 115 | extern void die(const char *str, struct pt_regs *regs, long err) __attribute__ ((noreturn)); |
5f857bce PM |
116 | extern void die_if_kernel(const char *str, struct pt_regs *regs, long err); |
117 | extern void die_if_no_fixup(const char *str, struct pt_regs *regs, long err); | |
e839ca52 | 118 | |
dc34d312 | 119 | #endif /* __ASM_SH_BUG_H */ |