| .. | .. | 
|---|
| 6 | 6 |  #include <linux/kprobes.h> | 
|---|
| 7 | 7 |   | 
|---|
| 8 | 8 |  #include <asm/debugreg.h> | 
|---|
 | 9 | +#include <asm/idtentry.h>  | 
|---|
| 9 | 10 |  #include <asm/siginfo.h>			/* TRAP_TRACE, ... */ | 
|---|
 | 11 | +#include <asm/trap_pf.h>  | 
|---|
| 10 | 12 |   | 
|---|
| 11 |  | -#define dotraplinkage __visible  | 
|---|
| 12 |  | -  | 
|---|
| 13 |  | -asmlinkage void divide_error(void);  | 
|---|
| 14 |  | -asmlinkage void debug(void);  | 
|---|
| 15 |  | -asmlinkage void nmi(void);  | 
|---|
| 16 |  | -asmlinkage void int3(void);  | 
|---|
| 17 |  | -asmlinkage void overflow(void);  | 
|---|
| 18 |  | -asmlinkage void bounds(void);  | 
|---|
| 19 |  | -asmlinkage void invalid_op(void);  | 
|---|
| 20 |  | -asmlinkage void device_not_available(void);  | 
|---|
| 21 | 13 |  #ifdef CONFIG_X86_64 | 
|---|
| 22 |  | -asmlinkage void double_fault(void);  | 
|---|
| 23 |  | -#endif  | 
|---|
| 24 |  | -asmlinkage void coprocessor_segment_overrun(void);  | 
|---|
| 25 |  | -asmlinkage void invalid_TSS(void);  | 
|---|
| 26 |  | -asmlinkage void segment_not_present(void);  | 
|---|
| 27 |  | -asmlinkage void stack_segment(void);  | 
|---|
| 28 |  | -asmlinkage void general_protection(void);  | 
|---|
| 29 |  | -asmlinkage void page_fault(void);  | 
|---|
| 30 |  | -asmlinkage void async_page_fault(void);  | 
|---|
| 31 |  | -asmlinkage void spurious_interrupt_bug(void);  | 
|---|
| 32 |  | -asmlinkage void coprocessor_error(void);  | 
|---|
| 33 |  | -asmlinkage void alignment_check(void);  | 
|---|
| 34 |  | -#ifdef CONFIG_X86_MCE  | 
|---|
| 35 |  | -asmlinkage void machine_check(void);  | 
|---|
| 36 |  | -#endif /* CONFIG_X86_MCE */  | 
|---|
| 37 |  | -asmlinkage void simd_coprocessor_error(void);  | 
|---|
| 38 |  | -  | 
|---|
| 39 |  | -#if defined(CONFIG_X86_64) && defined(CONFIG_XEN_PV)  | 
|---|
| 40 |  | -asmlinkage void xen_divide_error(void);  | 
|---|
| 41 |  | -asmlinkage void xen_xennmi(void);  | 
|---|
| 42 |  | -asmlinkage void xen_xendebug(void);  | 
|---|
| 43 |  | -asmlinkage void xen_int3(void);  | 
|---|
| 44 |  | -asmlinkage void xen_overflow(void);  | 
|---|
| 45 |  | -asmlinkage void xen_bounds(void);  | 
|---|
| 46 |  | -asmlinkage void xen_invalid_op(void);  | 
|---|
| 47 |  | -asmlinkage void xen_device_not_available(void);  | 
|---|
| 48 |  | -asmlinkage void xen_double_fault(void);  | 
|---|
| 49 |  | -asmlinkage void xen_coprocessor_segment_overrun(void);  | 
|---|
| 50 |  | -asmlinkage void xen_invalid_TSS(void);  | 
|---|
| 51 |  | -asmlinkage void xen_segment_not_present(void);  | 
|---|
| 52 |  | -asmlinkage void xen_stack_segment(void);  | 
|---|
| 53 |  | -asmlinkage void xen_general_protection(void);  | 
|---|
| 54 |  | -asmlinkage void xen_page_fault(void);  | 
|---|
| 55 |  | -asmlinkage void xen_spurious_interrupt_bug(void);  | 
|---|
| 56 |  | -asmlinkage void xen_coprocessor_error(void);  | 
|---|
| 57 |  | -asmlinkage void xen_alignment_check(void);  | 
|---|
| 58 |  | -#ifdef CONFIG_X86_MCE  | 
|---|
| 59 |  | -asmlinkage void xen_machine_check(void);  | 
|---|
| 60 |  | -#endif /* CONFIG_X86_MCE */  | 
|---|
| 61 |  | -asmlinkage void xen_simd_coprocessor_error(void);  | 
|---|
 | 14 | +asmlinkage __visible notrace struct pt_regs *sync_regs(struct pt_regs *eregs);  | 
