Line data Source code
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 442496 : 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 */