1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0 */ 2*4882a593Smuzhiyun #ifndef _ASM_X86_NMI_H 3*4882a593Smuzhiyun #define _ASM_X86_NMI_H 4*4882a593Smuzhiyun 5*4882a593Smuzhiyun #include <linux/irq_work.h> 6*4882a593Smuzhiyun #include <linux/pm.h> 7*4882a593Smuzhiyun #include <asm/irq.h> 8*4882a593Smuzhiyun #include <asm/io.h> 9*4882a593Smuzhiyun 10*4882a593Smuzhiyun #ifdef CONFIG_X86_LOCAL_APIC 11*4882a593Smuzhiyun 12*4882a593Smuzhiyun extern int avail_to_resrv_perfctr_nmi_bit(unsigned int); 13*4882a593Smuzhiyun extern int reserve_perfctr_nmi(unsigned int); 14*4882a593Smuzhiyun extern void release_perfctr_nmi(unsigned int); 15*4882a593Smuzhiyun extern int reserve_evntsel_nmi(unsigned int); 16*4882a593Smuzhiyun extern void release_evntsel_nmi(unsigned int); 17*4882a593Smuzhiyun 18*4882a593Smuzhiyun struct ctl_table; 19*4882a593Smuzhiyun extern int proc_nmi_enabled(struct ctl_table *, int , 20*4882a593Smuzhiyun void __user *, size_t *, loff_t *); 21*4882a593Smuzhiyun extern int unknown_nmi_panic; 22*4882a593Smuzhiyun 23*4882a593Smuzhiyun #endif /* CONFIG_X86_LOCAL_APIC */ 24*4882a593Smuzhiyun 25*4882a593Smuzhiyun #define NMI_FLAG_FIRST 1 26*4882a593Smuzhiyun 27*4882a593Smuzhiyun enum { 28*4882a593Smuzhiyun NMI_LOCAL=0, 29*4882a593Smuzhiyun NMI_UNKNOWN, 30*4882a593Smuzhiyun NMI_SERR, 31*4882a593Smuzhiyun NMI_IO_CHECK, 32*4882a593Smuzhiyun NMI_MAX 33*4882a593Smuzhiyun }; 34*4882a593Smuzhiyun 35*4882a593Smuzhiyun #define NMI_DONE 0 36*4882a593Smuzhiyun #define NMI_HANDLED 1 37*4882a593Smuzhiyun 38*4882a593Smuzhiyun typedef int (*nmi_handler_t)(unsigned int, struct pt_regs *); 39*4882a593Smuzhiyun 40*4882a593Smuzhiyun struct nmiaction { 41*4882a593Smuzhiyun struct list_head list; 42*4882a593Smuzhiyun nmi_handler_t handler; 43*4882a593Smuzhiyun u64 max_duration; 44*4882a593Smuzhiyun unsigned long flags; 45*4882a593Smuzhiyun const char *name; 46*4882a593Smuzhiyun }; 47*4882a593Smuzhiyun 48*4882a593Smuzhiyun #define register_nmi_handler(t, fn, fg, n, init...) \ 49*4882a593Smuzhiyun ({ \ 50*4882a593Smuzhiyun static struct nmiaction init fn##_na = { \ 51*4882a593Smuzhiyun .handler = (fn), \ 52*4882a593Smuzhiyun .name = (n), \ 53*4882a593Smuzhiyun .flags = (fg), \ 54*4882a593Smuzhiyun }; \ 55*4882a593Smuzhiyun __register_nmi_handler((t), &fn##_na); \ 56*4882a593Smuzhiyun }) 57*4882a593Smuzhiyun 58*4882a593Smuzhiyun int __register_nmi_handler(unsigned int, struct nmiaction *); 59*4882a593Smuzhiyun 60*4882a593Smuzhiyun void unregister_nmi_handler(unsigned int, const char *); 61*4882a593Smuzhiyun 62*4882a593Smuzhiyun void stop_nmi(void); 63*4882a593Smuzhiyun void restart_nmi(void); 64*4882a593Smuzhiyun void local_touch_nmi(void); 65*4882a593Smuzhiyun 66*4882a593Smuzhiyun #endif /* _ASM_X86_NMI_H */ 67