Branch data 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 [ - + ]: 384840 : 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 */