/* SPDX-License-Identifier: GPL-2.0 */ #ifndef _ASM_GENERIC_BUG_H #define _ASM_GENERIC_BUG_H #include <linux/compiler.h> #include <linux/instrumentation.h> #include <linux/once_lite.h> #define CUT_HERE … #ifdef CONFIG_GENERIC_BUG #define BUGFLAG_WARNING … #define BUGFLAG_ONCE … #define BUGFLAG_DONE … #define BUGFLAG_NO_CUT_HERE … #define BUGFLAG_TAINT(taint) … #define BUG_GET_TAINT(bug) … #endif #ifndef __ASSEMBLY__ #include <linux/panic.h> #include <linux/printk.h> struct warn_args; struct pt_regs; void __warn(const char *file, int line, void *caller, unsigned taint, struct pt_regs *regs, struct warn_args *args); #ifdef CONFIG_BUG #ifdef CONFIG_GENERIC_BUG struct bug_entry { … }; #endif /* CONFIG_GENERIC_BUG */ /* * Don't use BUG() or BUG_ON() unless there's really no way out; one * example might be detecting data structure corruption in the middle * of an operation that can't be backed out of. If the (sub)system * can somehow continue operating, perhaps with reduced functionality, * it's probably not BUG-worthy. * * If you're tempted to BUG(), think again: is completely giving up * really the *only* solution? There are usually better options, where * users don't need to reboot ASAP and can mostly shut down cleanly. */ #ifndef HAVE_ARCH_BUG #define BUG … #endif #ifndef HAVE_ARCH_BUG_ON #define BUG_ON(condition) … #endif /* * WARN(), WARN_ON(), WARN_ON_ONCE(), and so on can be used to report * significant kernel issues that need prompt attention if they should ever * appear at runtime. * * Do not use these macros when checking for invalid external inputs * (e.g. invalid system call arguments, or invalid data coming from * network/devices), and on transient conditions like ENOMEM or EAGAIN. * These macros should be used for recoverable kernel issues only. * For invalid external inputs, transient conditions, etc use * pr_err[_once/_ratelimited]() followed by dump_stack(), if necessary. * Do not include "BUG"/"WARNING" in format strings manually to make these * conditions distinguishable from kernel issues. * * Use the versions with printk format strings to provide better diagnostics. */ extern __printf(4, 5) void warn_slowpath_fmt(const char *file, const int line, unsigned taint, const char *fmt, ...); extern __printf(1, 2) void __warn_printk(const char *fmt, ...); #ifndef __WARN_FLAGS #define __WARN … #define __WARN_printf … #else #define __WARN() … #define __WARN_printf(taint, arg...) … #define WARN_ON_ONCE(condition) … #endif /* used internally by panic.c */ #ifndef WARN_ON #define WARN_ON(condition) … #endif #ifndef WARN #define WARN(condition, format...) … #endif #define WARN_TAINT(condition, taint, format...) … #ifndef WARN_ON_ONCE #define WARN_ON_ONCE … #endif #define WARN_ONCE(condition, format...) … #define WARN_TAINT_ONCE(condition, taint, format...) … #else /* !CONFIG_BUG */ #ifndef HAVE_ARCH_BUG #define BUG … #endif #ifndef HAVE_ARCH_BUG_ON #define BUG_ON … #endif #ifndef HAVE_ARCH_WARN_ON #define WARN_ON … #endif #ifndef WARN #define WARN … #endif #define WARN_ON_ONCE … #define WARN_ONCE … #define WARN_TAINT … #define WARN_TAINT_ONCE … #endif /* * WARN_ON_SMP() is for cases that the warning is either * meaningless for !SMP or may even cause failures. * It can also be used with values that are only defined * on SMP: * * struct foo { * [...] * #ifdef CONFIG_SMP * int bar; * #endif * }; * * void func(struct foo *zoot) * { * WARN_ON_SMP(!zoot->bar); * * For CONFIG_SMP, WARN_ON_SMP() should act the same as WARN_ON(), * and should be a nop and return false for uniprocessor. * * if (WARN_ON_SMP(x)) returns true only when CONFIG_SMP is set * and x is true. */ #ifdef CONFIG_SMP #define WARN_ON_SMP(x) … #else /* * Use of ({0;}) because WARN_ON_SMP(x) may be used either as * a stand alone line statement or as a condition in an if () * statement. * A simple "0" would cause gcc to give a "statement has no effect" * warning. */ #define WARN_ON_SMP … #endif #endif /* __ASSEMBLY__ */ #endif