[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[PATCH v9 25/36] x86/traps: Add a system interrupt handler table for system interrupt dispatch



From: "H. Peter Anvin (Intel)" <hpa@xxxxxxxxx>

On x86, external interrupts can be categorized into two groups:
  1) System interrupts
  2) External device interrupts

All external device interrupts are directed to the common_interrupt(),
which, in turn, dispatches these external device interrupts using a
per-CPU external device interrupt dispatch table vector_irq.

To handle system interrupts, a system interrupt handler table needs to
be introduced. This table enables the direct dispatching of a system
interrupt to its corresponding handler. As a result, a software-based
dispatch function will be implemented as:

  void external_interrupt(struct pt_regs *regs)
  {
    u8 vector = regs->vector;
    if (is_system_interrupt(vector))
      system_interrupt_handlers[vector_to_sysvec(vector)](regs);
    else /* external device interrupt */
      common_interrupt(regs);
  }

Signed-off-by: H. Peter Anvin (Intel) <hpa@xxxxxxxxx>
Co-developed-by: Xin Li <xin3.li@xxxxxxxxx>
Tested-by: Shan Kang <shan.kang@xxxxxxxxx>
Signed-off-by: Xin Li <xin3.li@xxxxxxxxx>
---

Changes since v8:
* Remove junk code that assumes no local APIC on x86_64 (Thomas Gleixner).

Changes since v5:
* Initialize system_interrupt_handlers with dispatch_table_spurious_interrupt()
  instead of NULL to get rid of any NULL check (Peter Zijlstra).
---
 arch/x86/kernel/traps.c | 50 +++++++++++++++++++++++++++++++++++++++++
 1 file changed, 50 insertions(+)

diff --git a/arch/x86/kernel/traps.c b/arch/x86/kernel/traps.c
index 49dd92458eb0..e430a8c47931 100644
--- a/arch/x86/kernel/traps.c
+++ b/arch/x86/kernel/traps.c
@@ -1488,6 +1488,56 @@ DEFINE_IDTENTRY_SW(iret_error)
 }
 #endif
 
+#ifdef CONFIG_X86_64
+
+static void dispatch_table_spurious_interrupt(struct pt_regs *regs)
+{
+       dispatch_spurious_interrupt(regs, regs->vector);
+}
+
+#define SYSV(x,y) [(x) - FIRST_SYSTEM_VECTOR] = y
+
+static system_interrupt_handler system_interrupt_handlers[NR_SYSTEM_VECTORS] = 
{
+       [0 ... NR_SYSTEM_VECTORS-1]             = 
dispatch_table_spurious_interrupt,
+#ifdef CONFIG_SMP
+       SYSV(RESCHEDULE_VECTOR,                 
dispatch_table_sysvec_reschedule_ipi),
+       SYSV(CALL_FUNCTION_VECTOR,              
dispatch_table_sysvec_call_function),
+       SYSV(CALL_FUNCTION_SINGLE_VECTOR,       
dispatch_table_sysvec_call_function_single),
+       SYSV(REBOOT_VECTOR,                     dispatch_table_sysvec_reboot),
+#endif
+
+#ifdef CONFIG_X86_THERMAL_VECTOR
+       SYSV(THERMAL_APIC_VECTOR,               dispatch_table_sysvec_thermal),
+#endif
+
+#ifdef CONFIG_X86_MCE_THRESHOLD
+       SYSV(THRESHOLD_APIC_VECTOR,             
dispatch_table_sysvec_threshold),
+#endif
+
+#ifdef CONFIG_X86_MCE_AMD
+       SYSV(DEFERRED_ERROR_VECTOR,             
dispatch_table_sysvec_deferred_error),
+#endif
+
+#ifdef CONFIG_X86_LOCAL_APIC
+       SYSV(LOCAL_TIMER_VECTOR,                
dispatch_table_sysvec_apic_timer_interrupt),
+       SYSV(X86_PLATFORM_IPI_VECTOR,           
dispatch_table_sysvec_x86_platform_ipi),
+# ifdef CONFIG_HAVE_KVM
+       SYSV(POSTED_INTR_VECTOR,                
dispatch_table_sysvec_kvm_posted_intr_ipi),
+       SYSV(POSTED_INTR_WAKEUP_VECTOR,         
dispatch_table_sysvec_kvm_posted_intr_wakeup_ipi),
+       SYSV(POSTED_INTR_NESTED_VECTOR,         
dispatch_table_sysvec_kvm_posted_intr_nested_ipi),
+# endif
+# ifdef CONFIG_IRQ_WORK
+       SYSV(IRQ_WORK_VECTOR,                   dispatch_table_sysvec_irq_work),
+# endif
+       SYSV(SPURIOUS_APIC_VECTOR,              
dispatch_table_sysvec_spurious_apic_interrupt),
+       SYSV(ERROR_APIC_VECTOR,                 
dispatch_table_sysvec_error_interrupt),
+#endif
+};
+
+#undef SYSV
+
+#endif /* CONFIG_X86_64 */
+
 void __init trap_init(void)
 {
        /* Init cpu_entry_area before IST entries are set up */
-- 
2.34.1




 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.