11da177e4SLinus Torvalds #ifndef _ASM_GENERIC_BUG_H 21da177e4SLinus Torvalds #define _ASM_GENERIC_BUG_H 31da177e4SLinus Torvalds 41da177e4SLinus Torvalds #include <linux/compiler.h> 51da177e4SLinus Torvalds 6c8538a7aSMatt Mackall #ifdef CONFIG_BUG 77664c5a1SJeremy Fitzhardinge 87664c5a1SJeremy Fitzhardinge #ifdef CONFIG_GENERIC_BUG 97664c5a1SJeremy Fitzhardinge #ifndef __ASSEMBLY__ 107664c5a1SJeremy Fitzhardinge struct bug_entry { 11b93a531eSJan Beulich #ifndef CONFIG_GENERIC_BUG_RELATIVE_POINTERS 127664c5a1SJeremy Fitzhardinge unsigned long bug_addr; 13b93a531eSJan Beulich #else 14b93a531eSJan Beulich signed int bug_addr_disp; 15b93a531eSJan Beulich #endif 167664c5a1SJeremy Fitzhardinge #ifdef CONFIG_DEBUG_BUGVERBOSE 17b93a531eSJan Beulich #ifndef CONFIG_GENERIC_BUG_RELATIVE_POINTERS 187664c5a1SJeremy Fitzhardinge const char *file; 19b93a531eSJan Beulich #else 20b93a531eSJan Beulich signed int file_disp; 21b93a531eSJan Beulich #endif 227664c5a1SJeremy Fitzhardinge unsigned short line; 237664c5a1SJeremy Fitzhardinge #endif 247664c5a1SJeremy Fitzhardinge unsigned short flags; 257664c5a1SJeremy Fitzhardinge }; 267664c5a1SJeremy Fitzhardinge #endif /* __ASSEMBLY__ */ 277664c5a1SJeremy Fitzhardinge 287664c5a1SJeremy Fitzhardinge #define BUGFLAG_WARNING (1<<0) 297664c5a1SJeremy Fitzhardinge #endif /* CONFIG_GENERIC_BUG */ 307664c5a1SJeremy Fitzhardinge 31af9379c7SDavid Brownell /* 32af9379c7SDavid Brownell * Don't use BUG() or BUG_ON() unless there's really no way out; one 33af9379c7SDavid Brownell * example might be detecting data structure corruption in the middle 34af9379c7SDavid Brownell * of an operation that can't be backed out of. If the (sub)system 35af9379c7SDavid Brownell * can somehow continue operating, perhaps with reduced functionality, 36af9379c7SDavid Brownell * it's probably not BUG-worthy. 37af9379c7SDavid Brownell * 38af9379c7SDavid Brownell * If you're tempted to BUG(), think again: is completely giving up 39af9379c7SDavid Brownell * really the *only* solution? There are usually better options, where 40af9379c7SDavid Brownell * users don't need to reboot ASAP and can mostly shut down cleanly. 41af9379c7SDavid Brownell */ 421da177e4SLinus Torvalds #ifndef HAVE_ARCH_BUG 431da177e4SLinus Torvalds #define BUG() do { \ 44d5c003b4SHarvey Harrison printk("BUG: failure at %s:%d/%s()!\n", __FILE__, __LINE__, __func__); \ 451da177e4SLinus Torvalds panic("BUG!"); \ 461da177e4SLinus Torvalds } while (0) 471da177e4SLinus Torvalds #endif 481da177e4SLinus Torvalds 491da177e4SLinus Torvalds #ifndef HAVE_ARCH_BUG_ON 502a41de48SAlexey Dobriyan #define BUG_ON(condition) do { if (unlikely(condition)) BUG(); } while(0) 511da177e4SLinus Torvalds #endif 521da177e4SLinus Torvalds 53af9379c7SDavid Brownell /* 54af9379c7SDavid Brownell * WARN(), WARN_ON(), WARN_ON_ONCE, and so on can be used to report 55af9379c7SDavid Brownell * significant issues that need prompt attention if they should ever 56af9379c7SDavid Brownell * appear at runtime. Use the versions with printk format strings 57af9379c7SDavid Brownell * to provide better diagnostics. 58af9379c7SDavid Brownell */ 593a6a62f9SOlof Johansson #ifndef __WARN 6079b4cc5eSArjan van de Ven #ifndef __ASSEMBLY__ 6157adc4d2SAndi Kleen extern void warn_slowpath_fmt(const char *file, const int line, 62a8f18b90SArjan van de Ven const char *fmt, ...) __attribute__((format(printf, 3, 4))); 6357adc4d2SAndi Kleen extern void warn_slowpath_null(const char *file, const int line); 6479b4cc5eSArjan van de Ven #define WANT_WARN_ON_SLOWPATH 6579b4cc5eSArjan van de Ven #endif 6657adc4d2SAndi Kleen #define __WARN() warn_slowpath_null(__FILE__, __LINE__) 6757adc4d2SAndi Kleen #define __WARN_printf(arg...) warn_slowpath_fmt(__FILE__, __LINE__, arg) 68a8f18b90SArjan van de Ven #else 69f6f286f3SArjan van de Ven #define __WARN_printf(arg...) do { printk(arg); __WARN(); } while (0) 703a6a62f9SOlof Johansson #endif 713a6a62f9SOlof Johansson 723a6a62f9SOlof Johansson #ifndef WARN_ON 733a6a62f9SOlof Johansson #define WARN_ON(condition) ({ \ 743a6a62f9SOlof Johansson int __ret_warn_on = !!(condition); \ 753a6a62f9SOlof Johansson if (unlikely(__ret_warn_on)) \ 763a6a62f9SOlof Johansson __WARN(); \ 77684f9783SHerbert Xu unlikely(__ret_warn_on); \ 78684f9783SHerbert Xu }) 791da177e4SLinus Torvalds #endif 801da177e4SLinus Torvalds 81a8f18b90SArjan van de Ven #ifndef WARN 82a8f18b90SArjan van de Ven #define WARN(condition, format...) ({ \ 83a8f18b90SArjan van de Ven int __ret_warn_on = !!(condition); \ 84a8f18b90SArjan van de Ven if (unlikely(__ret_warn_on)) \ 85a8f18b90SArjan van de Ven __WARN_printf(format); \ 86a8f18b90SArjan van de Ven unlikely(__ret_warn_on); \ 87a8f18b90SArjan van de Ven }) 88a8f18b90SArjan van de Ven #endif 89a8f18b90SArjan van de Ven 90c8538a7aSMatt Mackall #else /* !CONFIG_BUG */ 91c8538a7aSMatt Mackall #ifndef HAVE_ARCH_BUG 92da60682cSDavid Howells #define BUG() do {} while(0) 93c8538a7aSMatt Mackall #endif 94c8538a7aSMatt Mackall 95c8538a7aSMatt Mackall #ifndef HAVE_ARCH_BUG_ON 96c8538a7aSMatt Mackall #define BUG_ON(condition) do { if (condition) ; } while(0) 97c8538a7aSMatt Mackall #endif 98c8538a7aSMatt Mackall 99c8538a7aSMatt Mackall #ifndef HAVE_ARCH_WARN_ON 1008c7c7c9bSRalf Baechle #define WARN_ON(condition) ({ \ 1018d4fbcfbSLinus Torvalds int __ret_warn_on = !!(condition); \ 1028c7c7c9bSRalf Baechle unlikely(__ret_warn_on); \ 1038c7c7c9bSRalf Baechle }) 104c8538a7aSMatt Mackall #endif 105a8f18b90SArjan van de Ven 106a8f18b90SArjan van de Ven #ifndef WARN 107a8f18b90SArjan van de Ven #define WARN(condition, format...) ({ \ 108a8f18b90SArjan van de Ven int __ret_warn_on = !!(condition); \ 109a8f18b90SArjan van de Ven unlikely(__ret_warn_on); \ 110a8f18b90SArjan van de Ven }) 111a8f18b90SArjan van de Ven #endif 112a8f18b90SArjan van de Ven 113c8538a7aSMatt Mackall #endif 114c8538a7aSMatt Mackall 115684f9783SHerbert Xu #define WARN_ON_ONCE(condition) ({ \ 11642f247c8SCesar Eduardo Barros static bool __warned; \ 1178d4fbcfbSLinus Torvalds int __ret_warn_once = !!(condition); \ 11874bb6a09SIngo Molnar \ 119d69a8922SAndrew Morton if (unlikely(__ret_warn_once)) \ 120d69a8922SAndrew Morton if (WARN_ON(!__warned)) \ 12142f247c8SCesar Eduardo Barros __warned = true; \ 122684f9783SHerbert Xu unlikely(__ret_warn_once); \ 12374bb6a09SIngo Molnar }) 12474bb6a09SIngo Molnar 12545e9c0deSArjan van de Ven #define WARN_ONCE(condition, format...) ({ \ 12642f247c8SCesar Eduardo Barros static bool __warned; \ 12745e9c0deSArjan van de Ven int __ret_warn_once = !!(condition); \ 12845e9c0deSArjan van de Ven \ 12945e9c0deSArjan van de Ven if (unlikely(__ret_warn_once)) \ 13045e9c0deSArjan van de Ven if (WARN(!__warned, format)) \ 13142f247c8SCesar Eduardo Barros __warned = true; \ 13245e9c0deSArjan van de Ven unlikely(__ret_warn_once); \ 13345e9c0deSArjan van de Ven }) 13445e9c0deSArjan van de Ven 135717115e1SDave Young #define WARN_ON_RATELIMIT(condition, state) \ 136717115e1SDave Young WARN_ON((condition) && __ratelimit(state)) 137717115e1SDave Young 1388eb94f80SIngo Molnar #ifdef CONFIG_SMP 1398eb94f80SIngo Molnar # define WARN_ON_SMP(x) WARN_ON(x) 1408eb94f80SIngo Molnar #else 1418eb94f80SIngo Molnar # define WARN_ON_SMP(x) do { } while (0) 1428eb94f80SIngo Molnar #endif 1438eb94f80SIngo Molnar 1441da177e4SLinus Torvalds #endif 145