Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

  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
  18. struct 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
  65. extern __printf(3, 4)
  66. void warn_slowpath_fmt(const char *file, const int line,
  67.                        const char *fmt, ...);
  68. extern __printf(4, 5)
  69. void warn_slowpath_fmt_taint(const char *file, const int line, unsigned taint,
  70.                              const char *fmt, ...);
  71. extern 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.