linux/include/asm-generic/bug.h
<<
>>
Prefs
   1#ifndef _ASM_GENERIC_BUG_H
   2#define _ASM_GENERIC_BUG_H
   3
   4#include <linux/compiler.h>
   5
   6#ifdef CONFIG_GENERIC_BUG
   7#define BUGFLAG_WARNING         (1 << 0)
   8#define BUGFLAG_TAINT(taint)    (BUGFLAG_WARNING | ((taint) << 8))
   9#define BUG_GET_TAINT(bug)      ((bug)->flags >> 8)
  10#endif
  11
  12#ifndef __ASSEMBLY__
  13#include <linux/kernel.h>
  14
  15#ifdef CONFIG_BUG
  16
  17#ifdef CONFIG_GENERIC_BUG
  18struct bug_entry {
  19#ifndef CONFIG_GENERIC_BUG_RELATIVE_POINTERS
  20        unsigned long   bug_addr;
  21#else
  22        signed int      bug_addr_disp;
  23#endif
  24#ifdef CONFIG_DEBUG_BUGVERBOSE
  25#ifndef CONFIG_GENERIC_BUG_RELATIVE_POINTERS
  26        const char      *file;
  27#else
  28        signed int      file_disp;
  29#endif
  30        unsigned short  line;
  31#endif
  32        unsigned short  flags;
  33};
  34#endif  /* CONFIG_GENERIC_BUG */
  35
  36/*
  37 * Don't use BUG() or BUG_ON() unless there's really no way out; one
  38 * example might be detecting data structure corruption in the middle
  39 * of an operation that can't be backed out of.  If the (sub)system
  40 * can somehow continue operating, perhaps with reduced functionality,
  41 * it's probably not BUG-worthy.
  42 *
  43 * If you're tempted to BUG(), think again:  is completely giving up
  44 * really the *only* solution?  There are usually better options, where
  45 * users don't need to reboot ASAP and can mostly shut down cleanly.
  46 */
  47#ifndef HAVE_ARCH_BUG
  48#define BUG() do { \
  49        printk("BUG: failure at %s:%d/%s()!\n", __FILE__, __LINE__, __func__); \
  50        panic("BUG!"); \
  51} while (0)
  52#endif
  53
  54#ifndef HAVE_ARCH_BUG_ON
  55#define BUG_ON(condition) do { if (unlikely(condition)) BUG(); } while (0)
  56#endif
  57
  58/*
  59 * WARN(), WARN_ON(), WARN_ON_ONCE, and so on can be used to report
  60 * significant issues that need prompt attention if they should ever
  61 * appear at runtime.  Use the versions with printk format strings
  62 * to provide better diagnostics.
  63 */
  64#ifndef __WARN_TAINT
  65extern __printf(3, 4)
  66void warn_slowpath_fmt(const char *file, const int line,
  67                       const char *fmt, ...);
  68extern __printf(4, 5)
  69void warn_slowpath_fmt_taint(const char *file, const int line, unsigned taint,
  70                             const char *fmt, ...);
  71extern void warn_slowpath_null(const char *file, const int line);
  72#define WANT_WARN_ON_SLOWPATH
  73#define __WARN()                warn_slowpath_null(__FILE__, __LINE__)
  74#define __WARN_printf(arg...)   warn_slowpath_fmt(__FILE__, __LINE__, arg)
  75#define __WARN_printf_taint(taint, arg...)                              \
  76        warn_slowpath_fmt_taint(__FILE__, __LINE__, taint, arg)
  77#else
  78#define __WARN()                __WARN_TAINT(TAINT_WARN)
  79#define __WARN_printf(arg...)   do { printk(arg); __WARN(); } while (0)
  80#define __WARN_printf_taint(taint, arg...)                              \
  81        do { printk(arg); __WARN_TAINT(taint); } while (0)
  82#endif
  83
  84#ifndef WARN_ON
  85#define WARN_ON(condition) ({                                           \
  86        int __ret_warn_on = !!(condition);                              \
  87        if (unlikely(__ret_warn_on))                                    \
  88                __WARN();                                               \
  89        unlikely(__ret_warn_on);                                        \
  90})
  91#endif
  92
  93#ifndef WARN
  94#define WARN(condition, format...) ({                                           \
  95        int __ret_warn_on = !!(condition);                              \
  96        if (unlikely(__ret_warn_on))                                    \
  97                __WARN_printf(format);                                  \
  98        unlikely(__ret_warn_on);                                        \
  99})
 100#endif
 101
 102#define WARN_TAINT(condition, taint, format...) ({                      \
 103        int __ret_warn_on = !!(condition);                              \
 104        if (unlikely(__ret_warn_on))                                    \
 105                __WARN_printf_taint(taint, format);                     \
 106        unlikely(__ret_warn_on);                                        \
 107})
 108
 109#define WARN_ON_ONCE(condition) ({                              \
 110        static bool __section(.data.unlikely) __warned;         \
 111        int __ret_warn_once = !!(condition);                    \
 112                                                                \
 113        if (unlikely(__ret_warn_once))                          \
 114                if (WARN_ON(!__warned))                         \
 115                        __warned = true;                        \
 116        unlikely(__ret_warn_once);                              \
 117})
 118
 119#define WARN_ONCE(condition, format...) ({                      \
 120        static bool __section(.data.unlikely) __warned;         \
 121        int __ret_warn_once = !!(condition);                    \
 122                                                                \
 123        if (unlikely(__ret_warn_once))                          \
 124                if (WARN(!__warned, format))                    \
 125                        __warned = true;                        \
 126        unlikely(__ret_warn_once);                              \
 127})
 128
 129#define WARN_TAINT_ONCE(condition, taint, format...)    ({      \
 130        static bool __section(.data.unlikely) __warned;         \
 131        int __ret_warn_once = !!(condition);                    \
 132                                                                \
 133        if (unlikely(__ret_warn_once))                          \
 134                if (WARN_TAINT(!__warned, taint, format))       \
 135                        __warned = true;                        \
 136        unlikely(__ret_warn_once);                              \
 137})
 138
 139#else /* !CONFIG_BUG */
 140#ifndef HAVE_ARCH_BUG
 141#define BUG() do {} while (1)
 142#endif
 143
 144#ifndef HAVE_ARCH_BUG_ON
 145#define BUG_ON(condition) do { if (condition) ; } while (0)
 146#endif
 147
 148#ifndef HAVE_ARCH_WARN_ON
 149#define WARN_ON(condition) ({                                           \
 150        int __ret_warn_on = !!(condition);                              \
 151        unlikely(__ret_warn_on);                                        \
 152})
 153#endif
 154
 155#ifndef WARN
 156#define WARN(condition, format...) ({                                   \
 157        int __ret_warn_on = !!(condition);                              \
 158        no_printk(format);                                              \
 159        unlikely(__ret_warn_on);                                        \
 160})
 161#endif
 162
 163#define WARN_ON_ONCE(condition) WARN_ON(condition)
 164#define WARN_ONCE(condition, format...) WARN(condition, format)
 165#define WARN_TAINT(condition, taint, format...) WARN(condition, format)
 166#define WARN_TAINT_ONCE(condition, taint, format...) WARN(condition, format)
 167
 168#endif
 169
 170/*
 171 * WARN_ON_SMP() is for cases that the warning is either
 172 * meaningless for !SMP or may even cause failures.
 173 * This is usually used for cases that we have
 174 * WARN_ON(!spin_is_locked(&lock)) checks, as spin_is_locked()
 175 * returns 0 for uniprocessor settings.
 176 * It can also be used with values that are only defined
 177 * on SMP:
 178 *
 179 * struct foo {
 180 *  [...]
 181 * #ifdef CONFIG_SMP
 182 *      int bar;
 183 * #endif
 184 * };
 185 *
 186 * void func(struct foo *zoot)
 187 * {
 188 *      WARN_ON_SMP(!zoot->bar);
 189 *
 190 * For CONFIG_SMP, WARN_ON_SMP() should act the same as WARN_ON(),
 191 * and should be a nop and return false for uniprocessor.
 192 *
 193 * if (WARN_ON_SMP(x)) returns true only when CONFIG_SMP is set
 194 * and x is true.
 195 */
 196#ifdef CONFIG_SMP
 197# define WARN_ON_SMP(x)                 WARN_ON(x)
 198#else
 199/*
 200 * Use of ({0;}) because WARN_ON_SMP(x) may be used either as
 201 * a stand alone line statement or as a condition in an if ()
 202 * statement.
 203 * A simple "0" would cause gcc to give a "statement has no effect"
 204 * warning.
 205 */
 206# define WARN_ON_SMP(x)                 ({0;})
 207#endif
 208
 209#endif /* __ASSEMBLY__ */
 210
 211#endif
 212