1 #ifndef _ASM_GENERIC_BUG_H 2 #define _ASM_GENERIC_BUG_H 3 4 #include <linux/compiler.h> 5 6 #ifdef CONFIG_BUG 7 8 #ifdef CONFIG_GENERIC_BUG 9 #ifndef __ASSEMBLY__ 10 struct bug_entry { 11 #ifndef CONFIG_GENERIC_BUG_RELATIVE_POINTERS 12 unsigned long bug_addr; 13 #else 14 signed int bug_addr_disp; 15 #endif 16 #ifdef CONFIG_DEBUG_BUGVERBOSE 17 #ifndef CONFIG_GENERIC_BUG_RELATIVE_POINTERS 18 const char *file; 19 #else 20 signed int file_disp; 21 #endif 22 unsigned short line; 23 #endif 24 unsigned short flags; 25 }; 26 #endif /* __ASSEMBLY__ */ 27 28 #define BUGFLAG_WARNING (1<<0) 29 #endif /* CONFIG_GENERIC_BUG */ 30 31 /* 32 * Don't use BUG() or BUG_ON() unless there's really no way out; one 33 * example might be detecting data structure corruption in the middle 34 * of an operation that can't be backed out of. If the (sub)system 35 * can somehow continue operating, perhaps with reduced functionality, 36 * it's probably not BUG-worthy. 37 * 38 * If you're tempted to BUG(), think again: is completely giving up 39 * really the *only* solution? There are usually better options, where 40 * users don't need to reboot ASAP and can mostly shut down cleanly. 41 */ 42 #ifndef HAVE_ARCH_BUG 43 #define BUG() do { \ 44 printk("BUG: failure at %s:%d/%s()!\n", __FILE__, __LINE__, __func__); \ 45 panic("BUG!"); \ 46 } while (0) 47 #endif 48 49 #ifndef HAVE_ARCH_BUG_ON 50 #define BUG_ON(condition) do { if (unlikely(condition)) BUG(); } while(0) 51 #endif 52 53 /* 54 * WARN(), WARN_ON(), WARN_ON_ONCE, and so on can be used to report 55 * significant issues that need prompt attention if they should ever 56 * appear at runtime. Use the versions with printk format strings 57 * to provide better diagnostics. 58 */ 59 #ifndef __WARN 60 #ifndef __ASSEMBLY__ 61 extern void warn_slowpath(const char *file, const int line, 62 const char *fmt, ...) __attribute__((format(printf, 3, 4))); 63 #define WANT_WARN_ON_SLOWPATH 64 #endif 65 #define __WARN() warn_slowpath(__FILE__, __LINE__, NULL) 66 #define __WARN_printf(arg...) warn_slowpath(__FILE__, __LINE__, arg) 67 #else 68 #define __WARN_printf(arg...) do { printk(arg); __WARN(); } while (0) 69 #endif 70 71 #ifndef WARN_ON 72 #define WARN_ON(condition) ({ \ 73 int __ret_warn_on = !!(condition); \ 74 if (unlikely(__ret_warn_on)) \ 75 __WARN(); \ 76 unlikely(__ret_warn_on); \ 77 }) 78 #endif 79 80 #ifndef WARN 81 #define WARN(condition, format...) ({ \ 82 int __ret_warn_on = !!(condition); \ 83 if (unlikely(__ret_warn_on)) \ 84 __WARN_printf(format); \ 85 unlikely(__ret_warn_on); \ 86 }) 87 #endif 88 89 #else /* !CONFIG_BUG */ 90 #ifndef HAVE_ARCH_BUG 91 #define BUG() 92 #endif 93 94 #ifndef HAVE_ARCH_BUG_ON 95 #define BUG_ON(condition) do { if (condition) ; } while(0) 96 #endif 97 98 #ifndef HAVE_ARCH_WARN_ON 99 #define WARN_ON(condition) ({ \ 100 int __ret_warn_on = !!(condition); \ 101 unlikely(__ret_warn_on); \ 102 }) 103 #endif 104 105 #ifndef WARN 106 #define WARN(condition, format...) ({ \ 107 int __ret_warn_on = !!(condition); \ 108 unlikely(__ret_warn_on); \ 109 }) 110 #endif 111 112 #endif 113 114 #define WARN_ON_ONCE(condition) ({ \ 115 static int __warned; \ 116 int __ret_warn_once = !!(condition); \ 117 \ 118 if (unlikely(__ret_warn_once)) \ 119 if (WARN_ON(!__warned)) \ 120 __warned = 1; \ 121 unlikely(__ret_warn_once); \ 122 }) 123 124 #define WARN_ONCE(condition, format...) ({ \ 125 static int __warned; \ 126 int __ret_warn_once = !!(condition); \ 127 \ 128 if (unlikely(__ret_warn_once)) \ 129 if (WARN(!__warned, format)) \ 130 __warned = 1; \ 131 unlikely(__ret_warn_once); \ 132 }) 133 134 #define WARN_ON_RATELIMIT(condition, state) \ 135 WARN_ON((condition) && __ratelimit(state)) 136 137 #ifdef CONFIG_SMP 138 # define WARN_ON_SMP(x) WARN_ON(x) 139 #else 140 # define WARN_ON_SMP(x) do { } while (0) 141 #endif 142 143 #endif 144