xref: /OK3568_Linux_fs/kernel/arch/x86/include/asm/idtentry.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0 */
2*4882a593Smuzhiyun #ifndef _ASM_X86_IDTENTRY_H
3*4882a593Smuzhiyun #define _ASM_X86_IDTENTRY_H
4*4882a593Smuzhiyun 
5*4882a593Smuzhiyun /* Interrupts/Exceptions */
6*4882a593Smuzhiyun #include <asm/trapnr.h>
7*4882a593Smuzhiyun 
8*4882a593Smuzhiyun #ifndef __ASSEMBLY__
9*4882a593Smuzhiyun #include <linux/entry-common.h>
10*4882a593Smuzhiyun #include <linux/hardirq.h>
11*4882a593Smuzhiyun 
12*4882a593Smuzhiyun #include <asm/irq_stack.h>
13*4882a593Smuzhiyun 
14*4882a593Smuzhiyun /**
15*4882a593Smuzhiyun  * DECLARE_IDTENTRY - Declare functions for simple IDT entry points
16*4882a593Smuzhiyun  *		      No error code pushed by hardware
17*4882a593Smuzhiyun  * @vector:	Vector number (ignored for C)
18*4882a593Smuzhiyun  * @func:	Function name of the entry point
19*4882a593Smuzhiyun  *
20*4882a593Smuzhiyun  * Declares three functions:
21*4882a593Smuzhiyun  * - The ASM entry point: asm_##func
22*4882a593Smuzhiyun  * - The XEN PV trap entry point: xen_##func (maybe unused)
23*4882a593Smuzhiyun  * - The C handler called from the ASM entry point
24*4882a593Smuzhiyun  *
25*4882a593Smuzhiyun  * Note: This is the C variant of DECLARE_IDTENTRY(). As the name says it
26*4882a593Smuzhiyun  * declares the entry points for usage in C code. There is an ASM variant
27*4882a593Smuzhiyun  * as well which is used to emit the entry stubs in entry_32/64.S.
28*4882a593Smuzhiyun  */
29*4882a593Smuzhiyun #define DECLARE_IDTENTRY(vector, func)					\
30*4882a593Smuzhiyun 	asmlinkage void asm_##func(void);				\
31*4882a593Smuzhiyun 	asmlinkage void xen_asm_##func(void);				\
32*4882a593Smuzhiyun 	__visible void func(struct pt_regs *regs)
33*4882a593Smuzhiyun 
34*4882a593Smuzhiyun /**
35*4882a593Smuzhiyun  * DEFINE_IDTENTRY - Emit code for simple IDT entry points
36*4882a593Smuzhiyun  * @func:	Function name of the entry point
37*4882a593Smuzhiyun  *
38*4882a593Smuzhiyun  * @func is called from ASM entry code with interrupts disabled.
39*4882a593Smuzhiyun  *
40*4882a593Smuzhiyun  * The macro is written so it acts as function definition. Append the
41*4882a593Smuzhiyun  * body with a pair of curly brackets.
42*4882a593Smuzhiyun  *
43*4882a593Smuzhiyun  * irqentry_enter() contains common code which has to be invoked before
44*4882a593Smuzhiyun  * arbitrary code in the body. irqentry_exit() contains common code
45*4882a593Smuzhiyun  * which has to run before returning to the low level assembly code.
46*4882a593Smuzhiyun  */
47*4882a593Smuzhiyun #define DEFINE_IDTENTRY(func)						\
48*4882a593Smuzhiyun static __always_inline void __##func(struct pt_regs *regs);		\
49*4882a593Smuzhiyun 									\
50*4882a593Smuzhiyun __visible noinstr void func(struct pt_regs *regs)			\
51*4882a593Smuzhiyun {									\
52*4882a593Smuzhiyun 	irqentry_state_t state = irqentry_enter(regs);			\
53*4882a593Smuzhiyun 									\
54*4882a593Smuzhiyun 	instrumentation_begin();					\
55*4882a593Smuzhiyun 	__##func (regs);						\
56*4882a593Smuzhiyun 	instrumentation_end();						\
57*4882a593Smuzhiyun 	irqentry_exit(regs, state);					\
58*4882a593Smuzhiyun }									\
59*4882a593Smuzhiyun 									\
60*4882a593Smuzhiyun static __always_inline void __##func(struct pt_regs *regs)
61*4882a593Smuzhiyun 
62*4882a593Smuzhiyun /* Special case for 32bit IRET 'trap' */
63*4882a593Smuzhiyun #define DECLARE_IDTENTRY_SW	DECLARE_IDTENTRY
64*4882a593Smuzhiyun #define DEFINE_IDTENTRY_SW	DEFINE_IDTENTRY
65*4882a593Smuzhiyun 
66*4882a593Smuzhiyun /**
67*4882a593Smuzhiyun  * DECLARE_IDTENTRY_ERRORCODE - Declare functions for simple IDT entry points
68*4882a593Smuzhiyun  *				Error code pushed by hardware
69*4882a593Smuzhiyun  * @vector:	Vector number (ignored for C)
70*4882a593Smuzhiyun  * @func:	Function name of the entry point
71*4882a593Smuzhiyun  *
72*4882a593Smuzhiyun  * Declares three functions:
73*4882a593Smuzhiyun  * - The ASM entry point: asm_##func
74*4882a593Smuzhiyun  * - The XEN PV trap entry point: xen_##func (maybe unused)
75*4882a593Smuzhiyun  * - The C handler called from the ASM entry point
76*4882a593Smuzhiyun  *
77*4882a593Smuzhiyun  * Same as DECLARE_IDTENTRY, but has an extra error_code argument for the
78*4882a593Smuzhiyun  * C-handler.
79*4882a593Smuzhiyun  */
80*4882a593Smuzhiyun #define DECLARE_IDTENTRY_ERRORCODE(vector, func)			\
81*4882a593Smuzhiyun 	asmlinkage void asm_##func(void);				\
82*4882a593Smuzhiyun 	asmlinkage void xen_asm_##func(void);				\
83*4882a593Smuzhiyun 	__visible void func(struct pt_regs *regs, unsigned long error_code)
84*4882a593Smuzhiyun 
85*4882a593Smuzhiyun /**
86*4882a593Smuzhiyun  * DEFINE_IDTENTRY_ERRORCODE - Emit code for simple IDT entry points
87*4882a593Smuzhiyun  *			       Error code pushed by hardware
88*4882a593Smuzhiyun  * @func:	Function name of the entry point
89*4882a593Smuzhiyun  *
90*4882a593Smuzhiyun  * Same as DEFINE_IDTENTRY, but has an extra error_code argument
91*4882a593Smuzhiyun  */
92*4882a593Smuzhiyun #define DEFINE_IDTENTRY_ERRORCODE(func)					\
93*4882a593Smuzhiyun static __always_inline void __##func(struct pt_regs *regs,		\
94*4882a593Smuzhiyun 				     unsigned long error_code);		\
95*4882a593Smuzhiyun 									\
96*4882a593Smuzhiyun __visible noinstr void func(struct pt_regs *regs,			\
97*4882a593Smuzhiyun 			    unsigned long error_code)			\
98*4882a593Smuzhiyun {									\
99*4882a593Smuzhiyun 	irqentry_state_t state = irqentry_enter(regs);			\
100*4882a593Smuzhiyun 									\
101*4882a593Smuzhiyun 	instrumentation_begin();					\
102*4882a593Smuzhiyun 	__##func (regs, error_code);					\
103*4882a593Smuzhiyun 	instrumentation_end();						\
104*4882a593Smuzhiyun 	irqentry_exit(regs, state);					\
105*4882a593Smuzhiyun }									\
106*4882a593Smuzhiyun 									\
107*4882a593Smuzhiyun static __always_inline void __##func(struct pt_regs *regs,		\
108*4882a593Smuzhiyun 				     unsigned long error_code)
109*4882a593Smuzhiyun 
110*4882a593Smuzhiyun /**
111*4882a593Smuzhiyun  * DECLARE_IDTENTRY_RAW - Declare functions for raw IDT entry points
112*4882a593Smuzhiyun  *		      No error code pushed by hardware
113*4882a593Smuzhiyun  * @vector:	Vector number (ignored for C)
114*4882a593Smuzhiyun  * @func:	Function name of the entry point
115*4882a593Smuzhiyun  *
116*4882a593Smuzhiyun  * Maps to DECLARE_IDTENTRY().
117*4882a593Smuzhiyun  */
118*4882a593Smuzhiyun #define DECLARE_IDTENTRY_RAW(vector, func)				\
119*4882a593Smuzhiyun 	DECLARE_IDTENTRY(vector, func)
120*4882a593Smuzhiyun 
121*4882a593Smuzhiyun /**
122*4882a593Smuzhiyun  * DEFINE_IDTENTRY_RAW - Emit code for raw IDT entry points
123*4882a593Smuzhiyun  * @func:	Function name of the entry point
124*4882a593Smuzhiyun  *
125*4882a593Smuzhiyun  * @func is called from ASM entry code with interrupts disabled.
126*4882a593Smuzhiyun  *
127*4882a593Smuzhiyun  * The macro is written so it acts as function definition. Append the
128*4882a593Smuzhiyun  * body with a pair of curly brackets.
129*4882a593Smuzhiyun  *
130*4882a593Smuzhiyun  * Contrary to DEFINE_IDTENTRY() this does not invoke the
131*4882a593Smuzhiyun  * idtentry_enter/exit() helpers before and after the body invocation. This
132*4882a593Smuzhiyun  * needs to be done in the body itself if applicable. Use if extra work
133*4882a593Smuzhiyun  * is required before the enter/exit() helpers are invoked.
134*4882a593Smuzhiyun  */
135*4882a593Smuzhiyun #define DEFINE_IDTENTRY_RAW(func)					\
136*4882a593Smuzhiyun __visible noinstr void func(struct pt_regs *regs)
137*4882a593Smuzhiyun 
138*4882a593Smuzhiyun /**
139*4882a593Smuzhiyun  * DECLARE_IDTENTRY_RAW_ERRORCODE - Declare functions for raw IDT entry points
140*4882a593Smuzhiyun  *				    Error code pushed by hardware
141*4882a593Smuzhiyun  * @vector:	Vector number (ignored for C)
142*4882a593Smuzhiyun  * @func:	Function name of the entry point
143*4882a593Smuzhiyun  *
144*4882a593Smuzhiyun  * Maps to DECLARE_IDTENTRY_ERRORCODE()
145*4882a593Smuzhiyun  */
146*4882a593Smuzhiyun #define DECLARE_IDTENTRY_RAW_ERRORCODE(vector, func)			\
147*4882a593Smuzhiyun 	DECLARE_IDTENTRY_ERRORCODE(vector, func)
148*4882a593Smuzhiyun 
149*4882a593Smuzhiyun /**
150*4882a593Smuzhiyun  * DEFINE_IDTENTRY_RAW_ERRORCODE - Emit code for raw IDT entry points
151*4882a593Smuzhiyun  * @func:	Function name of the entry point
152*4882a593Smuzhiyun  *
153*4882a593Smuzhiyun  * @func is called from ASM entry code with interrupts disabled.
154*4882a593Smuzhiyun  *
155*4882a593Smuzhiyun  * The macro is written so it acts as function definition. Append the
156*4882a593Smuzhiyun  * body with a pair of curly brackets.
157*4882a593Smuzhiyun  *
158*4882a593Smuzhiyun  * Contrary to DEFINE_IDTENTRY_ERRORCODE() this does not invoke the
159*4882a593Smuzhiyun  * irqentry_enter/exit() helpers before and after the body invocation. This
160*4882a593Smuzhiyun  * needs to be done in the body itself if applicable. Use if extra work
161*4882a593Smuzhiyun  * is required before the enter/exit() helpers are invoked.
162*4882a593Smuzhiyun  */
163*4882a593Smuzhiyun #define DEFINE_IDTENTRY_RAW_ERRORCODE(func)				\
164*4882a593Smuzhiyun __visible noinstr void func(struct pt_regs *regs, unsigned long error_code)
165*4882a593Smuzhiyun 
166*4882a593Smuzhiyun /**
167*4882a593Smuzhiyun  * DECLARE_IDTENTRY_IRQ - Declare functions for device interrupt IDT entry
168*4882a593Smuzhiyun  *			  points (common/spurious)
169*4882a593Smuzhiyun  * @vector:	Vector number (ignored for C)
170*4882a593Smuzhiyun  * @func:	Function name of the entry point
171*4882a593Smuzhiyun  *
172*4882a593Smuzhiyun  * Maps to DECLARE_IDTENTRY_ERRORCODE()
173*4882a593Smuzhiyun  */
174*4882a593Smuzhiyun #define DECLARE_IDTENTRY_IRQ(vector, func)				\
175*4882a593Smuzhiyun 	DECLARE_IDTENTRY_ERRORCODE(vector, func)
176*4882a593Smuzhiyun 
177*4882a593Smuzhiyun /**
178*4882a593Smuzhiyun  * DEFINE_IDTENTRY_IRQ - Emit code for device interrupt IDT entry points
179*4882a593Smuzhiyun  * @func:	Function name of the entry point
180*4882a593Smuzhiyun  *
181*4882a593Smuzhiyun  * The vector number is pushed by the low level entry stub and handed
182*4882a593Smuzhiyun  * to the function as error_code argument which needs to be truncated
183*4882a593Smuzhiyun  * to an u8 because the push is sign extending.
184*4882a593Smuzhiyun  *
185*4882a593Smuzhiyun  * irq_enter/exit_rcu() are invoked before the function body and the
186*4882a593Smuzhiyun  * KVM L1D flush request is set. Stack switching to the interrupt stack
187*4882a593Smuzhiyun  * has to be done in the function body if necessary.
188*4882a593Smuzhiyun  */
189*4882a593Smuzhiyun #define DEFINE_IDTENTRY_IRQ(func)					\
190*4882a593Smuzhiyun static __always_inline void __##func(struct pt_regs *regs, u8 vector);	\
191*4882a593Smuzhiyun 									\
192*4882a593Smuzhiyun __visible noinstr void func(struct pt_regs *regs,			\
193*4882a593Smuzhiyun 			    unsigned long error_code)			\
194*4882a593Smuzhiyun {									\
195*4882a593Smuzhiyun 	irqentry_state_t state = irqentry_enter(regs);			\
196*4882a593Smuzhiyun 									\
197*4882a593Smuzhiyun 	instrumentation_begin();					\
198*4882a593Smuzhiyun 	irq_enter_rcu();						\
199*4882a593Smuzhiyun 	kvm_set_cpu_l1tf_flush_l1d();					\
200*4882a593Smuzhiyun 	__##func (regs, (u8)error_code);				\
201*4882a593Smuzhiyun 	irq_exit_rcu();							\
202*4882a593Smuzhiyun 	instrumentation_end();						\
203*4882a593Smuzhiyun 	irqentry_exit(regs, state);					\
204*4882a593Smuzhiyun }									\
205*4882a593Smuzhiyun 									\
206*4882a593Smuzhiyun static __always_inline void __##func(struct pt_regs *regs, u8 vector)
207*4882a593Smuzhiyun 
208*4882a593Smuzhiyun /**
209*4882a593Smuzhiyun  * DECLARE_IDTENTRY_SYSVEC - Declare functions for system vector entry points
210*4882a593Smuzhiyun  * @vector:	Vector number (ignored for C)
211*4882a593Smuzhiyun  * @func:	Function name of the entry point
212*4882a593Smuzhiyun  *
213*4882a593Smuzhiyun  * Declares three functions:
214*4882a593Smuzhiyun  * - The ASM entry point: asm_##func
215*4882a593Smuzhiyun  * - The XEN PV trap entry point: xen_##func (maybe unused)
216*4882a593Smuzhiyun  * - The C handler called from the ASM entry point
217*4882a593Smuzhiyun  *
218*4882a593Smuzhiyun  * Maps to DECLARE_IDTENTRY().
219*4882a593Smuzhiyun  */
220*4882a593Smuzhiyun #define DECLARE_IDTENTRY_SYSVEC(vector, func)				\
221*4882a593Smuzhiyun 	DECLARE_IDTENTRY(vector, func)
222*4882a593Smuzhiyun 
223*4882a593Smuzhiyun /**
224*4882a593Smuzhiyun  * DEFINE_IDTENTRY_SYSVEC - Emit code for system vector IDT entry points
225*4882a593Smuzhiyun  * @func:	Function name of the entry point
226*4882a593Smuzhiyun  *
227*4882a593Smuzhiyun  * irqentry_enter/exit() and irq_enter/exit_rcu() are invoked before the
228*4882a593Smuzhiyun  * function body. KVM L1D flush request is set.
229*4882a593Smuzhiyun  *
230*4882a593Smuzhiyun  * Runs the function on the interrupt stack if the entry hit kernel mode
231*4882a593Smuzhiyun  */
232*4882a593Smuzhiyun #define DEFINE_IDTENTRY_SYSVEC(func)					\
233*4882a593Smuzhiyun static void __##func(struct pt_regs *regs);				\
234*4882a593Smuzhiyun 									\
235*4882a593Smuzhiyun __visible noinstr void func(struct pt_regs *regs)			\
236*4882a593Smuzhiyun {									\
237*4882a593Smuzhiyun 	irqentry_state_t state = irqentry_enter(regs);			\
238*4882a593Smuzhiyun 									\
239*4882a593Smuzhiyun 	instrumentation_begin();					\
240*4882a593Smuzhiyun 	irq_enter_rcu();						\
241*4882a593Smuzhiyun 	kvm_set_cpu_l1tf_flush_l1d();					\
242*4882a593Smuzhiyun 	run_sysvec_on_irqstack_cond(__##func, regs);			\
243*4882a593Smuzhiyun 	irq_exit_rcu();							\
244*4882a593Smuzhiyun 	instrumentation_end();						\
245*4882a593Smuzhiyun 	irqentry_exit(regs, state);					\
246*4882a593Smuzhiyun }									\
247*4882a593Smuzhiyun 									\
248*4882a593Smuzhiyun static noinline void __##func(struct pt_regs *regs)
249*4882a593Smuzhiyun 
250*4882a593Smuzhiyun /**
251*4882a593Smuzhiyun  * DEFINE_IDTENTRY_SYSVEC_SIMPLE - Emit code for simple system vector IDT
252*4882a593Smuzhiyun  *				   entry points
253*4882a593Smuzhiyun  * @func:	Function name of the entry point
254*4882a593Smuzhiyun  *
255*4882a593Smuzhiyun  * Runs the function on the interrupted stack. No switch to IRQ stack and
256*4882a593Smuzhiyun  * only the minimal __irq_enter/exit() handling.
257*4882a593Smuzhiyun  *
258*4882a593Smuzhiyun  * Only use for 'empty' vectors like reschedule IPI and KVM posted
259*4882a593Smuzhiyun  * interrupt vectors.
260*4882a593Smuzhiyun  */
261*4882a593Smuzhiyun #define DEFINE_IDTENTRY_SYSVEC_SIMPLE(func)				\
262*4882a593Smuzhiyun static __always_inline void __##func(struct pt_regs *regs);		\
263*4882a593Smuzhiyun 									\
264*4882a593Smuzhiyun __visible noinstr void func(struct pt_regs *regs)			\
265*4882a593Smuzhiyun {									\
266*4882a593Smuzhiyun 	irqentry_state_t state = irqentry_enter(regs);			\
267*4882a593Smuzhiyun 									\
268*4882a593Smuzhiyun 	instrumentation_begin();					\
269*4882a593Smuzhiyun 	__irq_enter_raw();						\
270*4882a593Smuzhiyun 	kvm_set_cpu_l1tf_flush_l1d();					\
271*4882a593Smuzhiyun 	__##func (regs);						\
272*4882a593Smuzhiyun 	__irq_exit_raw();						\
273*4882a593Smuzhiyun 	instrumentation_end();						\
274*4882a593Smuzhiyun 	irqentry_exit(regs, state);					\
275*4882a593Smuzhiyun }									\
276*4882a593Smuzhiyun 									\
277*4882a593Smuzhiyun static __always_inline void __##func(struct pt_regs *regs)
278*4882a593Smuzhiyun 
279*4882a593Smuzhiyun /**
280*4882a593Smuzhiyun  * DECLARE_IDTENTRY_XENCB - Declare functions for XEN HV callback entry point
281*4882a593Smuzhiyun  * @vector:	Vector number (ignored for C)
282*4882a593Smuzhiyun  * @func:	Function name of the entry point
283*4882a593Smuzhiyun  *
284*4882a593Smuzhiyun  * Declares three functions:
285*4882a593Smuzhiyun  * - The ASM entry point: asm_##func
286*4882a593Smuzhiyun  * - The XEN PV trap entry point: xen_##func (maybe unused)
287*4882a593Smuzhiyun  * - The C handler called from the ASM entry point
288*4882a593Smuzhiyun  *
289*4882a593Smuzhiyun  * Maps to DECLARE_IDTENTRY(). Distinct entry point to handle the 32/64-bit
290*4882a593Smuzhiyun  * difference
291*4882a593Smuzhiyun  */
292*4882a593Smuzhiyun #define DECLARE_IDTENTRY_XENCB(vector, func)				\
293*4882a593Smuzhiyun 	DECLARE_IDTENTRY(vector, func)
294*4882a593Smuzhiyun 
295*4882a593Smuzhiyun #ifdef CONFIG_X86_64
296*4882a593Smuzhiyun /**
297*4882a593Smuzhiyun  * DECLARE_IDTENTRY_IST - Declare functions for IST handling IDT entry points
298*4882a593Smuzhiyun  * @vector:	Vector number (ignored for C)
299*4882a593Smuzhiyun  * @func:	Function name of the entry point
300*4882a593Smuzhiyun  *
301*4882a593Smuzhiyun  * Maps to DECLARE_IDTENTRY_RAW, but declares also the NOIST C handler
302*4882a593Smuzhiyun  * which is called from the ASM entry point on user mode entry
303*4882a593Smuzhiyun  */
304*4882a593Smuzhiyun #define DECLARE_IDTENTRY_IST(vector, func)				\
305*4882a593Smuzhiyun 	DECLARE_IDTENTRY_RAW(vector, func);				\
306*4882a593Smuzhiyun 	__visible void noist_##func(struct pt_regs *regs)
307*4882a593Smuzhiyun 
308*4882a593Smuzhiyun /**
309*4882a593Smuzhiyun  * DECLARE_IDTENTRY_VC - Declare functions for the VC entry point
310*4882a593Smuzhiyun  * @vector:	Vector number (ignored for C)
311*4882a593Smuzhiyun  * @func:	Function name of the entry point
312*4882a593Smuzhiyun  *
313*4882a593Smuzhiyun  * Maps to DECLARE_IDTENTRY_RAW_ERRORCODE, but declares also the
314*4882a593Smuzhiyun  * safe_stack C handler.
315*4882a593Smuzhiyun  */
316*4882a593Smuzhiyun #define DECLARE_IDTENTRY_VC(vector, func)				\
317*4882a593Smuzhiyun 	DECLARE_IDTENTRY_RAW_ERRORCODE(vector, func);			\
318*4882a593Smuzhiyun 	__visible noinstr void kernel_##func(struct pt_regs *regs, unsigned long error_code);	\
319*4882a593Smuzhiyun 	__visible noinstr void   user_##func(struct pt_regs *regs, unsigned long error_code)
320*4882a593Smuzhiyun 
321*4882a593Smuzhiyun /**
322*4882a593Smuzhiyun  * DEFINE_IDTENTRY_IST - Emit code for IST entry points
323*4882a593Smuzhiyun  * @func:	Function name of the entry point
324*4882a593Smuzhiyun  *
325*4882a593Smuzhiyun  * Maps to DEFINE_IDTENTRY_RAW
326*4882a593Smuzhiyun  */
327*4882a593Smuzhiyun #define DEFINE_IDTENTRY_IST(func)					\
328*4882a593Smuzhiyun 	DEFINE_IDTENTRY_RAW(func)
329*4882a593Smuzhiyun 
330*4882a593Smuzhiyun /**
331*4882a593Smuzhiyun  * DEFINE_IDTENTRY_NOIST - Emit code for NOIST entry points which
332*4882a593Smuzhiyun  *			   belong to a IST entry point (MCE, DB)
333*4882a593Smuzhiyun  * @func:	Function name of the entry point. Must be the same as
334*4882a593Smuzhiyun  *		the function name of the corresponding IST variant
335*4882a593Smuzhiyun  *
336*4882a593Smuzhiyun  * Maps to DEFINE_IDTENTRY_RAW().
337*4882a593Smuzhiyun  */
338*4882a593Smuzhiyun #define DEFINE_IDTENTRY_NOIST(func)					\
339*4882a593Smuzhiyun 	DEFINE_IDTENTRY_RAW(noist_##func)
340*4882a593Smuzhiyun 
341*4882a593Smuzhiyun /**
342*4882a593Smuzhiyun  * DECLARE_IDTENTRY_DF - Declare functions for double fault
343*4882a593Smuzhiyun  * @vector:	Vector number (ignored for C)
344*4882a593Smuzhiyun  * @func:	Function name of the entry point
345*4882a593Smuzhiyun  *
346*4882a593Smuzhiyun  * Maps to DECLARE_IDTENTRY_RAW_ERRORCODE
347*4882a593Smuzhiyun  */
348*4882a593Smuzhiyun #define DECLARE_IDTENTRY_DF(vector, func)				\
349*4882a593Smuzhiyun 	DECLARE_IDTENTRY_RAW_ERRORCODE(vector, func)
350*4882a593Smuzhiyun 
351*4882a593Smuzhiyun /**
352*4882a593Smuzhiyun  * DEFINE_IDTENTRY_DF - Emit code for double fault
353*4882a593Smuzhiyun  * @func:	Function name of the entry point
354*4882a593Smuzhiyun  *
355*4882a593Smuzhiyun  * Maps to DEFINE_IDTENTRY_RAW_ERRORCODE
356*4882a593Smuzhiyun  */
357*4882a593Smuzhiyun #define DEFINE_IDTENTRY_DF(func)					\
358*4882a593Smuzhiyun 	DEFINE_IDTENTRY_RAW_ERRORCODE(func)
359*4882a593Smuzhiyun 
360*4882a593Smuzhiyun /**
361*4882a593Smuzhiyun  * DEFINE_IDTENTRY_VC_KERNEL - Emit code for VMM communication handler
362*4882a593Smuzhiyun 			       when raised from kernel mode
363*4882a593Smuzhiyun  * @func:	Function name of the entry point
364*4882a593Smuzhiyun  *
365*4882a593Smuzhiyun  * Maps to DEFINE_IDTENTRY_RAW_ERRORCODE
366*4882a593Smuzhiyun  */
367*4882a593Smuzhiyun #define DEFINE_IDTENTRY_VC_KERNEL(func)				\
368*4882a593Smuzhiyun 	DEFINE_IDTENTRY_RAW_ERRORCODE(kernel_##func)
369*4882a593Smuzhiyun 
370*4882a593Smuzhiyun /**
371*4882a593Smuzhiyun  * DEFINE_IDTENTRY_VC_USER - Emit code for VMM communication handler
372*4882a593Smuzhiyun 			     when raised from user mode
373*4882a593Smuzhiyun  * @func:	Function name of the entry point
374*4882a593Smuzhiyun  *
375*4882a593Smuzhiyun  * Maps to DEFINE_IDTENTRY_RAW_ERRORCODE
376*4882a593Smuzhiyun  */
377*4882a593Smuzhiyun #define DEFINE_IDTENTRY_VC_USER(func)				\
378*4882a593Smuzhiyun 	DEFINE_IDTENTRY_RAW_ERRORCODE(user_##func)
379*4882a593Smuzhiyun 
380*4882a593Smuzhiyun #else	/* CONFIG_X86_64 */
381*4882a593Smuzhiyun 
382*4882a593Smuzhiyun /**
383*4882a593Smuzhiyun  * DECLARE_IDTENTRY_DF - Declare functions for double fault 32bit variant
384*4882a593Smuzhiyun  * @vector:	Vector number (ignored for C)
385*4882a593Smuzhiyun  * @func:	Function name of the entry point
386*4882a593Smuzhiyun  *
387*4882a593Smuzhiyun  * Declares two functions:
388*4882a593Smuzhiyun  * - The ASM entry point: asm_##func
389*4882a593Smuzhiyun  * - The C handler called from the C shim
390*4882a593Smuzhiyun  */
391*4882a593Smuzhiyun #define DECLARE_IDTENTRY_DF(vector, func)				\
392*4882a593Smuzhiyun 	asmlinkage void asm_##func(void);				\
393*4882a593Smuzhiyun 	__visible void func(struct pt_regs *regs,			\
394*4882a593Smuzhiyun 			    unsigned long error_code,			\
395*4882a593Smuzhiyun 			    unsigned long address)
396*4882a593Smuzhiyun 
397*4882a593Smuzhiyun /**
398*4882a593Smuzhiyun  * DEFINE_IDTENTRY_DF - Emit code for double fault on 32bit
399*4882a593Smuzhiyun  * @func:	Function name of the entry point
400*4882a593Smuzhiyun  *
401*4882a593Smuzhiyun  * This is called through the doublefault shim which already provides
402*4882a593Smuzhiyun  * cr2 in the address argument.
403*4882a593Smuzhiyun  */
404*4882a593Smuzhiyun #define DEFINE_IDTENTRY_DF(func)					\
405*4882a593Smuzhiyun __visible noinstr void func(struct pt_regs *regs,			\
406*4882a593Smuzhiyun 			    unsigned long error_code,			\
407*4882a593Smuzhiyun 			    unsigned long address)
408*4882a593Smuzhiyun 
409*4882a593Smuzhiyun #endif	/* !CONFIG_X86_64 */
410*4882a593Smuzhiyun 
411*4882a593Smuzhiyun /* C-Code mapping */
412*4882a593Smuzhiyun #define DECLARE_IDTENTRY_NMI		DECLARE_IDTENTRY_RAW
413*4882a593Smuzhiyun #define DEFINE_IDTENTRY_NMI		DEFINE_IDTENTRY_RAW
414*4882a593Smuzhiyun 
415*4882a593Smuzhiyun #ifdef CONFIG_X86_64
416*4882a593Smuzhiyun #define DECLARE_IDTENTRY_MCE		DECLARE_IDTENTRY_IST
417*4882a593Smuzhiyun #define DEFINE_IDTENTRY_MCE		DEFINE_IDTENTRY_IST
418*4882a593Smuzhiyun #define DEFINE_IDTENTRY_MCE_USER	DEFINE_IDTENTRY_NOIST
419*4882a593Smuzhiyun 
420*4882a593Smuzhiyun #define DECLARE_IDTENTRY_DEBUG		DECLARE_IDTENTRY_IST
421*4882a593Smuzhiyun #define DEFINE_IDTENTRY_DEBUG		DEFINE_IDTENTRY_IST
422*4882a593Smuzhiyun #define DEFINE_IDTENTRY_DEBUG_USER	DEFINE_IDTENTRY_NOIST
423*4882a593Smuzhiyun #endif
424*4882a593Smuzhiyun 
425*4882a593Smuzhiyun #else /* !__ASSEMBLY__ */
426*4882a593Smuzhiyun 
427*4882a593Smuzhiyun /*
428*4882a593Smuzhiyun  * The ASM variants for DECLARE_IDTENTRY*() which emit the ASM entry stubs.
429*4882a593Smuzhiyun  */
430*4882a593Smuzhiyun #define DECLARE_IDTENTRY(vector, func)					\
431*4882a593Smuzhiyun 	idtentry vector asm_##func func has_error_code=0
432*4882a593Smuzhiyun 
433*4882a593Smuzhiyun #define DECLARE_IDTENTRY_ERRORCODE(vector, func)			\
434*4882a593Smuzhiyun 	idtentry vector asm_##func func has_error_code=1
435*4882a593Smuzhiyun 
436*4882a593Smuzhiyun /* Special case for 32bit IRET 'trap'. Do not emit ASM code */
437*4882a593Smuzhiyun #define DECLARE_IDTENTRY_SW(vector, func)
438*4882a593Smuzhiyun 
439*4882a593Smuzhiyun #define DECLARE_IDTENTRY_RAW(vector, func)				\
440*4882a593Smuzhiyun 	DECLARE_IDTENTRY(vector, func)
441*4882a593Smuzhiyun 
442*4882a593Smuzhiyun #define DECLARE_IDTENTRY_RAW_ERRORCODE(vector, func)			\
443*4882a593Smuzhiyun 	DECLARE_IDTENTRY_ERRORCODE(vector, func)
444*4882a593Smuzhiyun 
445*4882a593Smuzhiyun /* Entries for common/spurious (device) interrupts */
446*4882a593Smuzhiyun #define DECLARE_IDTENTRY_IRQ(vector, func)				\
447*4882a593Smuzhiyun 	idtentry_irq vector func
448*4882a593Smuzhiyun 
449*4882a593Smuzhiyun /* System vector entries */
450*4882a593Smuzhiyun #define DECLARE_IDTENTRY_SYSVEC(vector, func)				\
451*4882a593Smuzhiyun 	idtentry_sysvec vector func
452*4882a593Smuzhiyun 
453*4882a593Smuzhiyun #ifdef CONFIG_X86_64
454*4882a593Smuzhiyun # define DECLARE_IDTENTRY_MCE(vector, func)				\
455*4882a593Smuzhiyun 	idtentry_mce_db vector asm_##func func
456*4882a593Smuzhiyun 
457*4882a593Smuzhiyun # define DECLARE_IDTENTRY_DEBUG(vector, func)				\
458*4882a593Smuzhiyun 	idtentry_mce_db vector asm_##func func
459*4882a593Smuzhiyun 
460*4882a593Smuzhiyun # define DECLARE_IDTENTRY_DF(vector, func)				\
461*4882a593Smuzhiyun 	idtentry_df vector asm_##func func
462*4882a593Smuzhiyun 
463*4882a593Smuzhiyun # define DECLARE_IDTENTRY_XENCB(vector, func)				\
464*4882a593Smuzhiyun 	DECLARE_IDTENTRY(vector, func)
465*4882a593Smuzhiyun 
466*4882a593Smuzhiyun # define DECLARE_IDTENTRY_VC(vector, func)				\
467*4882a593Smuzhiyun 	idtentry_vc vector asm_##func func
468*4882a593Smuzhiyun 
469*4882a593Smuzhiyun #else
470*4882a593Smuzhiyun # define DECLARE_IDTENTRY_MCE(vector, func)				\
471*4882a593Smuzhiyun 	DECLARE_IDTENTRY(vector, func)
472*4882a593Smuzhiyun 
473*4882a593Smuzhiyun /* No ASM emitted for DF as this goes through a C shim */
474*4882a593Smuzhiyun # define DECLARE_IDTENTRY_DF(vector, func)
475*4882a593Smuzhiyun 
476*4882a593Smuzhiyun /* No ASM emitted for XEN hypervisor callback */
477*4882a593Smuzhiyun # define DECLARE_IDTENTRY_XENCB(vector, func)
478*4882a593Smuzhiyun 
479*4882a593Smuzhiyun #endif
480*4882a593Smuzhiyun 
481*4882a593Smuzhiyun /* No ASM code emitted for NMI */
482*4882a593Smuzhiyun #define DECLARE_IDTENTRY_NMI(vector, func)
483*4882a593Smuzhiyun 
484*4882a593Smuzhiyun /*
485*4882a593Smuzhiyun  * ASM code to emit the common vector entry stubs where each stub is
486*4882a593Smuzhiyun  * packed into 8 bytes.
487*4882a593Smuzhiyun  *
488*4882a593Smuzhiyun  * Note, that the 'pushq imm8' is emitted via '.byte 0x6a, vector' because
489*4882a593Smuzhiyun  * GCC treats the local vector variable as unsigned int and would expand
490*4882a593Smuzhiyun  * all vectors above 0x7F to a 5 byte push. The original code did an
491*4882a593Smuzhiyun  * adjustment of the vector number to be in the signed byte range to avoid
492*4882a593Smuzhiyun  * this. While clever it's mindboggling counterintuitive and requires the
493*4882a593Smuzhiyun  * odd conversion back to a real vector number in the C entry points. Using
494*4882a593Smuzhiyun  * .byte achieves the same thing and the only fixup needed in the C entry
495*4882a593Smuzhiyun  * point is to mask off the bits above bit 7 because the push is sign
496*4882a593Smuzhiyun  * extending.
497*4882a593Smuzhiyun  */
498*4882a593Smuzhiyun 	.align 8
499*4882a593Smuzhiyun SYM_CODE_START(irq_entries_start)
500*4882a593Smuzhiyun     vector=FIRST_EXTERNAL_VECTOR
501*4882a593Smuzhiyun     .rept (FIRST_SYSTEM_VECTOR - FIRST_EXTERNAL_VECTOR)
502*4882a593Smuzhiyun 	UNWIND_HINT_IRET_REGS
503*4882a593Smuzhiyun 0 :
504*4882a593Smuzhiyun 	.byte	0x6a, vector
505*4882a593Smuzhiyun 	jmp	asm_common_interrupt
506*4882a593Smuzhiyun 	nop
507*4882a593Smuzhiyun 	/* Ensure that the above is 8 bytes max */
508*4882a593Smuzhiyun 	. = 0b + 8
509*4882a593Smuzhiyun 	vector = vector+1
510*4882a593Smuzhiyun     .endr
511*4882a593Smuzhiyun SYM_CODE_END(irq_entries_start)
512*4882a593Smuzhiyun 
513*4882a593Smuzhiyun #ifdef CONFIG_X86_LOCAL_APIC
514*4882a593Smuzhiyun 	.align 8
515*4882a593Smuzhiyun SYM_CODE_START(spurious_entries_start)
516*4882a593Smuzhiyun     vector=FIRST_SYSTEM_VECTOR
517*4882a593Smuzhiyun     .rept (NR_VECTORS - FIRST_SYSTEM_VECTOR)
518*4882a593Smuzhiyun 	UNWIND_HINT_IRET_REGS
519*4882a593Smuzhiyun 0 :
520*4882a593Smuzhiyun 	.byte	0x6a, vector
521*4882a593Smuzhiyun 	jmp	asm_spurious_interrupt
522*4882a593Smuzhiyun 	nop
523*4882a593Smuzhiyun 	/* Ensure that the above is 8 bytes max */
524*4882a593Smuzhiyun 	. = 0b + 8
525*4882a593Smuzhiyun 	vector = vector+1
526*4882a593Smuzhiyun     .endr
527*4882a593Smuzhiyun SYM_CODE_END(spurious_entries_start)
528*4882a593Smuzhiyun #endif
529*4882a593Smuzhiyun 
530*4882a593Smuzhiyun #endif /* __ASSEMBLY__ */
531*4882a593Smuzhiyun 
532*4882a593Smuzhiyun /*
533*4882a593Smuzhiyun  * The actual entry points. Note that DECLARE_IDTENTRY*() serves two
534*4882a593Smuzhiyun  * purposes:
535*4882a593Smuzhiyun  *  - provide the function declarations when included from C-Code
536*4882a593Smuzhiyun  *  - emit the ASM stubs when included from entry_32/64.S
537*4882a593Smuzhiyun  *
538*4882a593Smuzhiyun  * This avoids duplicate defines and ensures that everything is consistent.
539*4882a593Smuzhiyun  */
540*4882a593Smuzhiyun 
541*4882a593Smuzhiyun /*
542*4882a593Smuzhiyun  * Dummy trap number so the low level ASM macro vector number checks do not
543*4882a593Smuzhiyun  * match which results in emitting plain IDTENTRY stubs without bells and
544*4882a593Smuzhiyun  * whistels.
545*4882a593Smuzhiyun  */
546*4882a593Smuzhiyun #define X86_TRAP_OTHER		0xFFFF
547*4882a593Smuzhiyun 
548*4882a593Smuzhiyun /* Simple exception entry points. No hardware error code */
549*4882a593Smuzhiyun DECLARE_IDTENTRY(X86_TRAP_DE,		exc_divide_error);
550*4882a593Smuzhiyun DECLARE_IDTENTRY(X86_TRAP_OF,		exc_overflow);
551*4882a593Smuzhiyun DECLARE_IDTENTRY(X86_TRAP_BR,		exc_bounds);
552*4882a593Smuzhiyun DECLARE_IDTENTRY(X86_TRAP_NM,		exc_device_not_available);
553*4882a593Smuzhiyun DECLARE_IDTENTRY(X86_TRAP_OLD_MF,	exc_coproc_segment_overrun);
554*4882a593Smuzhiyun DECLARE_IDTENTRY(X86_TRAP_SPURIOUS,	exc_spurious_interrupt_bug);
555*4882a593Smuzhiyun DECLARE_IDTENTRY(X86_TRAP_MF,		exc_coprocessor_error);
556*4882a593Smuzhiyun DECLARE_IDTENTRY(X86_TRAP_XF,		exc_simd_coprocessor_error);
557*4882a593Smuzhiyun 
558*4882a593Smuzhiyun /* 32bit software IRET trap. Do not emit ASM code */
559*4882a593Smuzhiyun DECLARE_IDTENTRY_SW(X86_TRAP_IRET,	iret_error);
560*4882a593Smuzhiyun 
561*4882a593Smuzhiyun /* Simple exception entries with error code pushed by hardware */
562*4882a593Smuzhiyun DECLARE_IDTENTRY_ERRORCODE(X86_TRAP_TS,	exc_invalid_tss);
563*4882a593Smuzhiyun DECLARE_IDTENTRY_ERRORCODE(X86_TRAP_NP,	exc_segment_not_present);
564*4882a593Smuzhiyun DECLARE_IDTENTRY_ERRORCODE(X86_TRAP_SS,	exc_stack_segment);
565*4882a593Smuzhiyun DECLARE_IDTENTRY_ERRORCODE(X86_TRAP_GP,	exc_general_protection);
566*4882a593Smuzhiyun DECLARE_IDTENTRY_ERRORCODE(X86_TRAP_AC,	exc_alignment_check);
567*4882a593Smuzhiyun 
568*4882a593Smuzhiyun /* Raw exception entries which need extra work */
569*4882a593Smuzhiyun DECLARE_IDTENTRY_RAW(X86_TRAP_UD,		exc_invalid_op);
570*4882a593Smuzhiyun DECLARE_IDTENTRY_RAW(X86_TRAP_BP,		exc_int3);
571*4882a593Smuzhiyun DECLARE_IDTENTRY_RAW_ERRORCODE(X86_TRAP_PF,	exc_page_fault);
572*4882a593Smuzhiyun 
573*4882a593Smuzhiyun #ifdef CONFIG_X86_MCE
574*4882a593Smuzhiyun #ifdef CONFIG_X86_64
575*4882a593Smuzhiyun DECLARE_IDTENTRY_MCE(X86_TRAP_MC,	exc_machine_check);
576*4882a593Smuzhiyun #else
577*4882a593Smuzhiyun DECLARE_IDTENTRY_RAW(X86_TRAP_MC,	exc_machine_check);
578*4882a593Smuzhiyun #endif
579*4882a593Smuzhiyun #endif
580*4882a593Smuzhiyun 
581*4882a593Smuzhiyun /* NMI */
582*4882a593Smuzhiyun 
583*4882a593Smuzhiyun #if defined(CONFIG_X86_64) && IS_ENABLED(CONFIG_KVM_INTEL)
584*4882a593Smuzhiyun /*
585*4882a593Smuzhiyun  * Special NOIST entry point for VMX which invokes this on the kernel
586*4882a593Smuzhiyun  * stack. asm_exc_nmi() requires an IST to work correctly vs. the NMI
587*4882a593Smuzhiyun  * 'executing' marker.
588*4882a593Smuzhiyun  *
589*4882a593Smuzhiyun  * On 32bit this just uses the regular NMI entry point because 32-bit does
590*4882a593Smuzhiyun  * not have ISTs.
591*4882a593Smuzhiyun  */
592*4882a593Smuzhiyun DECLARE_IDTENTRY(X86_TRAP_NMI,		exc_nmi_noist);
593*4882a593Smuzhiyun #else
594*4882a593Smuzhiyun #define asm_exc_nmi_noist		asm_exc_nmi
595*4882a593Smuzhiyun #endif
596*4882a593Smuzhiyun 
597*4882a593Smuzhiyun DECLARE_IDTENTRY_NMI(X86_TRAP_NMI,	exc_nmi);
598*4882a593Smuzhiyun #ifdef CONFIG_XEN_PV
599*4882a593Smuzhiyun DECLARE_IDTENTRY_RAW(X86_TRAP_NMI,	xenpv_exc_nmi);
600*4882a593Smuzhiyun #endif
601*4882a593Smuzhiyun 
602*4882a593Smuzhiyun /* #DB */
603*4882a593Smuzhiyun #ifdef CONFIG_X86_64
604*4882a593Smuzhiyun DECLARE_IDTENTRY_DEBUG(X86_TRAP_DB,	exc_debug);
605*4882a593Smuzhiyun #else
606*4882a593Smuzhiyun DECLARE_IDTENTRY_RAW(X86_TRAP_DB,	exc_debug);
607*4882a593Smuzhiyun #endif
608*4882a593Smuzhiyun #ifdef CONFIG_XEN_PV
609*4882a593Smuzhiyun DECLARE_IDTENTRY_RAW(X86_TRAP_DB,	xenpv_exc_debug);
610*4882a593Smuzhiyun #endif
611*4882a593Smuzhiyun 
612*4882a593Smuzhiyun /* #DF */
613*4882a593Smuzhiyun DECLARE_IDTENTRY_DF(X86_TRAP_DF,	exc_double_fault);
614*4882a593Smuzhiyun 
615*4882a593Smuzhiyun /* #VC */
616*4882a593Smuzhiyun #ifdef CONFIG_AMD_MEM_ENCRYPT
617*4882a593Smuzhiyun DECLARE_IDTENTRY_VC(X86_TRAP_VC,	exc_vmm_communication);
618*4882a593Smuzhiyun #endif
619*4882a593Smuzhiyun 
620*4882a593Smuzhiyun #ifdef CONFIG_XEN_PV
621*4882a593Smuzhiyun DECLARE_IDTENTRY_XENCB(X86_TRAP_OTHER,	exc_xen_hypervisor_callback);
622*4882a593Smuzhiyun DECLARE_IDTENTRY_RAW(X86_TRAP_OTHER,	exc_xen_unknown_trap);
623*4882a593Smuzhiyun #endif
624*4882a593Smuzhiyun 
625*4882a593Smuzhiyun /* Device interrupts common/spurious */
626*4882a593Smuzhiyun DECLARE_IDTENTRY_IRQ(X86_TRAP_OTHER,	common_interrupt);
627*4882a593Smuzhiyun #ifdef CONFIG_X86_LOCAL_APIC
628*4882a593Smuzhiyun DECLARE_IDTENTRY_IRQ(X86_TRAP_OTHER,	spurious_interrupt);
629*4882a593Smuzhiyun #endif
630*4882a593Smuzhiyun 
631*4882a593Smuzhiyun /* System vector entry points */
632*4882a593Smuzhiyun #ifdef CONFIG_X86_LOCAL_APIC
633*4882a593Smuzhiyun DECLARE_IDTENTRY_SYSVEC(ERROR_APIC_VECTOR,		sysvec_error_interrupt);
634*4882a593Smuzhiyun DECLARE_IDTENTRY_SYSVEC(SPURIOUS_APIC_VECTOR,		sysvec_spurious_apic_interrupt);
635*4882a593Smuzhiyun DECLARE_IDTENTRY_SYSVEC(LOCAL_TIMER_VECTOR,		sysvec_apic_timer_interrupt);
636*4882a593Smuzhiyun DECLARE_IDTENTRY_SYSVEC(X86_PLATFORM_IPI_VECTOR,	sysvec_x86_platform_ipi);
637*4882a593Smuzhiyun #endif
638*4882a593Smuzhiyun 
639*4882a593Smuzhiyun #ifdef CONFIG_SMP
640*4882a593Smuzhiyun DECLARE_IDTENTRY(RESCHEDULE_VECTOR,			sysvec_reschedule_ipi);
641*4882a593Smuzhiyun DECLARE_IDTENTRY_SYSVEC(IRQ_MOVE_CLEANUP_VECTOR,	sysvec_irq_move_cleanup);
642*4882a593Smuzhiyun DECLARE_IDTENTRY_SYSVEC(REBOOT_VECTOR,			sysvec_reboot);
643*4882a593Smuzhiyun DECLARE_IDTENTRY_SYSVEC(CALL_FUNCTION_SINGLE_VECTOR,	sysvec_call_function_single);
644*4882a593Smuzhiyun DECLARE_IDTENTRY_SYSVEC(CALL_FUNCTION_VECTOR,		sysvec_call_function);
645*4882a593Smuzhiyun #endif
646*4882a593Smuzhiyun 
647*4882a593Smuzhiyun #ifdef CONFIG_X86_LOCAL_APIC
648*4882a593Smuzhiyun # ifdef CONFIG_X86_MCE_THRESHOLD
649*4882a593Smuzhiyun DECLARE_IDTENTRY_SYSVEC(THRESHOLD_APIC_VECTOR,		sysvec_threshold);
650*4882a593Smuzhiyun # endif
651*4882a593Smuzhiyun 
652*4882a593Smuzhiyun # ifdef CONFIG_X86_MCE_AMD
653*4882a593Smuzhiyun DECLARE_IDTENTRY_SYSVEC(DEFERRED_ERROR_VECTOR,		sysvec_deferred_error);
654*4882a593Smuzhiyun # endif
655*4882a593Smuzhiyun 
656*4882a593Smuzhiyun # ifdef CONFIG_X86_THERMAL_VECTOR
657*4882a593Smuzhiyun DECLARE_IDTENTRY_SYSVEC(THERMAL_APIC_VECTOR,		sysvec_thermal);
658*4882a593Smuzhiyun # endif
659*4882a593Smuzhiyun 
660*4882a593Smuzhiyun # ifdef CONFIG_IRQ_WORK
661*4882a593Smuzhiyun DECLARE_IDTENTRY_SYSVEC(IRQ_WORK_VECTOR,		sysvec_irq_work);
662*4882a593Smuzhiyun # endif
663*4882a593Smuzhiyun #endif
664*4882a593Smuzhiyun 
665*4882a593Smuzhiyun #ifdef CONFIG_HAVE_KVM
666*4882a593Smuzhiyun DECLARE_IDTENTRY_SYSVEC(POSTED_INTR_VECTOR,		sysvec_kvm_posted_intr_ipi);
667*4882a593Smuzhiyun DECLARE_IDTENTRY_SYSVEC(POSTED_INTR_WAKEUP_VECTOR,	sysvec_kvm_posted_intr_wakeup_ipi);
668*4882a593Smuzhiyun DECLARE_IDTENTRY_SYSVEC(POSTED_INTR_NESTED_VECTOR,	sysvec_kvm_posted_intr_nested_ipi);
669*4882a593Smuzhiyun #endif
670*4882a593Smuzhiyun 
671*4882a593Smuzhiyun #if IS_ENABLED(CONFIG_HYPERV)
672*4882a593Smuzhiyun DECLARE_IDTENTRY_SYSVEC(HYPERVISOR_CALLBACK_VECTOR,	sysvec_hyperv_callback);
673*4882a593Smuzhiyun DECLARE_IDTENTRY_SYSVEC(HYPERV_REENLIGHTENMENT_VECTOR,	sysvec_hyperv_reenlightenment);
674*4882a593Smuzhiyun DECLARE_IDTENTRY_SYSVEC(HYPERV_STIMER0_VECTOR,	sysvec_hyperv_stimer0);
675*4882a593Smuzhiyun #endif
676*4882a593Smuzhiyun 
677*4882a593Smuzhiyun #if IS_ENABLED(CONFIG_ACRN_GUEST)
678*4882a593Smuzhiyun DECLARE_IDTENTRY_SYSVEC(HYPERVISOR_CALLBACK_VECTOR,	sysvec_acrn_hv_callback);
679*4882a593Smuzhiyun #endif
680*4882a593Smuzhiyun 
681*4882a593Smuzhiyun #ifdef CONFIG_XEN_PVHVM
682*4882a593Smuzhiyun DECLARE_IDTENTRY_SYSVEC(HYPERVISOR_CALLBACK_VECTOR,	sysvec_xen_hvm_callback);
683*4882a593Smuzhiyun #endif
684*4882a593Smuzhiyun 
685*4882a593Smuzhiyun #ifdef CONFIG_KVM_GUEST
686*4882a593Smuzhiyun DECLARE_IDTENTRY_SYSVEC(HYPERVISOR_CALLBACK_VECTOR,	sysvec_kvm_asyncpf_interrupt);
687*4882a593Smuzhiyun #endif
688*4882a593Smuzhiyun 
689*4882a593Smuzhiyun #undef X86_TRAP_OTHER
690*4882a593Smuzhiyun 
691*4882a593Smuzhiyun #endif
692