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_fmt(const char *file, const int line, 62 const char *fmt, ...) __attribute__((format(printf, 3, 4))); 63 extern void warn_slowpath_null(const char *file, const int line); 64 #define WANT_WARN_ON_SLOWPATH 65 #endif 66 #define __WARN() warn_slowpath_null(__FILE__, __LINE__) 67 #define __WARN_printf(arg...) warn_slowpath_fmt(__FILE__, __LINE__, arg) 68 #else 69 #define __WARN_printf(arg...) do { printk(arg); __WARN(); } while (0) 70 #endif 71 72 #ifndef WARN_ON 73 #define WARN_ON(condition) ({ \ 74 int __ret_warn_on = !!(condition); \ 75 if (unlikely(__ret_warn_on)) \ 76 __WARN(); \ 77 unlikely(__ret_warn_on); \ 78 }) 79 #endif 80 81 #ifndef WARN 82 #define WARN(condition, format...) ({ \ 83 int __ret_warn_on = !!(condition); \ 84 if (unlikely(__ret_warn_on)) \ 85 __WARN_printf(format); \ 86 unlikely(__ret_warn_on); \ 87 }) 88 #endif 89 90 #else /* !CONFIG_BUG */ 91 #ifndef HAVE_ARCH_BUG 92 #define BUG() do {} while(0) 93 #endif 94 95 #ifndef HAVE_ARCH_BUG_ON 96 #define BUG_ON(condition) do { if (condition) ; } while(0) 97 #endif 98 99 #ifndef HAVE_ARCH_WARN_ON 100 #define WARN_ON(condition) ({ \ 101 int __ret_warn_on = !!(condition); \ 102 unlikely(__ret_warn_on); \ 103 }) 104 #endif 105 106 #ifndef WARN 107 #define WARN(condition, format...) ({ \ 108 int __ret_warn_on = !!(condition); \ 109 unlikely(__ret_warn_on); \ 110 }) 111 #endif 112 113 #endif 114 115 #define WARN_ON_ONCE(condition) ({ \ 116 static int __warned; \ 117 int __ret_warn_once = !!(condition); \ 118 \ 119 if (unlikely(__ret_warn_once)) \ 120 if (WARN_ON(!__warned)) \ 121 __warned = 1; \ 122 unlikely(__ret_warn_once); \ 123 }) 124 125 #define WARN_ONCE(condition, format...) ({ \ 126 static int __warned; \ 127 int __ret_warn_once = !!(condition); \ 128 \ 129 if (unlikely(__ret_warn_once)) \ 130 if (WARN(!__warned, format)) \ 131 __warned = 1; \ 132 unlikely(__ret_warn_once); \ 133 }) 134 135 #define WARN_ON_RATELIMIT(condition, state) \ 136 WARN_ON((condition) && __ratelimit(state)) 137 138 #ifdef CONFIG_SMP 139 # define WARN_ON_SMP(x) WARN_ON(x) 140 #else 141 # define WARN_ON_SMP(x) do { } while (0) 142 #endif 143 144 #endif 145