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__ 10struct 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__ 61extern 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