1
2
3
4
5
6
7
8
9 #include <asm/errno.h>
10 #include <asm/percpu.h>
11 #include <asm/processor-flags.h>
12 #include <asm/segment.h>
13 #include <asm/asm-offsets.h>
14 #include <asm/thread_info.h>
15 #include <asm/asm.h>
16
17 #include <xen/interface/xen.h>
18
19 #include <linux/init.h>
20 #include <linux/linkage.h>
21
22 .macro xen_pv_trap name
23 ENTRY(xen_\name)
24 pop %rcx
25 pop %r11
26 jmp \name
27 END(xen_\name)
28 _ASM_NOKPROBE(xen_\name)
29 .endm
30
31 xen_pv_trap divide_error
32 xen_pv_trap debug
33 xen_pv_trap xendebug
34 xen_pv_trap int3
35 xen_pv_trap xennmi
36 xen_pv_trap overflow
37 xen_pv_trap bounds
38 xen_pv_trap invalid_op
39 xen_pv_trap device_not_available
40 xen_pv_trap double_fault
41 xen_pv_trap coprocessor_segment_overrun
42 xen_pv_trap invalid_TSS
43 xen_pv_trap segment_not_present
44 xen_pv_trap stack_segment
45 xen_pv_trap general_protection
46 xen_pv_trap page_fault
47 xen_pv_trap spurious_interrupt_bug
48 xen_pv_trap coprocessor_error
49 xen_pv_trap alignment_check
50 #ifdef CONFIG_X86_MCE
51 xen_pv_trap machine_check
52 #endif
53 xen_pv_trap simd_coprocessor_error
54 #ifdef CONFIG_IA32_EMULATION
55 xen_pv_trap entry_INT80_compat
56 #endif
57 xen_pv_trap hypervisor_callback
58
59 __INIT
60 ENTRY(xen_early_idt_handler_array)
61 i = 0
62 .rept NUM_EXCEPTION_VECTORS
63 pop %rcx
64 pop %r11
65 jmp early_idt_handler_array + i*EARLY_IDT_HANDLER_SIZE
66 i = i + 1
67 .fill xen_early_idt_handler_array + i*XEN_EARLY_IDT_HANDLER_SIZE - ., 1, 0xcc
68 .endr
69 END(xen_early_idt_handler_array)
70 __FINIT
71
72 hypercall_iret = hypercall_page + __HYPERVISOR_iret * 32
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88 ENTRY(xen_iret)
89 pushq $0
90 jmp hypercall_iret
91
92 ENTRY(xen_sysret64)
93
94
95
96
97
98
99 movq %rsp, PER_CPU_VAR(cpu_tss_rw + TSS_sp2)
100 movq PER_CPU_VAR(cpu_current_top_of_stack), %rsp
101
102 pushq $__USER_DS
103 pushq PER_CPU_VAR(cpu_tss_rw + TSS_sp2)
104 pushq %r11
105 pushq $__USER_CS
106 pushq %rcx
107
108 pushq $VGCF_in_syscall
109 jmp hypercall_iret
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127 ENTRY(xen_syscall_target)
128 popq %rcx
129 popq %r11
130
131
132
133
134
135
136 movq $__USER_DS, 4*8(%rsp)
137 movq $__USER_CS, 1*8(%rsp)
138
139 jmp entry_SYSCALL_64_after_hwframe
140 ENDPROC(xen_syscall_target)
141
142 #ifdef CONFIG_IA32_EMULATION
143
144
145 ENTRY(xen_syscall32_target)
146 popq %rcx
147 popq %r11
148
149
150
151
152
153
154 movq $__USER32_DS, 4*8(%rsp)
155 movq $__USER32_CS, 1*8(%rsp)
156
157 jmp entry_SYSCALL_compat_after_hwframe
158 ENDPROC(xen_syscall32_target)
159
160
161 ENTRY(xen_sysenter_target)
162 mov 0*8(%rsp), %rcx
163 mov 1*8(%rsp), %r11
164 mov 5*8(%rsp), %rsp
165 jmp entry_SYSENTER_compat
166 ENDPROC(xen_sysenter_target)
167
168 #else
169
170 ENTRY(xen_syscall32_target)
171 ENTRY(xen_sysenter_target)
172 lea 16(%rsp), %rsp
173 mov $-ENOSYS, %rax
174 pushq $0
175 jmp hypercall_iret
176 ENDPROC(xen_syscall32_target)
177 ENDPROC(xen_sysenter_target)
178
179 #endif