1 /* SPDX-License-Identifier: GPL-2.0 */
2 #ifndef _ASM_X86_IDTENTRY_H
3 #define _ASM_X86_IDTENTRY_H
5 /* Interrupts/Exceptions */
6 #include <asm/trapnr.h>
9 #include <linux/hardirq.h>
11 #include <asm/irq_stack.h>
13 void idtentry_enter_user(struct pt_regs *regs);
14 void idtentry_exit_user(struct pt_regs *regs);
16 bool idtentry_enter_cond_rcu(struct pt_regs *regs);
17 void idtentry_exit_cond_rcu(struct pt_regs *regs, bool rcu_exit);
20 * DECLARE_IDTENTRY - Declare functions for simple IDT entry points
21 * No error code pushed by hardware
22 * @vector: Vector number (ignored for C)
23 * @func: Function name of the entry point
25 * Declares three functions:
26 * - The ASM entry point: asm_##func
27 * - The XEN PV trap entry point: xen_##func (maybe unused)
28 * - The C handler called from the ASM entry point
30 * Note: This is the C variant of DECLARE_IDTENTRY(). As the name says it
31 * declares the entry points for usage in C code. There is an ASM variant
32 * as well which is used to emit the entry stubs in entry_32/64.S.
34 #define DECLARE_IDTENTRY(vector, func) \
35 asmlinkage void asm_##func(void); \
36 asmlinkage void xen_asm_##func(void); \
37 __visible void func(struct pt_regs *regs)
40 * DEFINE_IDTENTRY - Emit code for simple IDT entry points
41 * @func: Function name of the entry point
43 * @func is called from ASM entry code with interrupts disabled.
45 * The macro is written so it acts as function definition. Append the
46 * body with a pair of curly brackets.
48 * idtentry_enter() contains common code which has to be invoked before
49 * arbitrary code in the body. idtentry_exit() contains common code
50 * which has to run before returning to the low level assembly code.
52 #define DEFINE_IDTENTRY(func) \
53 static __always_inline void __##func(struct pt_regs *regs); \
55 __visible noinstr void func(struct pt_regs *regs) \
57 bool rcu_exit = idtentry_enter_cond_rcu(regs); \
59 instrumentation_begin(); \
61 instrumentation_end(); \
62 idtentry_exit_cond_rcu(regs, rcu_exit); \
65 static __always_inline void __##func(struct pt_regs *regs)
67 /* Special case for 32bit IRET 'trap' */
68 #define DECLARE_IDTENTRY_SW DECLARE_IDTENTRY
69 #define DEFINE_IDTENTRY_SW DEFINE_IDTENTRY
72 * DECLARE_IDTENTRY_ERRORCODE - Declare functions for simple IDT entry points
73 * Error code pushed by hardware
74 * @vector: Vector number (ignored for C)
75 * @func: Function name of the entry point
77 * Declares three functions:
78 * - The ASM entry point: asm_##func
79 * - The XEN PV trap entry point: xen_##func (maybe unused)
80 * - The C handler called from the ASM entry point
82 * Same as DECLARE_IDTENTRY, but has an extra error_code argument for the
85 #define DECLARE_IDTENTRY_ERRORCODE(vector, func) \
86 asmlinkage void asm_##func(void); \
87 asmlinkage void xen_asm_##func(void); \
88 __visible void func(struct pt_regs *regs, unsigned long error_code)
91 * DEFINE_IDTENTRY_ERRORCODE - Emit code for simple IDT entry points
92 * Error code pushed by hardware
93 * @func: Function name of the entry point
95 * Same as DEFINE_IDTENTRY, but has an extra error_code argument
97 #define DEFINE_IDTENTRY_ERRORCODE(func) \
98 static __always_inline void __##func(struct pt_regs *regs, \
99 unsigned long error_code); \
101 __visible noinstr void func(struct pt_regs *regs, \
102 unsigned long error_code) \
104 bool rcu_exit = idtentry_enter_cond_rcu(regs); \
106 instrumentation_begin(); \
107 __##func (regs, error_code); \
108 instrumentation_end(); \
109 idtentry_exit_cond_rcu(regs, rcu_exit); \
112 static __always_inline void __##func(struct pt_regs *regs, \
113 unsigned long error_code)
116 * DECLARE_IDTENTRY_RAW - Declare functions for raw IDT entry points
117 * No error code pushed by hardware
118 * @vector: Vector number (ignored for C)
119 * @func: Function name of the entry point
121 * Maps to DECLARE_IDTENTRY().
123 #define DECLARE_IDTENTRY_RAW(vector, func) \
124 DECLARE_IDTENTRY(vector, func)
127 * DEFINE_IDTENTRY_RAW - Emit code for raw IDT entry points
128 * @func: Function name of the entry point
130 * @func is called from ASM entry code with interrupts disabled.
132 * The macro is written so it acts as function definition. Append the
133 * body with a pair of curly brackets.
135 * Contrary to DEFINE_IDTENTRY() this does not invoke the
136 * idtentry_enter/exit() helpers before and after the body invocation. This
137 * needs to be done in the body itself if applicable. Use if extra work
138 * is required before the enter/exit() helpers are invoked.
140 #define DEFINE_IDTENTRY_RAW(func) \
141 __visible noinstr void func(struct pt_regs *regs)
144 * DECLARE_IDTENTRY_RAW_ERRORCODE - Declare functions for raw IDT entry points
145 * Error code pushed by hardware
146 * @vector: Vector number (ignored for C)
147 * @func: Function name of the entry point
149 * Maps to DECLARE_IDTENTRY_ERRORCODE()
151 #define DECLARE_IDTENTRY_RAW_ERRORCODE(vector, func) \
152 DECLARE_IDTENTRY_ERRORCODE(vector, func)
155 * DEFINE_IDTENTRY_RAW_ERRORCODE - Emit code for raw IDT entry points
156 * @func: Function name of the entry point
158 * @func is called from ASM entry code with interrupts disabled.
160 * The macro is written so it acts as function definition. Append the
161 * body with a pair of curly brackets.
163 * Contrary to DEFINE_IDTENTRY_ERRORCODE() this does not invoke the
164 * idtentry_enter/exit() helpers before and after the body invocation. This
165 * needs to be done in the body itself if applicable. Use if extra work
166 * is required before the enter/exit() helpers are invoked.
168 #define DEFINE_IDTENTRY_RAW_ERRORCODE(func) \
169 __visible noinstr void func(struct pt_regs *regs, unsigned long error_code)
172 * DECLARE_IDTENTRY_IRQ - Declare functions for device interrupt IDT entry
173 * points (common/spurious)
174 * @vector: Vector number (ignored for C)
175 * @func: Function name of the entry point
177 * Maps to DECLARE_IDTENTRY_ERRORCODE()
179 #define DECLARE_IDTENTRY_IRQ(vector, func) \
180 DECLARE_IDTENTRY_ERRORCODE(vector, func)
183 * DEFINE_IDTENTRY_IRQ - Emit code for device interrupt IDT entry points
184 * @func: Function name of the entry point
186 * The vector number is pushed by the low level entry stub and handed
187 * to the function as error_code argument which needs to be truncated
188 * to an u8 because the push is sign extending.
190 * On 64-bit idtentry_enter/exit() are invoked in the ASM entry code before
191 * and after switching to the interrupt stack. On 32-bit this happens in C.
193 * irq_enter/exit_rcu() are invoked before the function body and the
194 * KVM L1D flush request is set.
196 #define DEFINE_IDTENTRY_IRQ(func) \
197 static __always_inline void __##func(struct pt_regs *regs, u8 vector); \
199 __visible noinstr void func(struct pt_regs *regs, \
200 unsigned long error_code) \
202 bool rcu_exit = idtentry_enter_cond_rcu(regs); \
204 instrumentation_begin(); \
206 kvm_set_cpu_l1tf_flush_l1d(); \
207 __##func (regs, (u8)error_code); \
209 instrumentation_end(); \
210 idtentry_exit_cond_rcu(regs, rcu_exit); \
213 static __always_inline void __##func(struct pt_regs *regs, u8 vector)
216 * DECLARE_IDTENTRY_SYSVEC - Declare functions for system vector entry points
217 * @vector: Vector number (ignored for C)
218 * @func: Function name of the entry point
220 * Declares three functions:
221 * - The ASM entry point: asm_##func
222 * - The XEN PV trap entry point: xen_##func (maybe unused)
223 * - The C handler called from the ASM entry point
225 * Maps to DECLARE_IDTENTRY().
227 #define DECLARE_IDTENTRY_SYSVEC(vector, func) \
228 DECLARE_IDTENTRY(vector, func)
231 * DEFINE_IDTENTRY_SYSVEC - Emit code for system vector IDT entry points
232 * @func: Function name of the entry point
234 * idtentry_enter/exit() and irq_enter/exit_rcu() are invoked before the
235 * function body. KVM L1D flush request is set.
237 * Runs the function on the interrupt stack if the entry hit kernel mode
239 #define DEFINE_IDTENTRY_SYSVEC(func) \
240 static void __##func(struct pt_regs *regs); \
242 __visible noinstr void func(struct pt_regs *regs) \
244 bool rcu_exit = idtentry_enter_cond_rcu(regs); \
246 instrumentation_begin(); \
248 kvm_set_cpu_l1tf_flush_l1d(); \
249 run_on_irqstack_cond(__##func, regs, regs); \
251 instrumentation_end(); \
252 idtentry_exit_cond_rcu(regs, rcu_exit); \
255 static noinline void __##func(struct pt_regs *regs)
258 * DEFINE_IDTENTRY_SYSVEC_SIMPLE - Emit code for simple system vector IDT
260 * @func: Function name of the entry point
262 * Runs the function on the interrupted stack. No switch to IRQ stack and
263 * only the minimal __irq_enter/exit() handling.
265 * Only use for 'empty' vectors like reschedule IPI and KVM posted
268 #define DEFINE_IDTENTRY_SYSVEC_SIMPLE(func) \
269 static __always_inline void __##func(struct pt_regs *regs); \
271 __visible noinstr void func(struct pt_regs *regs) \
273 bool rcu_exit = idtentry_enter_cond_rcu(regs); \
275 instrumentation_begin(); \
277 kvm_set_cpu_l1tf_flush_l1d(); \
280 instrumentation_end(); \
281 idtentry_exit_cond_rcu(regs, rcu_exit); \
284 static __always_inline void __##func(struct pt_regs *regs)
287 * DECLARE_IDTENTRY_XENCB - Declare functions for XEN HV callback entry point
288 * @vector: Vector number (ignored for C)
289 * @func: Function name of the entry point
291 * Declares three functions:
292 * - The ASM entry point: asm_##func
293 * - The XEN PV trap entry point: xen_##func (maybe unused)
294 * - The C handler called from the ASM entry point
296 * Maps to DECLARE_IDTENTRY(). Distinct entry point to handle the 32/64-bit
299 #define DECLARE_IDTENTRY_XENCB(vector, func) \
300 DECLARE_IDTENTRY(vector, func)
304 * DECLARE_IDTENTRY_IST - Declare functions for IST handling IDT entry points
305 * @vector: Vector number (ignored for C)
306 * @func: Function name of the entry point
308 * Maps to DECLARE_IDTENTRY_RAW, but declares also the NOIST C handler
309 * which is called from the ASM entry point on user mode entry
311 #define DECLARE_IDTENTRY_IST(vector, func) \
312 DECLARE_IDTENTRY_RAW(vector, func); \
313 __visible void noist_##func(struct pt_regs *regs)
316 * DEFINE_IDTENTRY_IST - Emit code for IST entry points
317 * @func: Function name of the entry point
319 * Maps to DEFINE_IDTENTRY_RAW
321 #define DEFINE_IDTENTRY_IST(func) \
322 DEFINE_IDTENTRY_RAW(func)
325 * DEFINE_IDTENTRY_NOIST - Emit code for NOIST entry points which
326 * belong to a IST entry point (MCE, DB)
327 * @func: Function name of the entry point. Must be the same as
328 * the function name of the corresponding IST variant
330 * Maps to DEFINE_IDTENTRY_RAW().
332 #define DEFINE_IDTENTRY_NOIST(func) \
333 DEFINE_IDTENTRY_RAW(noist_##func)
336 * DECLARE_IDTENTRY_DF - Declare functions for double fault
337 * @vector: Vector number (ignored for C)
338 * @func: Function name of the entry point
340 * Maps to DECLARE_IDTENTRY_RAW_ERRORCODE
342 #define DECLARE_IDTENTRY_DF(vector, func) \
343 DECLARE_IDTENTRY_RAW_ERRORCODE(vector, func)
346 * DEFINE_IDTENTRY_DF - Emit code for double fault
347 * @func: Function name of the entry point
349 * Maps to DEFINE_IDTENTRY_RAW_ERRORCODE
351 #define DEFINE_IDTENTRY_DF(func) \
352 DEFINE_IDTENTRY_RAW_ERRORCODE(func)
354 #else /* CONFIG_X86_64 */
356 /* Maps to a regular IDTENTRY on 32bit for now */
357 # define DECLARE_IDTENTRY_IST DECLARE_IDTENTRY
358 # define DEFINE_IDTENTRY_IST DEFINE_IDTENTRY
361 * DECLARE_IDTENTRY_DF - Declare functions for double fault 32bit variant
362 * @vector: Vector number (ignored for C)
363 * @func: Function name of the entry point
365 * Declares two functions:
366 * - The ASM entry point: asm_##func
367 * - The C handler called from the C shim
369 #define DECLARE_IDTENTRY_DF(vector, func) \
370 asmlinkage void asm_##func(void); \
371 __visible void func(struct pt_regs *regs, \
372 unsigned long error_code, \
373 unsigned long address)
376 * DEFINE_IDTENTRY_DF - Emit code for double fault on 32bit
377 * @func: Function name of the entry point
379 * This is called through the doublefault shim which already provides
380 * cr2 in the address argument.
382 #define DEFINE_IDTENTRY_DF(func) \
383 __visible noinstr void func(struct pt_regs *regs, \
384 unsigned long error_code, \
385 unsigned long address)
387 #endif /* !CONFIG_X86_64 */
390 #define DECLARE_IDTENTRY_MCE DECLARE_IDTENTRY_IST
391 #define DEFINE_IDTENTRY_MCE DEFINE_IDTENTRY_IST
392 #define DEFINE_IDTENTRY_MCE_USER DEFINE_IDTENTRY_NOIST
394 #define DECLARE_IDTENTRY_NMI DECLARE_IDTENTRY_RAW
395 #define DEFINE_IDTENTRY_NMI DEFINE_IDTENTRY_RAW
397 #define DECLARE_IDTENTRY_DEBUG DECLARE_IDTENTRY_IST
398 #define DEFINE_IDTENTRY_DEBUG DEFINE_IDTENTRY_IST
399 #define DEFINE_IDTENTRY_DEBUG_USER DEFINE_IDTENTRY_NOIST
402 * DECLARE_IDTENTRY_XEN - Declare functions for XEN redirect IDT entry points
403 * @vector: Vector number (ignored for C)
404 * @func: Function name of the entry point
406 * Used for xennmi and xendebug redirections. No DEFINE as this is all ASM
409 #define DECLARE_IDTENTRY_XEN(vector, func) \
410 asmlinkage void xen_asm_exc_xen##func(void); \
411 asmlinkage void asm_exc_xen##func(void)
413 #else /* !__ASSEMBLY__ */
416 * The ASM variants for DECLARE_IDTENTRY*() which emit the ASM entry stubs.
418 #define DECLARE_IDTENTRY(vector, func) \
419 idtentry vector asm_##func func has_error_code=0
421 #define DECLARE_IDTENTRY_ERRORCODE(vector, func) \
422 idtentry vector asm_##func func has_error_code=1
424 /* Special case for 32bit IRET 'trap'. Do not emit ASM code */
425 #define DECLARE_IDTENTRY_SW(vector, func)
427 #define DECLARE_IDTENTRY_RAW(vector, func) \
428 DECLARE_IDTENTRY(vector, func)
430 #define DECLARE_IDTENTRY_RAW_ERRORCODE(vector, func) \
431 DECLARE_IDTENTRY_ERRORCODE(vector, func)
433 /* Entries for common/spurious (device) interrupts */
434 #define DECLARE_IDTENTRY_IRQ(vector, func) \
435 idtentry_irq vector func
437 /* System vector entries */
438 #define DECLARE_IDTENTRY_SYSVEC(vector, func) \
439 idtentry_sysvec vector func
442 # define DECLARE_IDTENTRY_MCE(vector, func) \
443 idtentry_mce_db vector asm_##func func
445 # define DECLARE_IDTENTRY_DEBUG(vector, func) \
446 idtentry_mce_db vector asm_##func func
448 # define DECLARE_IDTENTRY_DF(vector, func) \
449 idtentry_df vector asm_##func func
451 # define DECLARE_IDTENTRY_XENCB(vector, func) \
452 DECLARE_IDTENTRY(vector, func)
455 # define DECLARE_IDTENTRY_MCE(vector, func) \
456 DECLARE_IDTENTRY(vector, func)
458 # define DECLARE_IDTENTRY_DEBUG(vector, func) \
459 DECLARE_IDTENTRY(vector, func)
461 /* No ASM emitted for DF as this goes through a C shim */
462 # define DECLARE_IDTENTRY_DF(vector, func)
464 /* No ASM emitted for XEN hypervisor callback */
465 # define DECLARE_IDTENTRY_XENCB(vector, func)
469 /* No ASM code emitted for NMI */
470 #define DECLARE_IDTENTRY_NMI(vector, func)
472 /* XEN NMI and DB wrapper */
473 #define DECLARE_IDTENTRY_XEN(vector, func) \
474 idtentry vector asm_exc_xen##func exc_##func has_error_code=0
477 * ASM code to emit the common vector entry stubs where each stub is
478 * packed into 8 bytes.
480 * Note, that the 'pushq imm8' is emitted via '.byte 0x6a, vector' because
481 * GCC treats the local vector variable as unsigned int and would expand
482 * all vectors above 0x7F to a 5 byte push. The original code did an
483 * adjustment of the vector number to be in the signed byte range to avoid
484 * this. While clever it's mindboggling counterintuitive and requires the
485 * odd conversion back to a real vector number in the C entry points. Using
486 * .byte achieves the same thing and the only fixup needed in the C entry
487 * point is to mask off the bits above bit 7 because the push is sign
491 SYM_CODE_START(irq_entries_start)
492 vector=FIRST_EXTERNAL_VECTOR
494 .rept (FIRST_SYSTEM_VECTOR - FIRST_EXTERNAL_VECTOR)
495 UNWIND_HINT_IRET_REGS
497 jmp asm_common_interrupt
499 /* Ensure that the above is 8 bytes max */
504 SYM_CODE_END(irq_entries_start)
506 #ifdef CONFIG_X86_LOCAL_APIC
508 SYM_CODE_START(spurious_entries_start)
509 vector=FIRST_SYSTEM_VECTOR
511 .rept (NR_VECTORS - FIRST_SYSTEM_VECTOR)
512 UNWIND_HINT_IRET_REGS
514 jmp asm_spurious_interrupt
516 /* Ensure that the above is 8 bytes max */
521 SYM_CODE_END(spurious_entries_start)
524 #endif /* __ASSEMBLY__ */
527 * The actual entry points. Note that DECLARE_IDTENTRY*() serves two
529 * - provide the function declarations when included from C-Code
530 * - emit the ASM stubs when included from entry_32/64.S
532 * This avoids duplicate defines and ensures that everything is consistent.
536 * Dummy trap number so the low level ASM macro vector number checks do not
537 * match which results in emitting plain IDTENTRY stubs without bells and
540 #define X86_TRAP_OTHER 0xFFFF
542 /* Simple exception entry points. No hardware error code */
543 DECLARE_IDTENTRY(X86_TRAP_DE, exc_divide_error);
544 DECLARE_IDTENTRY(X86_TRAP_OF, exc_overflow);
545 DECLARE_IDTENTRY(X86_TRAP_BR, exc_bounds);
546 DECLARE_IDTENTRY(X86_TRAP_NM, exc_device_not_available);
547 DECLARE_IDTENTRY(X86_TRAP_OLD_MF, exc_coproc_segment_overrun);
548 DECLARE_IDTENTRY(X86_TRAP_SPURIOUS, exc_spurious_interrupt_bug);
549 DECLARE_IDTENTRY(X86_TRAP_MF, exc_coprocessor_error);
550 DECLARE_IDTENTRY(X86_TRAP_XF, exc_simd_coprocessor_error);
552 /* 32bit software IRET trap. Do not emit ASM code */
553 DECLARE_IDTENTRY_SW(X86_TRAP_IRET, iret_error);
555 /* Simple exception entries with error code pushed by hardware */
556 DECLARE_IDTENTRY_ERRORCODE(X86_TRAP_TS, exc_invalid_tss);
557 DECLARE_IDTENTRY_ERRORCODE(X86_TRAP_NP, exc_segment_not_present);
558 DECLARE_IDTENTRY_ERRORCODE(X86_TRAP_SS, exc_stack_segment);
559 DECLARE_IDTENTRY_ERRORCODE(X86_TRAP_GP, exc_general_protection);
560 DECLARE_IDTENTRY_ERRORCODE(X86_TRAP_AC, exc_alignment_check);
562 /* Raw exception entries which need extra work */
563 DECLARE_IDTENTRY_RAW(X86_TRAP_UD, exc_invalid_op);
564 DECLARE_IDTENTRY_RAW(X86_TRAP_BP, exc_int3);
565 DECLARE_IDTENTRY_RAW_ERRORCODE(X86_TRAP_PF, exc_page_fault);
567 #ifdef CONFIG_X86_MCE
568 DECLARE_IDTENTRY_MCE(X86_TRAP_MC, exc_machine_check);
572 DECLARE_IDTENTRY_NMI(X86_TRAP_NMI, exc_nmi);
573 DECLARE_IDTENTRY_XEN(X86_TRAP_NMI, nmi);
576 DECLARE_IDTENTRY_DEBUG(X86_TRAP_DB, exc_debug);
577 DECLARE_IDTENTRY_XEN(X86_TRAP_DB, debug);
580 DECLARE_IDTENTRY_DF(X86_TRAP_DF, exc_double_fault);
583 DECLARE_IDTENTRY_XENCB(X86_TRAP_OTHER, exc_xen_hypervisor_callback);
586 /* Device interrupts common/spurious */
587 DECLARE_IDTENTRY_IRQ(X86_TRAP_OTHER, common_interrupt);
588 #ifdef CONFIG_X86_LOCAL_APIC
589 DECLARE_IDTENTRY_IRQ(X86_TRAP_OTHER, spurious_interrupt);
592 /* System vector entry points */
593 #ifdef CONFIG_X86_LOCAL_APIC
594 DECLARE_IDTENTRY_SYSVEC(ERROR_APIC_VECTOR, sysvec_error_interrupt);
595 DECLARE_IDTENTRY_SYSVEC(SPURIOUS_APIC_VECTOR, sysvec_spurious_apic_interrupt);
596 DECLARE_IDTENTRY_SYSVEC(LOCAL_TIMER_VECTOR, sysvec_apic_timer_interrupt);
597 DECLARE_IDTENTRY_SYSVEC(X86_PLATFORM_IPI_VECTOR, sysvec_x86_platform_ipi);
601 DECLARE_IDTENTRY(RESCHEDULE_VECTOR, sysvec_reschedule_ipi);
602 DECLARE_IDTENTRY_SYSVEC(IRQ_MOVE_CLEANUP_VECTOR, sysvec_irq_move_cleanup);
603 DECLARE_IDTENTRY_SYSVEC(REBOOT_VECTOR, sysvec_reboot);
604 DECLARE_IDTENTRY_SYSVEC(CALL_FUNCTION_SINGLE_VECTOR, sysvec_call_function_single);
605 DECLARE_IDTENTRY_SYSVEC(CALL_FUNCTION_VECTOR, sysvec_call_function);
608 #ifdef CONFIG_X86_LOCAL_APIC
609 # ifdef CONFIG_X86_UV
610 DECLARE_IDTENTRY_SYSVEC(UV_BAU_MESSAGE, sysvec_uv_bau_message);
613 # ifdef CONFIG_X86_MCE_THRESHOLD
614 DECLARE_IDTENTRY_SYSVEC(THRESHOLD_APIC_VECTOR, sysvec_threshold);
617 # ifdef CONFIG_X86_MCE_AMD
618 DECLARE_IDTENTRY_SYSVEC(DEFERRED_ERROR_VECTOR, sysvec_deferred_error);
621 # ifdef CONFIG_X86_THERMAL_VECTOR
622 DECLARE_IDTENTRY_SYSVEC(THERMAL_APIC_VECTOR, sysvec_thermal);
625 # ifdef CONFIG_IRQ_WORK
626 DECLARE_IDTENTRY_SYSVEC(IRQ_WORK_VECTOR, sysvec_irq_work);
630 #ifdef CONFIG_HAVE_KVM
631 DECLARE_IDTENTRY_SYSVEC(POSTED_INTR_VECTOR, sysvec_kvm_posted_intr_ipi);
632 DECLARE_IDTENTRY_SYSVEC(POSTED_INTR_WAKEUP_VECTOR, sysvec_kvm_posted_intr_wakeup_ipi);
633 DECLARE_IDTENTRY_SYSVEC(POSTED_INTR_NESTED_VECTOR, sysvec_kvm_posted_intr_nested_ipi);
636 #if IS_ENABLED(CONFIG_HYPERV)
637 DECLARE_IDTENTRY_SYSVEC(HYPERVISOR_CALLBACK_VECTOR, sysvec_hyperv_callback);
638 DECLARE_IDTENTRY_SYSVEC(HYPERVISOR_REENLIGHTENMENT_VECTOR, sysvec_hyperv_reenlightenment);
639 DECLARE_IDTENTRY_SYSVEC(HYPERVISOR_STIMER0_VECTOR, sysvec_hyperv_stimer0);
642 #if IS_ENABLED(CONFIG_ACRN_GUEST)
643 DECLARE_IDTENTRY_SYSVEC(HYPERVISOR_CALLBACK_VECTOR, sysvec_acrn_hv_callback);
646 #ifdef CONFIG_XEN_PVHVM
647 DECLARE_IDTENTRY_SYSVEC(HYPERVISOR_CALLBACK_VECTOR, sysvec_xen_hvm_callback);
650 #ifdef CONFIG_KVM_GUEST
651 DECLARE_IDTENTRY_SYSVEC(HYPERVISOR_CALLBACK_VECTOR, sysvec_kvm_asyncpf_interrupt);
654 #undef X86_TRAP_OTHER