root/include/linux/bug.h

/* [<][>][^][v][top][bottom][index][help] */

INCLUDED FROM


DEFINITIONS

This source file includes following definitions.
  1. is_warning_bug
  2. find_bug
  3. report_bug
  4. generic_bug_clear_once
  5. check_data_corruption

   1 /* SPDX-License-Identifier: GPL-2.0 */
   2 #ifndef _LINUX_BUG_H
   3 #define _LINUX_BUG_H
   4 
   5 #include <asm/bug.h>
   6 #include <linux/compiler.h>
   7 #include <linux/build_bug.h>
   8 
   9 enum bug_trap_type {
  10         BUG_TRAP_TYPE_NONE = 0,
  11         BUG_TRAP_TYPE_WARN = 1,
  12         BUG_TRAP_TYPE_BUG = 2,
  13 };
  14 
  15 struct pt_regs;
  16 
  17 #ifdef __CHECKER__
  18 #define MAYBE_BUILD_BUG_ON(cond) (0)
  19 #else /* __CHECKER__ */
  20 
  21 #define MAYBE_BUILD_BUG_ON(cond)                        \
  22         do {                                            \
  23                 if (__builtin_constant_p((cond)))       \
  24                         BUILD_BUG_ON(cond);             \
  25                 else                                    \
  26                         BUG_ON(cond);                   \
  27         } while (0)
  28 
  29 #endif  /* __CHECKER__ */
  30 
  31 #ifdef CONFIG_GENERIC_BUG
  32 #include <asm-generic/bug.h>
  33 
  34 static inline int is_warning_bug(const struct bug_entry *bug)
  35 {
  36         return bug->flags & BUGFLAG_WARNING;
  37 }
  38 
  39 struct bug_entry *find_bug(unsigned long bugaddr);
  40 
  41 enum bug_trap_type report_bug(unsigned long bug_addr, struct pt_regs *regs);
  42 
  43 /* These are defined by the architecture */
  44 int is_valid_bugaddr(unsigned long addr);
  45 
  46 void generic_bug_clear_once(void);
  47 
  48 #else   /* !CONFIG_GENERIC_BUG */
  49 
  50 static inline void *find_bug(unsigned long bugaddr)
  51 {
  52         return NULL;
  53 }
  54 
  55 static inline enum bug_trap_type report_bug(unsigned long bug_addr,
  56                                             struct pt_regs *regs)
  57 {
  58         return BUG_TRAP_TYPE_BUG;
  59 }
  60 
  61 
  62 static inline void generic_bug_clear_once(void) {}
  63 
  64 #endif  /* CONFIG_GENERIC_BUG */
  65 
  66 /*
  67  * Since detected data corruption should stop operation on the affected
  68  * structures. Return value must be checked and sanely acted on by caller.
  69  */
  70 static inline __must_check bool check_data_corruption(bool v) { return v; }
  71 #define CHECK_DATA_CORRUPTION(condition, fmt, ...)                       \
  72         check_data_corruption(({                                         \
  73                 bool corruption = unlikely(condition);                   \
  74                 if (corruption) {                                        \
  75                         if (IS_ENABLED(CONFIG_BUG_ON_DATA_CORRUPTION)) { \
  76                                 pr_err(fmt, ##__VA_ARGS__);              \
  77                                 BUG();                                   \
  78                         } else                                           \
  79                                 WARN(1, fmt, ##__VA_ARGS__);             \
  80                 }                                                        \
  81                 corruption;                                              \
  82         }))
  83 
  84 #endif  /* _LINUX_BUG_H */

/* [<][>][^][v][top][bottom][index][help] */