cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

bug.h (2220B)


      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
      9enum bug_trap_type {
     10	BUG_TRAP_TYPE_NONE = 0,
     11	BUG_TRAP_TYPE_WARN = 1,
     12	BUG_TRAP_TYPE_BUG = 2,
     13};
     14
     15struct 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
     34static inline int is_warning_bug(const struct bug_entry *bug)
     35{
     36	return bug->flags & BUGFLAG_WARNING;
     37}
     38
     39void bug_get_file_line(struct bug_entry *bug, const char **file,
     40		       unsigned int *line);
     41
     42struct bug_entry *find_bug(unsigned long bugaddr);
     43
     44enum bug_trap_type report_bug(unsigned long bug_addr, struct pt_regs *regs);
     45
     46/* These are defined by the architecture */
     47int is_valid_bugaddr(unsigned long addr);
     48
     49void generic_bug_clear_once(void);
     50
     51#else	/* !CONFIG_GENERIC_BUG */
     52
     53static inline void *find_bug(unsigned long bugaddr)
     54{
     55	return NULL;
     56}
     57
     58static inline enum bug_trap_type report_bug(unsigned long bug_addr,
     59					    struct pt_regs *regs)
     60{
     61	return BUG_TRAP_TYPE_BUG;
     62}
     63
     64struct bug_entry;
     65static inline void bug_get_file_line(struct bug_entry *bug, const char **file,
     66				     unsigned int *line)
     67{
     68	*file = NULL;
     69	*line = 0;
     70}
     71
     72static inline void generic_bug_clear_once(void) {}
     73
     74#endif	/* CONFIG_GENERIC_BUG */
     75
     76/*
     77 * Since detected data corruption should stop operation on the affected
     78 * structures. Return value must be checked and sanely acted on by caller.
     79 */
     80static inline __must_check bool check_data_corruption(bool v) { return v; }
     81#define CHECK_DATA_CORRUPTION(condition, fmt, ...)			 \
     82	check_data_corruption(({					 \
     83		bool corruption = unlikely(condition);			 \
     84		if (corruption) {					 \
     85			if (IS_ENABLED(CONFIG_BUG_ON_DATA_CORRUPTION)) { \
     86				pr_err(fmt, ##__VA_ARGS__);		 \
     87				BUG();					 \
     88			} else						 \
     89				WARN(1, fmt, ##__VA_ARGS__);		 \
     90		}							 \
     91		corruption;						 \
     92	}))
     93
     94#endif	/* _LINUX_BUG_H */