1 #ifndef __ASM_SH_BUG_H 2 #define __ASM_SH_BUG_H 3 4 #include <linux/linkage.h> 5 6 #define TRAPA_BUG_OPCODE 0xc33e /* trapa #0x3e */ 7 #define BUGFLAG_UNWINDER (1 << 1) 8 9 #ifdef CONFIG_GENERIC_BUG 10 #define HAVE_ARCH_BUG 11 #define HAVE_ARCH_WARN_ON 12 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 */ 25 #ifdef CONFIG_DEBUG_BUGVERBOSE 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 40 41 #define BUG() \ 42 do { \ 43 __asm__ __volatile__ ( \ 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))); \ 51 } while (0) 52 53 #define __WARN_FLAGS(flags) \ 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__), \ 62 "i" (BUGFLAG_WARNING|(flags)), \ 63 "i" (sizeof(struct bug_entry))); \ 64 } while (0) 65 66 #define WARN_ON(x) ({ \ 67 int __ret_warn_on = !!(x); \ 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 }) 77 78 #define UNWINDER_BUG() \ 79 do { \ 80 __asm__ __volatile__ ( \ 81 "1:\t.short %O0\n" \ 82 _EMIT_BUG_ENTRY \ 83 : \ 84 : "n" (TRAPA_BUG_OPCODE), \ 85 "i" (__FILE__), \ 86 "i" (__LINE__), \ 87 "i" (BUGFLAG_UNWINDER), \ 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 103 #else 104 105 #define UNWINDER_BUG BUG 106 #define UNWINDER_BUG_ON BUG_ON 107 108 #endif /* CONFIG_GENERIC_BUG */ 109 110 #include <asm-generic/bug.h> 111 112 struct pt_regs; 113 114 /* arch/sh/kernel/traps.c */ 115 extern void die(const char *str, struct pt_regs *regs, long err) __attribute__ ((noreturn)); 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); 118 119 #endif /* __ASM_SH_BUG_H */ 120