xref: /linux-6.15/include/linux/panic.h (revision 8eea4e74)
1f39650deSAndy Shevchenko /* SPDX-License-Identifier: GPL-2.0 */
2f39650deSAndy Shevchenko #ifndef _LINUX_PANIC_H
3f39650deSAndy Shevchenko #define _LINUX_PANIC_H
4f39650deSAndy Shevchenko 
5f39650deSAndy Shevchenko #include <linux/compiler_attributes.h>
6f39650deSAndy Shevchenko #include <linux/types.h>
7f39650deSAndy Shevchenko 
8f39650deSAndy Shevchenko struct pt_regs;
9f39650deSAndy Shevchenko 
10f39650deSAndy Shevchenko extern long (*panic_blink)(int state);
11f39650deSAndy Shevchenko __printf(1, 2)
12f39650deSAndy Shevchenko void panic(const char *fmt, ...) __noreturn __cold;
13f39650deSAndy Shevchenko void nmi_panic(struct pt_regs *regs, const char *msg);
1479cc1ba7SKees Cook void check_panic_on_warn(const char *origin);
15f39650deSAndy Shevchenko extern void oops_enter(void);
16f39650deSAndy Shevchenko extern void oops_exit(void);
17f39650deSAndy Shevchenko extern bool oops_may_print(void);
18f39650deSAndy Shevchenko 
19bcc954c6SRyo Takakura extern bool panic_triggering_all_cpu_backtrace;
20f39650deSAndy Shevchenko extern int panic_timeout;
21f39650deSAndy Shevchenko extern unsigned long panic_print;
22f39650deSAndy Shevchenko extern int panic_on_oops;
23f39650deSAndy Shevchenko extern int panic_on_unrecovered_nmi;
24f39650deSAndy Shevchenko extern int panic_on_io_nmi;
25f39650deSAndy Shevchenko extern int panic_on_warn;
26f39650deSAndy Shevchenko 
27f39650deSAndy Shevchenko extern unsigned long panic_on_taint;
28f39650deSAndy Shevchenko extern bool panic_on_taint_nousertaint;
29f39650deSAndy Shevchenko 
30f39650deSAndy Shevchenko extern int sysctl_panic_on_rcu_stall;
31f39650deSAndy Shevchenko extern int sysctl_max_rcu_stall_to_panic;
32f39650deSAndy Shevchenko extern int sysctl_panic_on_stackoverflow;
33f39650deSAndy Shevchenko 
34f39650deSAndy Shevchenko extern bool crash_kexec_post_notifiers;
35f39650deSAndy Shevchenko 
36d9cdb431SArnd Bergmann extern void __stack_chk_fail(void);
37d9cdb431SArnd Bergmann void abort(void);
38d9cdb431SArnd Bergmann 
39f39650deSAndy Shevchenko /*
40f39650deSAndy Shevchenko  * panic_cpu is used for synchronizing panic() and crash_kexec() execution. It
41f39650deSAndy Shevchenko  * holds a CPU number which is executing panic() currently. A value of
42f39650deSAndy Shevchenko  * PANIC_CPU_INVALID means no CPU has entered panic() or crash_kexec().
43f39650deSAndy Shevchenko  */
44f39650deSAndy Shevchenko extern atomic_t panic_cpu;
45f39650deSAndy Shevchenko #define PANIC_CPU_INVALID	-1
46f39650deSAndy Shevchenko 
47f39650deSAndy Shevchenko /*
48f39650deSAndy Shevchenko  * Only to be used by arch init code. If the user over-wrote the default
49f39650deSAndy Shevchenko  * CONFIG_PANIC_TIMEOUT, honor it.
50f39650deSAndy Shevchenko  */
set_arch_panic_timeout(int timeout,int arch_default_timeout)51f39650deSAndy Shevchenko static inline void set_arch_panic_timeout(int timeout, int arch_default_timeout)
52f39650deSAndy Shevchenko {
53f39650deSAndy Shevchenko 	if (panic_timeout == arch_default_timeout)
54f39650deSAndy Shevchenko 		panic_timeout = timeout;
55f39650deSAndy Shevchenko }
56f39650deSAndy Shevchenko 
57f39650deSAndy Shevchenko /* This cannot be an enum because some may be used in assembly source. */
58f39650deSAndy Shevchenko #define TAINT_PROPRIETARY_MODULE	0
59f39650deSAndy Shevchenko #define TAINT_FORCED_MODULE		1
60f39650deSAndy Shevchenko #define TAINT_CPU_OUT_OF_SPEC		2
61f39650deSAndy Shevchenko #define TAINT_FORCED_RMMOD		3
62f39650deSAndy Shevchenko #define TAINT_MACHINE_CHECK		4
63f39650deSAndy Shevchenko #define TAINT_BAD_PAGE			5
64f39650deSAndy Shevchenko #define TAINT_USER			6
65f39650deSAndy Shevchenko #define TAINT_DIE			7
66f39650deSAndy Shevchenko #define TAINT_OVERRIDDEN_ACPI_TABLE	8
67f39650deSAndy Shevchenko #define TAINT_WARN			9
68f39650deSAndy Shevchenko #define TAINT_CRAP			10
69f39650deSAndy Shevchenko #define TAINT_FIRMWARE_WORKAROUND	11
70f39650deSAndy Shevchenko #define TAINT_OOT_MODULE		12
71f39650deSAndy Shevchenko #define TAINT_UNSIGNED_MODULE		13
72f39650deSAndy Shevchenko #define TAINT_SOFTLOCKUP		14
73f39650deSAndy Shevchenko #define TAINT_LIVEPATCH			15
74f39650deSAndy Shevchenko #define TAINT_AUX			16
75f39650deSAndy Shevchenko #define TAINT_RANDSTRUCT		17
762852ca7fSDavid Gow #define TAINT_TEST			18
77*8eea4e74SJason Gunthorpe #define TAINT_FWCTL			19
78*8eea4e74SJason Gunthorpe #define TAINT_FLAGS_COUNT		20
79f39650deSAndy Shevchenko #define TAINT_FLAGS_MAX			((1UL << TAINT_FLAGS_COUNT) - 1)
80f39650deSAndy Shevchenko 
81f39650deSAndy Shevchenko struct taint_flag {
82f39650deSAndy Shevchenko 	char c_true;		/* character printed when tainted */
83f39650deSAndy Shevchenko 	char c_false;		/* character printed when not tainted */
84f39650deSAndy Shevchenko 	bool module;		/* also show as a per-module taint flag */
852f183c68SJani Nikula 	const char *desc;	/* verbose description of the set taint flag */
86f39650deSAndy Shevchenko };
87f39650deSAndy Shevchenko 
88f39650deSAndy Shevchenko extern const struct taint_flag taint_flags[TAINT_FLAGS_COUNT];
89f39650deSAndy Shevchenko 
90f39650deSAndy Shevchenko enum lockdep_ok {
91f39650deSAndy Shevchenko 	LOCKDEP_STILL_OK,
92f39650deSAndy Shevchenko 	LOCKDEP_NOW_UNRELIABLE,
93f39650deSAndy Shevchenko };
94f39650deSAndy Shevchenko 
95f39650deSAndy Shevchenko extern const char *print_tainted(void);
962f183c68SJani Nikula extern const char *print_tainted_verbose(void);
97f39650deSAndy Shevchenko extern void add_taint(unsigned flag, enum lockdep_ok);
98f39650deSAndy Shevchenko extern int test_taint(unsigned flag);
99f39650deSAndy Shevchenko extern unsigned long get_taint(void);
100f39650deSAndy Shevchenko 
101f39650deSAndy Shevchenko #endif	/* _LINUX_PANIC_H */
102