|---|
 | 15 | +asmlinkage __visible notrace  | 
|---|
 | 16 | +struct bad_iret_stack *fixup_bad_iret(struct bad_iret_stack *s);  | 
|---|
 | 17 | +void __init trap_init(void);  | 
|---|
 | 18 | +asmlinkage __visible noinstr struct pt_regs *vc_switch_off_ist(struct pt_regs *eregs);  | 
|---|
| 62 | 19 |  #endif | 
|---|
| 63 | 20 |   | 
|---|
| 64 |  | -dotraplinkage void do_divide_error(struct pt_regs *, long);  | 
|---|
| 65 |  | -dotraplinkage void do_debug(struct pt_regs *, long);  | 
|---|
| 66 |  | -dotraplinkage void do_nmi(struct pt_regs *, long);  | 
|---|
| 67 |  | -dotraplinkage void do_int3(struct pt_regs *, long);  | 
|---|
| 68 |  | -dotraplinkage void do_overflow(struct pt_regs *, long);  | 
|---|
| 69 |  | -dotraplinkage void do_bounds(struct pt_regs *, long);  | 
|---|
| 70 |  | -dotraplinkage void do_invalid_op(struct pt_regs *, long);  | 
|---|
| 71 |  | -dotraplinkage void do_device_not_available(struct pt_regs *, long);  | 
|---|
| 72 |  | -dotraplinkage void do_coprocessor_segment_overrun(struct pt_regs *, long);  | 
|---|
| 73 |  | -dotraplinkage void do_invalid_TSS(struct pt_regs *, long);  | 
|---|
| 74 |  | -dotraplinkage void do_segment_not_present(struct pt_regs *, long);  | 
|---|
| 75 |  | -dotraplinkage void do_stack_segment(struct pt_regs *, long);  | 
|---|
| 76 |  | -#ifdef CONFIG_X86_64  | 
|---|
| 77 |  | -dotraplinkage void do_double_fault(struct pt_regs *, long);  | 
|---|
 | 21 | +#ifdef CONFIG_X86_F00F_BUG  | 
|---|
 | 22 | +/* For handling the FOOF bug */  | 
|---|
 | 23 | +void handle_invalid_op(struct pt_regs *regs);  | 
