diff --git a/include/common/debug.h b/include/common/debug.h index 8f6d123425..014e5eeb8f 100644 --- a/include/common/debug.h +++ b/include/common/debug.h @@ -42,6 +42,32 @@ */ #define ABORT_NOW() (*(volatile int*)1=0) +/* BUG_ON: complains if is true when DEBUG_STRICT or DEBUG_STRICT_NOCRASH + * are set, does nothing otherwise. With DEBUG_STRICT in addition it immediately + * crashes using ABORT_NOW() above. + */ +#if defined(DEBUG_STRICT) || defined(DEBUG_STRICT_NOCRASH) +#if defined(DEBUG_STRICT) +#define CRASH_NOW() ABORT_NOW() +#else +#define CRASH_NOW() +#endif + +#define BUG_ON(cond) _BUG_ON(cond, __FILE__, __LINE__) +#define _BUG_ON(cond, file, line) __BUG_ON(cond, file, line) +#define __BUG_ON(cond, file, line) \ + do { \ + if (unlikely(cond)) { \ + const char msg[] = "\nFATAL: bug condition \"" #cond "\" matched at " file ":" #line "\n"; \ + (void)write(2, msg, strlen(msg)); \ + CRASH_NOW(); \ + } \ + } while (0) +#else +#undef CRASH_NOW +#define BUG_ON(cond) +#endif + /* this one is provided for easy code tracing. * Usage: TRACE(strm||0, fmt, args...); * TRACE(strm, "");