]> git.proxmox.com Git - mirror_ubuntu-artful-kernel.git/blame - arch/x86/include/asm/traps.h
UBUNTU: Ubuntu-4.13.0-45.50
[mirror_ubuntu-artful-kernel.git] / arch / x86 / include / asm / traps.h
CommitLineData
1965aae3
PA
1#ifndef _ASM_X86_TRAPS_H
2#define _ASM_X86_TRAPS_H
6ac8d51f 3
95927475 4#include <linux/context_tracking_state.h>
5cec93c2
AL
5#include <linux/kprobes.h>
6
e8d3f455 7#include <asm/debugreg.h>
a2bcd473 8#include <asm/siginfo.h> /* TRAP_TRACE, ... */
e8d3f455 9
9e1a431d 10#define dotraplinkage __visible
e407d620 11
6ac8d51f
JS
12asmlinkage void divide_error(void);
13asmlinkage void debug(void);
14asmlinkage void nmi(void);
15asmlinkage void int3(void);
16asmlinkage void overflow(void);
17asmlinkage void bounds(void);
18asmlinkage void invalid_op(void);
19asmlinkage void device_not_available(void);
e407d620
AH
20#ifdef CONFIG_X86_64
21asmlinkage void double_fault(void);
22#endif
6ac8d51f
JS
23asmlinkage void coprocessor_segment_overrun(void);
24asmlinkage void invalid_TSS(void);
25asmlinkage void segment_not_present(void);
26asmlinkage void stack_segment(void);
27asmlinkage void general_protection(void);
28asmlinkage void page_fault(void);
631bc487 29asmlinkage void async_page_fault(void);
e407d620 30asmlinkage void spurious_interrupt_bug(void);
6ac8d51f 31asmlinkage void coprocessor_error(void);
6ac8d51f 32asmlinkage void alignment_check(void);
6ac8d51f
JS
33#ifdef CONFIG_X86_MCE
34asmlinkage void machine_check(void);
35#endif /* CONFIG_X86_MCE */
e407d620 36asmlinkage void simd_coprocessor_error(void);
6ac8d51f 37
25c74b10 38#ifdef CONFIG_TRACING
6f442be2 39#define trace_stack_segment stack_segment
25c74b10
SA
40#define trace_divide_error divide_error
41#define trace_bounds bounds
42#define trace_invalid_op invalid_op
43#define trace_device_not_available device_not_available
44#define trace_coprocessor_segment_overrun coprocessor_segment_overrun
45#define trace_invalid_TSS invalid_TSS
46#define trace_segment_not_present segment_not_present
47#define trace_general_protection general_protection
48#define trace_spurious_interrupt_bug spurious_interrupt_bug
49#define trace_coprocessor_error coprocessor_error
50#define trace_alignment_check alignment_check
51#define trace_simd_coprocessor_error simd_coprocessor_error
52#define trace_async_page_fault async_page_fault
8478bb56 53#define trace_page_fault page_fault
25c74b10
SA
54#endif
55
9a6fb927
JG
56#if defined(CONFIG_X86_64) && defined(CONFIG_XEN_PV)
57asmlinkage void xen_divide_error(void);
20c970e0 58asmlinkage void xen_xennmi(void);
9a6fb927
JG
59asmlinkage void xen_xendebug(void);
60asmlinkage void xen_xenint3(void);
9a6fb927
JG
61asmlinkage void xen_overflow(void);
62asmlinkage void xen_bounds(void);
63asmlinkage void xen_invalid_op(void);
64asmlinkage void xen_device_not_available(void);
65asmlinkage void xen_double_fault(void);
66asmlinkage void xen_coprocessor_segment_overrun(void);
67asmlinkage void xen_invalid_TSS(void);
68asmlinkage void xen_segment_not_present(void);
69asmlinkage void xen_stack_segment(void);
70asmlinkage void xen_general_protection(void);
71asmlinkage void xen_page_fault(void);
72asmlinkage void xen_spurious_interrupt_bug(void);
73asmlinkage void xen_coprocessor_error(void);
74asmlinkage void xen_alignment_check(void);
75#ifdef CONFIG_X86_MCE
76asmlinkage void xen_machine_check(void);
77#endif /* CONFIG_X86_MCE */
78asmlinkage void xen_simd_coprocessor_error(void);
79#endif
80
e407d620
AH
81dotraplinkage void do_divide_error(struct pt_regs *, long);
82dotraplinkage void do_debug(struct pt_regs *, long);
83dotraplinkage void do_nmi(struct pt_regs *, long);
84dotraplinkage void do_int3(struct pt_regs *, long);
85dotraplinkage void do_overflow(struct pt_regs *, long);
86dotraplinkage void do_bounds(struct pt_regs *, long);
87dotraplinkage void do_invalid_op(struct pt_regs *, long);
aa78bcfa 88dotraplinkage void do_device_not_available(struct pt_regs *, long);
e407d620
AH
89dotraplinkage void do_coprocessor_segment_overrun(struct pt_regs *, long);
90dotraplinkage void do_invalid_TSS(struct pt_regs *, long);
91dotraplinkage void do_segment_not_present(struct pt_regs *, long);
92dotraplinkage void do_stack_segment(struct pt_regs *, long);
d1769d54
JS
93#ifdef CONFIG_X86_64
94dotraplinkage void do_double_fault(struct pt_regs *, long);
d1769d54 95#endif
e407d620
AH
96dotraplinkage void do_general_protection(struct pt_regs *, long);
97dotraplinkage void do_page_fault(struct pt_regs *, unsigned long);
98dotraplinkage void do_spurious_interrupt_bug(struct pt_regs *, long);
99dotraplinkage void do_coprocessor_error(struct pt_regs *, long);
100dotraplinkage void do_alignment_check(struct pt_regs *, long);
101#ifdef CONFIG_X86_MCE
102dotraplinkage void do_machine_check(struct pt_regs *, long);
103#endif
104dotraplinkage void do_simd_coprocessor_error(struct pt_regs *, long);
105#ifdef CONFIG_X86_32
106dotraplinkage void do_iret_error(struct pt_regs *, long);
107#endif
6ac8d51f 108
da654b74
SD
109static inline int get_si_code(unsigned long condition)
110{
111 if (condition & DR_STEP)
112 return TRAP_TRACE;
113 else if (condition & (DR_TRAP0|DR_TRAP1|DR_TRAP2|DR_TRAP3))
114 return TRAP_HWBKPT;
115 else
116 return TRAP_BRKPT;
117}
118
6ac8d51f 119extern int panic_on_unrecovered_nmi;
6ac8d51f 120
d315760f 121void math_emulate(struct math_emu_info *);
fde0312d 122#ifndef CONFIG_X86_32
d1769d54 123asmlinkage void smp_thermal_interrupt(void);
24fd78a8
AG
124asmlinkage void smp_threshold_interrupt(void);
125asmlinkage void smp_deferred_error_interrupt(void);
e407d620 126#endif
6ac8d51f 127
8c84014f
AL
128extern void ist_enter(struct pt_regs *regs);
129extern void ist_exit(struct pt_regs *regs);
bced35b6
AL
130extern void ist_begin_non_atomic(struct pt_regs *regs);
131extern void ist_end_non_atomic(void);
95927475 132
6271cfdf
AL
133#ifdef CONFIG_VMAP_STACK
134void __noreturn handle_stack_overflow(const char *message,
135 struct pt_regs *regs,
136 unsigned long fault_address);
137#endif
138
c9408265
KC
139/* Interrupts/Exceptions */
140enum {
141 X86_TRAP_DE = 0, /* 0, Divide-by-zero */
142 X86_TRAP_DB, /* 1, Debug */
143 X86_TRAP_NMI, /* 2, Non-maskable Interrupt */
144 X86_TRAP_BP, /* 3, Breakpoint */
145 X86_TRAP_OF, /* 4, Overflow */
146 X86_TRAP_BR, /* 5, Bound Range Exceeded */
147 X86_TRAP_UD, /* 6, Invalid Opcode */
148 X86_TRAP_NM, /* 7, Device Not Available */
149 X86_TRAP_DF, /* 8, Double Fault */
150 X86_TRAP_OLD_MF, /* 9, Coprocessor Segment Overrun */
151 X86_TRAP_TS, /* 10, Invalid TSS */
152 X86_TRAP_NP, /* 11, Segment Not Present */
153 X86_TRAP_SS, /* 12, Stack Segment Fault */
154 X86_TRAP_GP, /* 13, General Protection Fault */
155 X86_TRAP_PF, /* 14, Page Fault */
156 X86_TRAP_SPURIOUS, /* 15, Spurious Interrupt */
157 X86_TRAP_MF, /* 16, x87 Floating-Point Exception */
158 X86_TRAP_AC, /* 17, Alignment Check */
159 X86_TRAP_MC, /* 18, Machine Check */
160 X86_TRAP_XF, /* 19, SIMD Floating-Point Exception */
161 X86_TRAP_IRET = 32, /* 32, IRET Exception */
162};
163
a85a07ab
RN
164/*
165 * Page fault error code bits:
166 *
167 * bit 0 == 0: no page found 1: protection fault
168 * bit 1 == 0: read access 1: write access
169 * bit 2 == 0: kernel-mode access 1: user-mode access
170 * bit 3 == 1: use of reserved bit detected
171 * bit 4 == 1: fault was an instruction fetch
172 * bit 5 == 1: protection keys block access
173 */
174enum x86_pf_error_code {
175 X86_PF_PROT = 1 << 0,
176 X86_PF_WRITE = 1 << 1,
177 X86_PF_USER = 1 << 2,
178 X86_PF_RSVD = 1 << 3,
179 X86_PF_INSTR = 1 << 4,
180 X86_PF_PK = 1 << 5,
181};
1965aae3 182#endif /* _ASM_X86_TRAPS_H */