bug.h 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. #ifndef _ASM_GENERIC_BUG_H
  2. #define _ASM_GENERIC_BUG_H
  3. #include <linux/compiler.h>
  4. #ifdef CONFIG_BUG
  5. #ifdef CONFIG_GENERIC_BUG
  6. #ifndef __ASSEMBLY__
  7. struct bug_entry {
  8. unsigned long bug_addr;
  9. #ifdef CONFIG_DEBUG_BUGVERBOSE
  10. const char *file;
  11. unsigned short line;
  12. #endif
  13. unsigned short flags;
  14. };
  15. #endif /* __ASSEMBLY__ */
  16. #define BUGFLAG_WARNING (1<<0)
  17. #endif /* CONFIG_GENERIC_BUG */
  18. #ifndef HAVE_ARCH_BUG
  19. #define BUG() do { \
  20. printk("BUG: failure at %s:%d/%s()!\n", __FILE__, __LINE__, __func__); \
  21. panic("BUG!"); \
  22. } while (0)
  23. #endif
  24. #ifndef HAVE_ARCH_BUG_ON
  25. #define BUG_ON(condition) do { if (unlikely(condition)) BUG(); } while(0)
  26. #endif
  27. #ifndef __WARN
  28. #ifndef __ASSEMBLY__
  29. extern void warn_on_slowpath(const char *file, const int line);
  30. extern void warn_slowpath(const char *file, const int line,
  31. const char *fmt, ...) __attribute__((format(printf, 3, 4)));
  32. #define WANT_WARN_ON_SLOWPATH
  33. #endif
  34. #define __WARN() warn_on_slowpath(__FILE__, __LINE__)
  35. #define __WARN_printf(arg...) warn_slowpath(__FILE__, __LINE__, arg)
  36. #else
  37. #define __WARN_printf(arg...) do { printk(arg); __WARN(); } while (0)
  38. #endif
  39. #ifndef WARN_ON
  40. #define WARN_ON(condition) ({ \
  41. int __ret_warn_on = !!(condition); \
  42. if (unlikely(__ret_warn_on)) \
  43. __WARN(); \
  44. unlikely(__ret_warn_on); \
  45. })
  46. #endif
  47. #ifndef WARN
  48. #define WARN(condition, format...) ({ \
  49. int __ret_warn_on = !!(condition); \
  50. if (unlikely(__ret_warn_on)) \
  51. __WARN_printf(format); \
  52. unlikely(__ret_warn_on); \
  53. })
  54. #endif
  55. #else /* !CONFIG_BUG */
  56. #ifndef HAVE_ARCH_BUG
  57. #define BUG()
  58. #endif
  59. #ifndef HAVE_ARCH_BUG_ON
  60. #define BUG_ON(condition) do { if (condition) ; } while(0)
  61. #endif
  62. #ifndef HAVE_ARCH_WARN_ON
  63. #define WARN_ON(condition) ({ \
  64. int __ret_warn_on = !!(condition); \
  65. unlikely(__ret_warn_on); \
  66. })
  67. #endif
  68. #ifndef WARN
  69. #define WARN(condition, format...) ({ \
  70. int __ret_warn_on = !!(condition); \
  71. unlikely(__ret_warn_on); \
  72. })
  73. #endif
  74. #endif
  75. #define WARN_ON_ONCE(condition) ({ \
  76. static int __warned; \
  77. int __ret_warn_once = !!(condition); \
  78. \
  79. if (unlikely(__ret_warn_once)) \
  80. if (WARN_ON(!__warned)) \
  81. __warned = 1; \
  82. unlikely(__ret_warn_once); \
  83. })
  84. #define WARN_ONCE(condition, format...) ({ \
  85. static int __warned; \
  86. int __ret_warn_once = !!(condition); \
  87. \
  88. if (unlikely(__ret_warn_once)) \
  89. if (WARN(!__warned, format)) \
  90. __warned = 1; \
  91. unlikely(__ret_warn_once); \
  92. })
  93. #define WARN_ON_RATELIMIT(condition, state) \
  94. WARN_ON((condition) && __ratelimit(state))
  95. #ifdef CONFIG_SMP
  96. # define WARN_ON_SMP(x) WARN_ON(x)
  97. #else
  98. # define WARN_ON_SMP(x) do { } while (0)
  99. #endif
  100. #endif