|---|
| 78 | 24 |  #endif | 
|---|
| 79 |  | -dotraplinkage void do_general_protection(struct pt_regs *, long);  | 
|---|
| 80 |  | -dotraplinkage void do_page_fault(struct pt_regs *, unsigned long);  | 
|---|
| 81 |  | -dotraplinkage void do_spurious_interrupt_bug(struct pt_regs *, long);  | 
|---|
| 82 |  | -dotraplinkage void do_coprocessor_error(struct pt_regs *, long);  | 
|---|
| 83 |  | -dotraplinkage void do_alignment_check(struct pt_regs *, long);  | 
|---|
| 84 |  | -#ifdef CONFIG_X86_MCE  | 
|---|
| 85 |  | -dotraplinkage void do_machine_check(struct pt_regs *, long);  | 
|---|
| 86 |  | -#endif  | 
|---|
| 87 |  | -dotraplinkage void do_simd_coprocessor_error(struct pt_regs *, long);  | 
|---|
| 88 |  | -#ifdef CONFIG_X86_32  | 
|---|
| 89 |  | -dotraplinkage void do_iret_error(struct pt_regs *, long);  | 
|---|
| 90 |  | -#endif  | 
|---|
| 91 |  | -dotraplinkage void do_mce(struct pt_regs *, long);  | 
|---|
| 92 | 25 |   | 
|---|
| 93 | 26 |  static inline int get_si_code(unsigned long condition) | 
|---|
| 94 | 27 |  { | 
|---|
| .. | .. | 
|---|
| 103 | 36 |  extern int panic_on_unrecovered_nmi; | 
|---|
| 104 | 37 |   | 
|---|
| 105 | 38 |  void math_emulate(struct math_emu_info *); | 
|---|
| 106 |  | -#ifndef CONFIG_X86_32  | 
|---|
| 107 |  | -asmlinkage void smp_thermal_interrupt(struct pt_regs *regs);  | 
|---|
| 108 |  | -asmlinkage void smp_threshold_interrupt(struct pt_regs *regs);  | 
|---|
| 109 |  | -asmlinkage void smp_deferred_error_interrupt(struct pt_regs *regs);  | 
|---|
| 110 |  | -#endif  | 
|---|
| 111 | 39 |   | 
|---|
| 112 |  | -extern void ist_enter(struct pt_regs *regs);  | 
|---|
| 113 |  | -extern void ist_exit(struct pt_regs *regs);  | 
|---|
| 114 |  | -extern void ist_begin_non_atomic(struct pt_regs *regs);  | 
|---|
| 115 |  | -extern void ist_end_non_atomic(void);  | 
|---|
 | 40 | +bool fault_in_kernel_space(unsigned long address);  | 
|---|
| 116 | 41 |   | 
|---|
| 117 | 42 |  #ifdef CONFIG_VMAP_STACK | 
|---|
| 118 | 43 |  void __noreturn handle_stack_overflow(const char *message, | 
|---|
| .. | .. | 
|---|
| 120 | 45 |  				      unsigned long fault_address); | 
|---|
| 121 | 46 |  #endif | 
|---|
| 122 | 47 |   | 
|---|
| 123 |  | -/* Interrupts/Exceptions */  | 
|---|
| 124 |  | -enum {  | 
|---|
| 125 |  | -	X86_TRAP_DE = 0,	/*  0, Divide-by-zero */  | 
|---|
| 126 |  | -	X86_TRAP_DB,		/*  1, Debug */  | 
|---|
| 127 |  | -	X86_TRAP_NMI,		/*  2, Non-maskable Interrupt */  | 
|---|
| 128 |  | -	X86_TRAP_BP,		/*  3, Breakpoint */  | 
|---|
| 129 |  | -	X86_TRAP_OF,		/*  4, Overflow */  | 
|---|
| 130 |  | -	X86_TRAP_BR,		/*  5, Bound Range Exceeded */  | 
|---|
| 131 |  | -	X86_TRAP_UD,		/*  6, Invalid Opcode */  | 
|---|
| 132 |  | -	X86_TRAP_NM,		/*  7, Device Not Available */  | 
|---|
| 133 |  | -	X86_TRAP_DF,		/*  8, Double Fault */  | 
|---|
| 134 |  | -	X86_TRAP_OLD_MF,	/*  9, Coprocessor Segment Overrun */  | 
|---|
| 135 |  | -	X86_TRAP_TS,		/* 10, Invalid TSS */  | 
|---|
| 136 |  | -	X86_TRAP_NP,		/* 11, Segment Not Present */  | 
|---|
| 137 |  | -	X86_TRAP_SS,		/* 12, Stack Segment Fault */  | 
|---|
| 138 |  | -	X86_TRAP_GP,		/* 13, General Protection Fault */  | 
|---|
| 139 |  | -	X86_TRAP_PF,		/* 14, Page Fault */  | 
|---|
| 140 |  | -	X86_TRAP_SPURIOUS,	/* 15, Spurious Interrupt */  | 
|---|
| 141 |  | -	X86_TRAP_MF,		/* 16, x87 Floating-Point Exception */  | 
|---|
| 142 |  | -	X86_TRAP_AC,		/* 17, Alignment Check */  | 
|---|
| 143 |  | -	X86_TRAP_MC,		/* 18, Machine Check */  | 
|---|
| 144 |  | -	X86_TRAP_XF,		/* 19, SIMD Floating-Point Exception */  | 
|---|
| 145 |  | -	X86_TRAP_IRET = 32,	/* 32, IRET Exception */  | 
|---|
| 146 |  | -};  | 
|---|
| 147 |  | -  | 
|---|
| 148 |  | -/*  | 
|---|
| 149 |  | - * Page fault error code bits:  | 
|---|
| 150 |  | - *  | 
|---|
| 151 |  | - *   bit 0 ==	 0: no page found	1: protection fault  | 
|---|
| 152 |  | - *   bit 1 ==	 0: read access		1: write access  | 
|---|
| 153 |  | - *   bit 2 ==	 0: kernel-mode access	1: user-mode access  | 
|---|
| 154 |  | - *   bit 3 ==				1: use of reserved bit detected  | 
|---|
| 155 |  | - *   bit 4 ==				1: fault was an instruction fetch  | 
|---|
| 156 |  | - *   bit 5 ==				1: protection keys block access  | 
|---|
| 157 |  | - */  | 
|---|
| 158 |  | -enum x86_pf_error_code {  | 
|---|
| 159 |  | -	X86_PF_PROT	=		1 << 0,  | 
|---|
| 160 |  | -	X86_PF_WRITE	=		1 << 1,  | 
|---|
| 161 |  | -	X86_PF_USER	=		1 << 2,  | 
|---|
| 162 |  | -	X86_PF_RSVD	=		1 << 3,  | 
|---|
| 163 |  | -	X86_PF_INSTR	=		1 << 4,  | 
|---|
| 164 |  | -	X86_PF_PK	=		1 << 5,  | 
|---|
| 165 |  | -};  | 
|---|
| 166 | 48 |  #endif /* _ASM_X86_TRAPS_H */ | 
|---|