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 (6940B)


      1/* SPDX-License-Identifier: GPL-2.0 */
      2#ifndef _ASM_GENERIC_BUG_H
      3#define _ASM_GENERIC_BUG_H
      4
      5#include <linux/compiler.h>
      6#include <linux/instrumentation.h>
      7#include <linux/once_lite.h>
      8
      9#define CUT_HERE		"------------[ cut here ]------------\n"
     10
     11#ifdef CONFIG_GENERIC_BUG
     12#define BUGFLAG_WARNING		(1 << 0)
     13#define BUGFLAG_ONCE		(1 << 1)
     14#define BUGFLAG_DONE		(1 << 2)
     15#define BUGFLAG_NO_CUT_HERE	(1 << 3)	/* CUT_HERE already sent */
     16#define BUGFLAG_TAINT(taint)	((taint) << 8)
     17#define BUG_GET_TAINT(bug)	((bug)->flags >> 8)
     18#endif
     19
     20#ifndef __ASSEMBLY__
     21#include <linux/panic.h>
     22#include <linux/printk.h>
     23
     24struct warn_args;
     25struct pt_regs;
     26
     27void __warn(const char *file, int line, void *caller, unsigned taint,
     28	    struct pt_regs *regs, struct warn_args *args);
     29
     30#ifdef CONFIG_BUG
     31
     32#ifdef CONFIG_GENERIC_BUG
     33struct bug_entry {
     34#ifndef CONFIG_GENERIC_BUG_RELATIVE_POINTERS
     35	unsigned long	bug_addr;
     36#else
     37	signed int	bug_addr_disp;
     38#endif
     39#ifdef CONFIG_DEBUG_BUGVERBOSE
     40#ifndef CONFIG_GENERIC_BUG_RELATIVE_POINTERS
     41	const char	*file;
     42#else
     43	signed int	file_disp;
     44#endif
     45	unsigned short	line;
     46#endif
     47	unsigned short	flags;
     48};
     49#endif	/* CONFIG_GENERIC_BUG */
     50
     51/*
     52 * Don't use BUG() or BUG_ON() unless there's really no way out; one
     53 * example might be detecting data structure corruption in the middle
     54 * of an operation that can't be backed out of.  If the (sub)system
     55 * can somehow continue operating, perhaps with reduced functionality,
     56 * it's probably not BUG-worthy.
     57 *
     58 * If you're tempted to BUG(), think again:  is completely giving up
     59 * really the *only* solution?  There are usually better options, where
     60 * users don't need to reboot ASAP and can mostly shut down cleanly.
     61 */
     62#ifndef HAVE_ARCH_BUG
     63#define BUG() do { \
     64	printk("BUG: failure at %s:%d/%s()!\n", __FILE__, __LINE__, __func__); \
     65	barrier_before_unreachable(); \
     66	panic("BUG!"); \
     67} while (0)
     68#endif
     69
     70#ifndef HAVE_ARCH_BUG_ON
     71#define BUG_ON(condition) do { if (unlikely(condition)) BUG(); } while (0)
     72#endif
     73
     74/*
     75 * WARN(), WARN_ON(), WARN_ON_ONCE, and so on can be used to report
     76 * significant kernel issues that need prompt attention if they should ever
     77 * appear at runtime.
     78 *
     79 * Do not use these macros when checking for invalid external inputs
     80 * (e.g. invalid system call arguments, or invalid data coming from
     81 * network/devices), and on transient conditions like ENOMEM or EAGAIN.
     82 * These macros should be used for recoverable kernel issues only.
     83 * For invalid external inputs, transient conditions, etc use
     84 * pr_err[_once/_ratelimited]() followed by dump_stack(), if necessary.
     85 * Do not include "BUG"/"WARNING" in format strings manually to make these
     86 * conditions distinguishable from kernel issues.
     87 *
     88 * Use the versions with printk format strings to provide better diagnostics.
     89 */
     90#ifndef __WARN_FLAGS
     91extern __printf(4, 5)
     92void warn_slowpath_fmt(const char *file, const int line, unsigned taint,
     93		       const char *fmt, ...);
     94#define __WARN()		__WARN_printf(TAINT_WARN, NULL)
     95#define __WARN_printf(taint, arg...) do {				\
     96		instrumentation_begin();				\
     97		warn_slowpath_fmt(__FILE__, __LINE__, taint, arg);	\
     98		instrumentation_end();					\
     99	} while (0)
    100#else
    101extern __printf(1, 2) void __warn_printk(const char *fmt, ...);
    102#define __WARN()		__WARN_FLAGS(BUGFLAG_TAINT(TAINT_WARN))
    103#define __WARN_printf(taint, arg...) do {				\
    104		instrumentation_begin();				\
    105		__warn_printk(arg);					\
    106		__WARN_FLAGS(BUGFLAG_NO_CUT_HERE | BUGFLAG_TAINT(taint));\
    107		instrumentation_end();					\
    108	} while (0)
    109#define WARN_ON_ONCE(condition) ({				\
    110	int __ret_warn_on = !!(condition);			\
    111	if (unlikely(__ret_warn_on))				\
    112		__WARN_FLAGS(BUGFLAG_ONCE |			\
    113			     BUGFLAG_TAINT(TAINT_WARN));	\
    114	unlikely(__ret_warn_on);				\
    115})
    116#endif
    117
    118/* used internally by panic.c */
    119
    120#ifndef WARN_ON
    121#define WARN_ON(condition) ({						\
    122	int __ret_warn_on = !!(condition);				\
    123	if (unlikely(__ret_warn_on))					\
    124		__WARN();						\
    125	unlikely(__ret_warn_on);					\
    126})
    127#endif
    128
    129#ifndef WARN
    130#define WARN(condition, format...) ({					\
    131	int __ret_warn_on = !!(condition);				\
    132	if (unlikely(__ret_warn_on))					\
    133		__WARN_printf(TAINT_WARN, format);			\
    134	unlikely(__ret_warn_on);					\
    135})
    136#endif
    137
    138#define WARN_TAINT(condition, taint, format...) ({			\
    139	int __ret_warn_on = !!(condition);				\
    140	if (unlikely(__ret_warn_on))					\
    141		__WARN_printf(taint, format);				\
    142	unlikely(__ret_warn_on);					\
    143})
    144
    145#ifndef WARN_ON_ONCE
    146#define WARN_ON_ONCE(condition)					\
    147	DO_ONCE_LITE_IF(condition, WARN_ON, 1)
    148#endif
    149
    150#define WARN_ONCE(condition, format...)				\
    151	DO_ONCE_LITE_IF(condition, WARN, 1, format)
    152
    153#define WARN_TAINT_ONCE(condition, taint, format...)		\
    154	DO_ONCE_LITE_IF(condition, WARN_TAINT, 1, taint, format)
    155
    156#else /* !CONFIG_BUG */
    157#ifndef HAVE_ARCH_BUG
    158#define BUG() do {} while (1)
    159#endif
    160
    161#ifndef HAVE_ARCH_BUG_ON
    162#define BUG_ON(condition) do { if (unlikely(condition)) BUG(); } while (0)
    163#endif
    164
    165#ifndef HAVE_ARCH_WARN_ON
    166#define WARN_ON(condition) ({						\
    167	int __ret_warn_on = !!(condition);				\
    168	unlikely(__ret_warn_on);					\
    169})
    170#endif
    171
    172#ifndef WARN
    173#define WARN(condition, format...) ({					\
    174	int __ret_warn_on = !!(condition);				\
    175	no_printk(format);						\
    176	unlikely(__ret_warn_on);					\
    177})
    178#endif
    179
    180#define WARN_ON_ONCE(condition) WARN_ON(condition)
    181#define WARN_ONCE(condition, format...) WARN(condition, format)
    182#define WARN_TAINT(condition, taint, format...) WARN(condition, format)
    183#define WARN_TAINT_ONCE(condition, taint, format...) WARN(condition, format)
    184
    185#endif
    186
    187/*
    188 * WARN_ON_SMP() is for cases that the warning is either
    189 * meaningless for !SMP or may even cause failures.
    190 * It can also be used with values that are only defined
    191 * on SMP:
    192 *
    193 * struct foo {
    194 *  [...]
    195 * #ifdef CONFIG_SMP
    196 *	int bar;
    197 * #endif
    198 * };
    199 *
    200 * void func(struct foo *zoot)
    201 * {
    202 *	WARN_ON_SMP(!zoot->bar);
    203 *
    204 * For CONFIG_SMP, WARN_ON_SMP() should act the same as WARN_ON(),
    205 * and should be a nop and return false for uniprocessor.
    206 *
    207 * if (WARN_ON_SMP(x)) returns true only when CONFIG_SMP is set
    208 * and x is true.
    209 */
    210#ifdef CONFIG_SMP
    211# define WARN_ON_SMP(x)			WARN_ON(x)
    212#else
    213/*
    214 * Use of ({0;}) because WARN_ON_SMP(x) may be used either as
    215 * a stand alone line statement or as a condition in an if ()
    216 * statement.
    217 * A simple "0" would cause gcc to give a "statement has no effect"
    218 * warning.
    219 */
    220# define WARN_ON_SMP(x)			({0;})
    221#endif
    222
    223/*
    224 * WARN_ON_FUNCTION_MISMATCH() warns if a value doesn't match a
    225 * function address, and can be useful for catching issues with
    226 * callback functions, for example.
    227 *
    228 * With CONFIG_CFI_CLANG, the warning is disabled because the
    229 * compiler replaces function addresses taken in C code with
    230 * local jump table addresses, which breaks cross-module function
    231 * address equality.
    232 */
    233#if defined(CONFIG_CFI_CLANG) && defined(CONFIG_MODULES)
    234# define WARN_ON_FUNCTION_MISMATCH(x, fn) ({ 0; })
    235#else
    236# define WARN_ON_FUNCTION_MISMATCH(x, fn) WARN_ON_ONCE((x) != (fn))
    237#endif
    238
    239#endif /* __ASSEMBLY__ */
    240
    241#endif