/* 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 "------------[ cut here ]------------\n"
#ifdef CONFIG_GENERIC_BUG
#define BUGFLAG_WARNING (1 << 0 )
#define BUGFLAG_ONCE (1 << 1 )
#define BUGFLAG_DONE (1 << 2 )
#define BUGFLAG_NO_CUT_HERE (1 << 3 ) /* CUT_HERE already sent */
#define BUGFLAG_TAINT(taint) ((taint) << 8 )
#define BUG_GET_TAINT(bug) ((bug)->flags >> 8 )
#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 {
#ifndef CONFIG_GENERIC_BUG_RELATIVE_POINTERS
unsigned long bug_addr;
#else
signed int bug_addr_disp;
#endif
#ifdef CONFIG_DEBUG_BUGVERBOSE
#ifndef CONFIG_GENERIC_BUG_RELATIVE_POINTERS
const char *file;
#else
signed int file_disp;
#endif
unsigned short line;
#endif
unsigned short flags;
};
#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() do { \
printk("BUG: failure at %s:%d/%s()!\n" , __FILE__, __LINE__, __func__); \
barrier_before_unreachable(); \
panic("BUG!" ); \
} while (0 )
#endif
#ifndef HAVE_ARCH_BUG_ON
#define BUG_ON(condition) do { if (unlikely(condition)) BUG(); } while (0 )
#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() __WARN_printf(TAINT_WARN, NULL)
#define __WARN_printf(taint, arg...) do { \
instrumentation_begin(); \
warn_slowpath_fmt(__FILE__, __LINE__, taint, arg); \
instrumentation_end(); \
} while (0 )
#else
#define __WARN() __WARN_FLAGS(BUGFLAG_TAINT(TAINT_WARN))
#define __WARN_printf(taint, arg...) do { \
instrumentation_begin(); \
__warn_printk(arg); \
__WARN_FLAGS(BUGFLAG_NO_CUT_HERE | BUGFLAG_TAINT(taint));\
instrumentation_end(); \
} while (0 )
#define WARN_ON_ONCE(condition) ({ \
int __ret_warn_on = !!(condition); \
if (unlikely(__ret_warn_on)) \
__WARN_FLAGS(BUGFLAG_ONCE | \
BUGFLAG_TAINT(TAINT_WARN)); \
unlikely(__ret_warn_on); \
})
#endif
/* used internally by panic.c */
#ifndef WARN_ON
#define WARN_ON(condition) ({ \
int __ret_warn_on = !!(condition); \
if (unlikely(__ret_warn_on)) \
__WARN(); \
unlikely(__ret_warn_on); \
})
#endif
#ifndef WARN
#define WARN(condition, format...) ({ \
int __ret_warn_on = !!(condition); \
if (unlikely(__ret_warn_on)) \
__WARN_printf(TAINT_WARN, format); \
unlikely(__ret_warn_on); \
})
#endif
#define WARN_TAINT(condition, taint, format...) ({ \
int __ret_warn_on = !!(condition); \
if (unlikely(__ret_warn_on)) \
__WARN_printf(taint, format); \
unlikely(__ret_warn_on); \
})
#ifndef WARN_ON_ONCE
#define WARN_ON_ONCE(condition) \
DO_ONCE_LITE_IF(condition, WARN_ON, 1 )
#endif
#define WARN_ONCE(condition, format...) \
DO_ONCE_LITE_IF(condition, WARN, 1 , format)
#define WARN_TAINT_ONCE(condition, taint, format...) \
DO_ONCE_LITE_IF(condition, WARN_TAINT, 1 , taint, format)
#else /* !CONFIG_BUG */
#ifndef HAVE_ARCH_BUG
#define BUG() do { \
do {} while (1 ); \
unreachable(); \
} while (0 )
#endif
#ifndef HAVE_ARCH_BUG_ON
#define BUG_ON(condition) do { if (unlikely(condition)) BUG(); } while (0 )
#endif
#ifndef HAVE_ARCH_WARN_ON
#define WARN_ON(condition) ({ \
int __ret_warn_on = !!(condition); \
unlikely(__ret_warn_on); \
})
#endif
#ifndef WARN
#define WARN(condition, format...) ({ \
int __ret_warn_on = !!(condition); \
no_printk(format); \
unlikely(__ret_warn_on); \
})
#endif
#define WARN_ON_ONCE(condition) WARN_ON(condition)
#define WARN_ONCE(condition, format...) WARN(condition, format)
#define WARN_TAINT(condition, taint, format...) WARN(condition, format)
#define WARN_TAINT_ONCE(condition, taint, format...) WARN(condition, format)
#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) WARN_ON(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(x) ({0 ;})
#endif
#endif /* __ASSEMBLY__ */
#endif
Messung V0.5 in Prozent C=96 H=55 G=78
¤ Dauer der Verarbeitung: 0.12 Sekunden
(vorverarbeitet am 2026-09-28)
¤
*© Formatika GbR, Deutschland