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