hc
2024-11-01 2f529f9b558ca1c1bd74be7437a84e4711743404
kernel/arch/x86/include/asm/idtentry.h
....@@ -174,6 +174,56 @@
174174 #define DECLARE_IDTENTRY_IRQ(vector, func) \
175175 DECLARE_IDTENTRY_ERRORCODE(vector, func)
176176
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
+
177227 /**
178228 * DEFINE_IDTENTRY_IRQ - Emit code for device interrupt IDT entry points
179229 * @func: Function name of the entry point
....@@ -204,6 +254,8 @@
204254 } \
205255 \
206256 static __always_inline void __##func(struct pt_regs *regs, u8 vector)
257
+
258
+#endif /* !CONFIG_IRQ_PIPELINE */
207259
208260 /**
209261 * DECLARE_IDTENTRY_SYSVEC - Declare functions for system vector entry points
....@@ -450,6 +502,9 @@
450502 #define DECLARE_IDTENTRY_SYSVEC(vector, func) \
451503 idtentry_sysvec vector func
452504
505
+#define DECLARE_IDTENTRY_SYSVEC_PIPELINED(vector, func) \
506
+ DECLARE_IDTENTRY_SYSVEC(vector, func)
507
+
453508 #ifdef CONFIG_X86_64
454509 # define DECLARE_IDTENTRY_MCE(vector, func) \
455510 idtentry_mce_db vector asm_##func func
....@@ -632,21 +687,25 @@
632687 #ifdef CONFIG_X86_LOCAL_APIC
633688 DECLARE_IDTENTRY_SYSVEC(ERROR_APIC_VECTOR, sysvec_error_interrupt);
634689 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);
637692 #endif
638693
639694 #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
645704 #endif
646705
647706 #ifdef CONFIG_X86_LOCAL_APIC
648707 # ifdef CONFIG_X86_MCE_THRESHOLD
649
-DECLARE_IDTENTRY_SYSVEC(THRESHOLD_APIC_VECTOR, sysvec_threshold);
708
+DECLARE_IDTENTRY_SYSVEC(THRESHOLD_APIC_VECTOR, sysvec_threshold);
650709 # endif
651710
652711 # ifdef CONFIG_X86_MCE_AMD
....@@ -658,28 +717,28 @@
658717 # endif
659718
660719 # 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);
662721 # endif
663722 #endif
664723
665724 #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);
669728 #endif
670729
671730 #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);
675734 #endif
676735
677736 #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);
679738 #endif
680739
681740 #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);
683742 #endif
684743
685744 #ifdef CONFIG_KVM_GUEST