.. | .. |
---|
174 | 174 | #define DECLARE_IDTENTRY_IRQ(vector, func) \ |
---|
175 | 175 | DECLARE_IDTENTRY_ERRORCODE(vector, func) |
---|
176 | 176 | |
---|
| 177 | +#ifdef CONFIG_IRQ_PIPELINE |
---|
| 178 | + |
---|
| 179 | +struct irq_stage_data; |
---|
| 180 | + |
---|
| 181 | +struct irq_stage_data * |
---|
| 182 | +handle_irq_pipelined_prepare(struct pt_regs *regs); |
---|
| 183 | + |
---|
| 184 | +int handle_irq_pipelined_finish(struct irq_stage_data *prevd, |
---|
| 185 | + struct pt_regs *regs);; |
---|
| 186 | + |
---|
| 187 | +void arch_pipeline_entry(struct pt_regs *regs, u8 vector); |
---|
| 188 | + |
---|
| 189 | +#define DECLARE_IDTENTRY_SYSVEC_PIPELINED(vector, func) \ |
---|
| 190 | + DECLARE_IDTENTRY_SYSVEC(vector, func); \ |
---|
| 191 | + __visible void __##func(struct pt_regs *regs) |
---|
| 192 | + |
---|
| 193 | +#define DEFINE_IDTENTRY_IRQ_PIPELINED(func) \ |
---|
| 194 | +__visible noinstr void func(struct pt_regs *regs, \ |
---|
| 195 | + unsigned long error_code) \ |
---|
| 196 | +{ \ |
---|
| 197 | + arch_pipeline_entry(regs, (u8)error_code); \ |
---|
| 198 | +} \ |
---|
| 199 | +static __always_inline void __##func(struct pt_regs *regs, u8 vector) |
---|
| 200 | + |
---|
| 201 | +/* |
---|
| 202 | + * In a pipelined model, the actual sysvec __handler() is directly |
---|
| 203 | + * instrumentable, just like it is in fact in the non-pipelined |
---|
| 204 | + * model. The indirect call via run_on_irqstack_cond() in |
---|
| 205 | + * DEFINE_IDTENTRY_SYSVEC() happens to hide the noinstr dependency |
---|
| 206 | + * from objtool in the latter case. |
---|
| 207 | + */ |
---|
| 208 | +#define DEFINE_IDTENTRY_SYSVEC_PIPELINED(vector, func) \ |
---|
| 209 | +__visible noinstr void func(struct pt_regs *regs) \ |
---|
| 210 | +{ \ |
---|
| 211 | + arch_pipeline_entry(regs, vector); \ |
---|
| 212 | +} \ |
---|
| 213 | + \ |
---|
| 214 | +__visible void __##func(struct pt_regs *regs) |
---|
| 215 | + |
---|
| 216 | +#define DEFINE_IDTENTRY_SYSVEC_SIMPLE_PIPELINED(vector, func) \ |
---|
| 217 | + DEFINE_IDTENTRY_SYSVEC_PIPELINED(vector, func) |
---|
| 218 | + |
---|
| 219 | +#else /* !CONFIG_IRQ_PIPELINE */ |
---|
| 220 | + |
---|
| 221 | +#define DECLARE_IDTENTRY_SYSVEC_PIPELINED(vector, func) DECLARE_IDTENTRY_SYSVEC(vector, func) |
---|
| 222 | + |
---|
| 223 | +#define DEFINE_IDTENTRY_IRQ_PIPELINED(func) DEFINE_IDTENTRY_IRQ(func) |
---|
| 224 | +#define DEFINE_IDTENTRY_SYSVEC_PIPELINED(vector, func) DEFINE_IDTENTRY_SYSVEC(func) |
---|
| 225 | +#define DEFINE_IDTENTRY_SYSVEC_SIMPLE_PIPELINED(vector, func) DEFINE_IDTENTRY_SYSVEC_SIMPLE(func) |
---|
| 226 | + |
---|
177 | 227 | /** |
---|
178 | 228 | * DEFINE_IDTENTRY_IRQ - Emit code for device interrupt IDT entry points |
---|
179 | 229 | * @func: Function name of the entry point |
---|
.. | .. |
---|
204 | 254 | } \ |
---|
205 | 255 | \ |
---|
206 | 256 | static __always_inline void __##func(struct pt_regs *regs, u8 vector) |
---|
| 257 | + |
---|
| 258 | +#endif /* !CONFIG_IRQ_PIPELINE */ |
---|
207 | 259 | |
---|
208 | 260 | /** |
---|
209 | 261 | * DECLARE_IDTENTRY_SYSVEC - Declare functions for system vector entry points |
---|
.. | .. |
---|
450 | 502 | #define DECLARE_IDTENTRY_SYSVEC(vector, func) \ |
---|
451 | 503 | idtentry_sysvec vector func |
---|
452 | 504 | |
---|
| 505 | +#define DECLARE_IDTENTRY_SYSVEC_PIPELINED(vector, func) \ |
---|
| 506 | + DECLARE_IDTENTRY_SYSVEC(vector, func) |
---|
| 507 | + |
---|
453 | 508 | #ifdef CONFIG_X86_64 |
---|
454 | 509 | # define DECLARE_IDTENTRY_MCE(vector, func) \ |
---|
455 | 510 | idtentry_mce_db vector asm_##func func |
---|
.. | .. |
---|
632 | 687 | #ifdef CONFIG_X86_LOCAL_APIC |
---|
633 | 688 | DECLARE_IDTENTRY_SYSVEC(ERROR_APIC_VECTOR, sysvec_error_interrupt); |
---|
634 | 689 | DECLARE_IDTENTRY_SYSVEC(SPURIOUS_APIC_VECTOR, sysvec_spurious_apic_interrupt); |
---|
635 | | -DECLARE_IDTENTRY_SYSVEC(LOCAL_TIMER_VECTOR, sysvec_apic_timer_interrupt); |
---|
636 | | -DECLARE_IDTENTRY_SYSVEC(X86_PLATFORM_IPI_VECTOR, sysvec_x86_platform_ipi); |
---|
| 690 | +DECLARE_IDTENTRY_SYSVEC_PIPELINED(LOCAL_TIMER_VECTOR, sysvec_apic_timer_interrupt); |
---|
| 691 | +DECLARE_IDTENTRY_SYSVEC_PIPELINED(X86_PLATFORM_IPI_VECTOR, sysvec_x86_platform_ipi); |
---|
637 | 692 | #endif |
---|
638 | 693 | |
---|
639 | 694 | #ifdef CONFIG_SMP |
---|
640 | | -DECLARE_IDTENTRY(RESCHEDULE_VECTOR, sysvec_reschedule_ipi); |
---|
641 | | -DECLARE_IDTENTRY_SYSVEC(IRQ_MOVE_CLEANUP_VECTOR, sysvec_irq_move_cleanup); |
---|
642 | | -DECLARE_IDTENTRY_SYSVEC(REBOOT_VECTOR, sysvec_reboot); |
---|
643 | | -DECLARE_IDTENTRY_SYSVEC(CALL_FUNCTION_SINGLE_VECTOR, sysvec_call_function_single); |
---|
644 | | -DECLARE_IDTENTRY_SYSVEC(CALL_FUNCTION_VECTOR, sysvec_call_function); |
---|
| 695 | +DECLARE_IDTENTRY_SYSVEC_PIPELINED(RESCHEDULE_VECTOR, sysvec_reschedule_ipi); |
---|
| 696 | +DECLARE_IDTENTRY_SYSVEC_PIPELINED(IRQ_MOVE_CLEANUP_VECTOR, sysvec_irq_move_cleanup); |
---|
| 697 | +DECLARE_IDTENTRY_SYSVEC_PIPELINED(REBOOT_VECTOR, sysvec_reboot); |
---|
| 698 | +DECLARE_IDTENTRY_SYSVEC_PIPELINED(CALL_FUNCTION_SINGLE_VECTOR, sysvec_call_function_single); |
---|
| 699 | +DECLARE_IDTENTRY_SYSVEC_PIPELINED(CALL_FUNCTION_VECTOR, sysvec_call_function); |
---|
| 700 | +#ifdef CONFIG_IRQ_PIPELINE |
---|
| 701 | +DECLARE_IDTENTRY_SYSVEC(RESCHEDULE_OOB_VECTOR, sysvec_reschedule_oob_ipi); |
---|
| 702 | +DECLARE_IDTENTRY_SYSVEC(TIMER_OOB_VECTOR, sysvec_timer_oob_ipi); |
---|
| 703 | +#endif |
---|
645 | 704 | #endif |
---|
646 | 705 | |
---|
647 | 706 | #ifdef CONFIG_X86_LOCAL_APIC |
---|
648 | 707 | # ifdef CONFIG_X86_MCE_THRESHOLD |
---|
649 | | -DECLARE_IDTENTRY_SYSVEC(THRESHOLD_APIC_VECTOR, sysvec_threshold); |
---|
| 708 | +DECLARE_IDTENTRY_SYSVEC(THRESHOLD_APIC_VECTOR, sysvec_threshold); |
---|
650 | 709 | # endif |
---|
651 | 710 | |
---|
652 | 711 | # ifdef CONFIG_X86_MCE_AMD |
---|
.. | .. |
---|
658 | 717 | # endif |
---|
659 | 718 | |
---|
660 | 719 | # ifdef CONFIG_IRQ_WORK |
---|
661 | | -DECLARE_IDTENTRY_SYSVEC(IRQ_WORK_VECTOR, sysvec_irq_work); |
---|
| 720 | +DECLARE_IDTENTRY_SYSVEC_PIPELINED(IRQ_WORK_VECTOR, sysvec_irq_work); |
---|
662 | 721 | # endif |
---|
663 | 722 | #endif |
---|
664 | 723 | |
---|
665 | 724 | #ifdef CONFIG_HAVE_KVM |
---|
666 | | -DECLARE_IDTENTRY_SYSVEC(POSTED_INTR_VECTOR, sysvec_kvm_posted_intr_ipi); |
---|
667 | | -DECLARE_IDTENTRY_SYSVEC(POSTED_INTR_WAKEUP_VECTOR, sysvec_kvm_posted_intr_wakeup_ipi); |
---|
668 | | -DECLARE_IDTENTRY_SYSVEC(POSTED_INTR_NESTED_VECTOR, sysvec_kvm_posted_intr_nested_ipi); |
---|
| 725 | +DECLARE_IDTENTRY_SYSVEC_PIPELINED(POSTED_INTR_VECTOR, sysvec_kvm_posted_intr_ipi); |
---|
| 726 | +DECLARE_IDTENTRY_SYSVEC_PIPELINED(POSTED_INTR_WAKEUP_VECTOR, sysvec_kvm_posted_intr_wakeup_ipi); |
---|
| 727 | +DECLARE_IDTENTRY_SYSVEC_PIPELINED(POSTED_INTR_NESTED_VECTOR, sysvec_kvm_posted_intr_nested_ipi); |
---|
669 | 728 | #endif |
---|
670 | 729 | |
---|
671 | 730 | #if IS_ENABLED(CONFIG_HYPERV) |
---|
672 | | -DECLARE_IDTENTRY_SYSVEC(HYPERVISOR_CALLBACK_VECTOR, sysvec_hyperv_callback); |
---|
673 | | -DECLARE_IDTENTRY_SYSVEC(HYPERV_REENLIGHTENMENT_VECTOR, sysvec_hyperv_reenlightenment); |
---|
674 | | -DECLARE_IDTENTRY_SYSVEC(HYPERV_STIMER0_VECTOR, sysvec_hyperv_stimer0); |
---|
| 731 | +DECLARE_IDTENTRY_SYSVEC_PIPELINED(HYPERVISOR_CALLBACK_VECTOR, sysvec_hyperv_callback); |
---|
| 732 | +DECLARE_IDTENTRY_SYSVEC_PIPELINED(HYPERV_REENLIGHTENMENT_VECTOR, sysvec_hyperv_reenlightenment); |
---|
| 733 | +DECLARE_IDTENTRY_SYSVEC_PIPELINED(HYPERV_STIMER0_VECTOR, sysvec_hyperv_stimer0); |
---|
675 | 734 | #endif |
---|
676 | 735 | |
---|
677 | 736 | #if IS_ENABLED(CONFIG_ACRN_GUEST) |
---|
678 | | -DECLARE_IDTENTRY_SYSVEC(HYPERVISOR_CALLBACK_VECTOR, sysvec_acrn_hv_callback); |
---|
| 737 | +DECLARE_IDTENTRY_SYSVEC_PIPELINED(HYPERVISOR_CALLBACK_VECTOR, sysvec_acrn_hv_callback); |
---|
679 | 738 | #endif |
---|
680 | 739 | |
---|
681 | 740 | #ifdef CONFIG_XEN_PVHVM |
---|
682 | | -DECLARE_IDTENTRY_SYSVEC(HYPERVISOR_CALLBACK_VECTOR, sysvec_xen_hvm_callback); |
---|
| 741 | +DECLARE_IDTENTRY_SYSVEC_PIPELINED(HYPERVISOR_CALLBACK_VECTOR, sysvec_xen_hvm_callback); |
---|
683 | 742 | #endif |
---|
684 | 743 | |
---|
685 | 744 | #ifdef CONFIG_KVM_GUEST |
---|